@@ -931,6 +931,8 @@ cvRunHaarClassifierCascade( const CvHaarClassifierCascade* _cascade,
931
931
namespace cv
932
932
{
933
933
934
+ const size_t PARALLEL_LOOP_BATCH_SIZE = 100 ;
935
+
934
936
class HaarDetectObjects_ScaleImage_Invoker : public ParallelLoopBody
935
937
{
936
938
public:
@@ -969,6 +971,10 @@ class HaarDetectObjects_ScaleImage_Invoker : public ParallelLoopBody
969
971
Size ssz (sum1.cols - 1 - winSize0.width , y2 - y1);
970
972
int x, y, ystep = factor > 2 ? 1 : 2 ;
971
973
974
+ std::vector<Rect> vecLocal;
975
+ std::vector<int > rejectLevelsLocal;
976
+ std::vector<double > levelWeightsLocal;
977
+
972
978
#ifdef HAVE_IPP
973
979
if (CV_IPP_CHECK_COND && cascade->hid_cascade ->ipp_stages )
974
980
{
@@ -1015,10 +1021,17 @@ class HaarDetectObjects_ScaleImage_Invoker : public ParallelLoopBody
1015
1021
for ( x = 0 ; x < ssz.width ; x += ystep )
1016
1022
if ( mask1row[x] != 0 )
1017
1023
{
1018
- mtx->lock ();
1019
- vec->push_back (Rect (cvRound (x*factor), cvRound (y*factor),
1020
- winSize.width , winSize.height ));
1021
- mtx->unlock ();
1024
+ vecLocal.push_back (Rect (cvRound (x*factor), cvRound (y*factor),
1025
+ winSize.width , winSize.height ));
1026
+
1027
+ if (vecLocal.size () >= PARALLEL_LOOP_BATCH_SIZE)
1028
+ {
1029
+ mtx->lock ();
1030
+ vec->insert (vec->end (), vecLocal.begin (), vecLocal.end ());
1031
+ mtx->unlock ();
1032
+
1033
+ vecLocal.clear ();
1034
+ }
1022
1035
if ( --positive == 0 )
1023
1036
break ;
1024
1037
}
@@ -1039,25 +1052,59 @@ class HaarDetectObjects_ScaleImage_Invoker : public ParallelLoopBody
1039
1052
result = -1 *cascade->count ;
1040
1053
if ( cascade->count + result < 4 )
1041
1054
{
1042
- mtx->lock ();
1043
- vec->push_back (Rect (cvRound (x*factor), cvRound (y*factor),
1044
- winSize.width , winSize.height ));
1045
- rejectLevels->push_back (-result);
1046
- levelWeights->push_back (gypWeight);
1047
- mtx->unlock ();
1055
+ vecLocal.push_back (Rect (cvRound (x*factor), cvRound (y*factor),
1056
+ winSize.width , winSize.height ));
1057
+ rejectLevelsLocal.push_back (-result);
1058
+ levelWeightsLocal.push_back (gypWeight);
1059
+
1060
+ if (vecLocal.size () >= PARALLEL_LOOP_BATCH_SIZE)
1061
+ {
1062
+ mtx->lock ();
1063
+ vec->insert (vec->end (), vecLocal.begin (), vecLocal.end ());
1064
+ rejectLevels->insert (rejectLevels->end (), rejectLevelsLocal.begin (), rejectLevelsLocal.end ());
1065
+ levelWeights->insert (levelWeights->end (), levelWeightsLocal.begin (), levelWeightsLocal.end ());
1066
+ mtx->unlock ();
1067
+
1068
+ vecLocal.clear ();
1069
+ rejectLevelsLocal.clear ();
1070
+ levelWeightsLocal.clear ();
1071
+ }
1048
1072
}
1049
1073
}
1050
1074
else
1051
1075
{
1052
1076
if ( result > 0 )
1053
1077
{
1054
- mtx->lock ();
1055
- vec->push_back (Rect (cvRound (x*factor), cvRound (y*factor),
1056
- winSize.width , winSize.height ));
1057
- mtx->unlock ();
1078
+ vecLocal.push_back (Rect (cvRound (x*factor), cvRound (y*factor),
1079
+ winSize.width , winSize.height ));
1080
+
1081
+ if (vecLocal.size () >= PARALLEL_LOOP_BATCH_SIZE)
1082
+ {
1083
+ mtx->lock ();
1084
+ vec->insert (vec->end (), vecLocal.begin (), vecLocal.end ());
1085
+ mtx->unlock ();
1086
+
1087
+ vecLocal.clear ();
1088
+ }
1058
1089
}
1059
1090
}
1060
1091
}
1092
+
1093
+ if (rejectLevelsLocal.size ())
1094
+ {
1095
+ mtx->lock ();
1096
+ vec->insert (vec->end (), vecLocal.begin (), vecLocal.end ());
1097
+ rejectLevels->insert (rejectLevels->end (), rejectLevelsLocal.begin (), rejectLevelsLocal.end ());
1098
+ levelWeights->insert (levelWeights->end (), levelWeightsLocal.begin (), levelWeightsLocal.end ());
1099
+ mtx->unlock ();
1100
+ }
1101
+ else
1102
+ if (vecLocal.size ())
1103
+ {
1104
+ mtx->lock ();
1105
+ vec->insert (vec->end (), vecLocal.begin (), vecLocal.end ());
1106
+ mtx->unlock ();
1107
+ }
1061
1108
}
1062
1109
1063
1110
const CvHaarClassifierCascade* cascade;
@@ -1100,6 +1147,8 @@ class HaarDetectObjects_ScaleCascade_Invoker : public ParallelLoopBody
1100
1147
bool doCannyPruning = p0 != 0 ;
1101
1148
int sstep = (int )(sumstep/sizeof (p0[0 ]));
1102
1149
1150
+ std::vector<Rect> vecLocal;
1151
+
1103
1152
for ( iy = startY; iy < endY; iy++ )
1104
1153
{
1105
1154
int ix, y = cvRound (iy*ystep), ixstep = 1 ;
@@ -1122,13 +1171,27 @@ class HaarDetectObjects_ScaleCascade_Invoker : public ParallelLoopBody
1122
1171
int result = cvRunHaarClassifierCascade ( cascade, cvPoint (x, y), 0 );
1123
1172
if ( result > 0 )
1124
1173
{
1125
- mtx->lock ();
1126
- vec->push_back (Rect (x, y, winsize.width , winsize.height ));
1127
- mtx->unlock ();
1174
+ vecLocal.push_back (Rect (x, y, winsize.width , winsize.height ));
1175
+
1176
+ if (vecLocal.size () >= PARALLEL_LOOP_BATCH_SIZE)
1177
+ {
1178
+ mtx->lock ();
1179
+ vec->insert (vec->end (), vecLocal.begin (), vecLocal.end ());
1180
+ mtx->unlock ();
1181
+
1182
+ vecLocal.clear ();
1183
+ }
1128
1184
}
1129
1185
ixstep = result != 0 ? 1 : 2 ;
1130
1186
}
1131
1187
}
1188
+
1189
+ if (vecLocal.size ())
1190
+ {
1191
+ mtx->lock ();
1192
+ vec->insert (vec->end (), vecLocal.begin (), vecLocal.end ());
1193
+ mtx->unlock ();
1194
+ }
1132
1195
}
1133
1196
1134
1197
const CvHaarClassifierCascade* cascade;
0 commit comments