@@ -1281,6 +1281,8 @@ cvRunHaarClassifierCascade( const CvHaarClassifierCascade* _cascade,
1281
1281
namespace cv
1282
1282
{
1283
1283
1284
+ const size_t PARALLEL_LOOP_BATCH_SIZE = 100 ;
1285
+
1284
1286
class HaarDetectObjects_ScaleImage_Invoker : public ParallelLoopBody
1285
1287
{
1286
1288
public:
@@ -1319,6 +1321,10 @@ class HaarDetectObjects_ScaleImage_Invoker : public ParallelLoopBody
1319
1321
Size ssz (sum1.cols - 1 - winSize0.width , y2 - y1);
1320
1322
int x, y, ystep = factor > 2 ? 1 : 2 ;
1321
1323
1324
+ std::vector<Rect> vecLocal;
1325
+ std::vector<int > rejectLevelsLocal;
1326
+ std::vector<double > levelWeightsLocal;
1327
+
1322
1328
#ifdef HAVE_IPP
1323
1329
if (CV_IPP_CHECK_COND && cascade->hid_cascade ->ipp_stages )
1324
1330
{
@@ -1365,10 +1371,17 @@ class HaarDetectObjects_ScaleImage_Invoker : public ParallelLoopBody
1365
1371
for ( x = 0 ; x < ssz.width ; x += ystep )
1366
1372
if ( mask1row[x] != 0 )
1367
1373
{
1368
- mtx->lock ();
1369
- vec->push_back (Rect (cvRound (x*factor), cvRound (y*factor),
1370
- winSize.width , winSize.height ));
1371
- mtx->unlock ();
1374
+ vecLocal.push_back (Rect (cvRound (x*factor), cvRound (y*factor),
1375
+ winSize.width , winSize.height ));
1376
+
1377
+ if (vecLocal.size () >= PARALLEL_LOOP_BATCH_SIZE)
1378
+ {
1379
+ mtx->lock ();
1380
+ vec->insert (vec->end (), vecLocal.begin (), vecLocal.end ());
1381
+ mtx->unlock ();
1382
+
1383
+ vecLocal.clear ();
1384
+ }
1372
1385
if ( --positive == 0 )
1373
1386
break ;
1374
1387
}
@@ -1389,25 +1402,59 @@ class HaarDetectObjects_ScaleImage_Invoker : public ParallelLoopBody
1389
1402
result = -1 *cascade->count ;
1390
1403
if ( cascade->count + result < 4 )
1391
1404
{
1392
- mtx->lock ();
1393
- vec->push_back (Rect (cvRound (x*factor), cvRound (y*factor),
1394
- winSize.width , winSize.height ));
1395
- rejectLevels->push_back (-result);
1396
- levelWeights->push_back (gypWeight);
1397
- mtx->unlock ();
1405
+ vecLocal.push_back (Rect (cvRound (x*factor), cvRound (y*factor),
1406
+ winSize.width , winSize.height ));
1407
+ rejectLevelsLocal.push_back (-result);
1408
+ levelWeightsLocal.push_back (gypWeight);
1409
+
1410
+ if (vecLocal.size () >= PARALLEL_LOOP_BATCH_SIZE)
1411
+ {
1412
+ mtx->lock ();
1413
+ vec->insert (vec->end (), vecLocal.begin (), vecLocal.end ());
1414
+ rejectLevels->insert (rejectLevels->end (), rejectLevelsLocal.begin (), rejectLevelsLocal.end ());
1415
+ levelWeights->insert (levelWeights->end (), levelWeightsLocal.begin (), levelWeightsLocal.end ());
1416
+ mtx->unlock ();
1417
+
1418
+ vecLocal.clear ();
1419
+ rejectLevelsLocal.clear ();
1420
+ levelWeightsLocal.clear ();
1421
+ }
1398
1422
}
1399
1423
}
1400
1424
else
1401
1425
{
1402
1426
if ( result > 0 )
1403
1427
{
1404
- mtx->lock ();
1405
- vec->push_back (Rect (cvRound (x*factor), cvRound (y*factor),
1406
- winSize.width , winSize.height ));
1407
- mtx->unlock ();
1428
+ vecLocal.push_back (Rect (cvRound (x*factor), cvRound (y*factor),
1429
+ winSize.width , winSize.height ));
1430
+
1431
+ if (vecLocal.size () >= PARALLEL_LOOP_BATCH_SIZE)
1432
+ {
1433
+ mtx->lock ();
1434
+ vec->insert (vec->end (), vecLocal.begin (), vecLocal.end ());
1435
+ mtx->unlock ();
1436
+
1437
+ vecLocal.clear ();
1438
+ }
1408
1439
}
1409
1440
}
1410
1441
}
1442
+
1443
+ if (rejectLevelsLocal.size ())
1444
+ {
1445
+ mtx->lock ();
1446
+ vec->insert (vec->end (), vecLocal.begin (), vecLocal.end ());
1447
+ rejectLevels->insert (rejectLevels->end (), rejectLevelsLocal.begin (), rejectLevelsLocal.end ());
1448
+ levelWeights->insert (levelWeights->end (), levelWeightsLocal.begin (), levelWeightsLocal.end ());
1449
+ mtx->unlock ();
1450
+ }
1451
+ else
1452
+ if (vecLocal.size ())
1453
+ {
1454
+ mtx->lock ();
1455
+ vec->insert (vec->end (), vecLocal.begin (), vecLocal.end ());
1456
+ mtx->unlock ();
1457
+ }
1411
1458
}
1412
1459
1413
1460
const CvHaarClassifierCascade* cascade;
@@ -1450,6 +1497,8 @@ class HaarDetectObjects_ScaleCascade_Invoker : public ParallelLoopBody
1450
1497
bool doCannyPruning = p0 != 0 ;
1451
1498
int sstep = (int )(sumstep/sizeof (p0[0 ]));
1452
1499
1500
+ std::vector<Rect> vecLocal;
1501
+
1453
1502
for ( iy = startY; iy < endY; iy++ )
1454
1503
{
1455
1504
int ix, y = cvRound (iy*ystep), ixstep = 1 ;
@@ -1472,13 +1521,27 @@ class HaarDetectObjects_ScaleCascade_Invoker : public ParallelLoopBody
1472
1521
int result = cvRunHaarClassifierCascade ( cascade, cvPoint (x, y), 0 );
1473
1522
if ( result > 0 )
1474
1523
{
1475
- mtx->lock ();
1476
- vec->push_back (Rect (x, y, winsize.width , winsize.height ));
1477
- mtx->unlock ();
1524
+ vecLocal.push_back (Rect (x, y, winsize.width , winsize.height ));
1525
+
1526
+ if (vecLocal.size () >= PARALLEL_LOOP_BATCH_SIZE)
1527
+ {
1528
+ mtx->lock ();
1529
+ vec->insert (vec->end (), vecLocal.begin (), vecLocal.end ());
1530
+ mtx->unlock ();
1531
+
1532
+ vecLocal.clear ();
1533
+ }
1478
1534
}
1479
1535
ixstep = result != 0 ? 1 : 2 ;
1480
1536
}
1481
1537
}
1538
+
1539
+ if (vecLocal.size ())
1540
+ {
1541
+ mtx->lock ();
1542
+ vec->insert (vec->end (), vecLocal.begin (), vecLocal.end ());
1543
+ mtx->unlock ();
1544
+ }
1482
1545
}
1483
1546
1484
1547
const CvHaarClassifierCascade* cascade;
0 commit comments