OpenCV detectMultiScale()参数的build议值
CascadeClassifier::detectMultiScale()
的推荐参数是什么,取决于哪些因素我应该改变默认参数?
void CascadeClassifier::detectMultiScale( const Mat& image, vector<Rect>& objects, double scaleFactor=1.1, int minNeighbors=3, int flags=0, Size minSize=Size(), Size maxSize=Size() )
在这些参数中,您需要更多地关注其中的四个参数:
-
scaleFactor
– 指定在每个图像比例缩小图像大小的参数。基本上这个比例因子被用来创build你的比例金字塔。 更多的解释可以在这里find。 简而言之,如此处所述,您的模型在训练期间具有固定的大小,这在
xml
是可见的。 这意味着如果存在,则在图像中检测到这个大小的脸部。 但是,通过重新调整input图像的大小,可以将较大的人脸调整为较小的人脸,从而使其可以被algorithm检测到。对于这个
1.05
是一个很好的可能值,这意味着你使用一个小的步骤来resize,即减less5%的大小,你增加了与检测模型匹配的大小的机会发现。 这也意味着该algorithm工作得更慢,因为它更彻底。 您可以将其增加到1.4以上,以便更快地发现问题,并且可能会丢失一些面孔。 -
minNeighbors
– 指定每个候选矩形必须保留多less个邻居的参数。该参数将影响检测到的脸部的质量。 更高的价值导致更less的检测,但质量更高。
3~6
是一个很好的价值。 -
minSize
– 最小可能的对象大小。 小于这个值的对象被忽略。这个参数决定你想要检测的尺寸。 你决定吧! 通常,
[30, 30]
对于人脸检测来说是一个好的开始。 -
maxSize
– 最大可能的对象大小。 大于这个的对象被忽略。这个参数决定你想要检测的大小。 再次,你决定! 通常情况下,您不需要手动设置 ,默认值假定您想要检测没有面部大小的上限。
cl_int err; cl_uint numPlatforms; err = clGetPlatformIDs(0, NULL, &numPlatforms); if (CL_SUCCESS == err) printf("\nDetected OpenCL platforms: %d", numPlatforms); else printf("\nError calling clGetPlatformIDs. Error code: %d", err); string str ="haarcascade_frontalface_alt2.xml"; ocl::OclCascadeClassifier fd; fd.load(str); ocl::oclMat frame, frameGray; Mat frameCpu; CvVideoCapture vcap = openVideo("0"); vcap.set(CV_CAP_PROP_FRAME_WIDTH,320); vcap.set(CV_CAP_PROP_FRAME_HEIGHT,240); static const cv::Size maxSize; for(;;){ // // processing loop vector<Rect> faces; vcap >> frameCpu; frame = frameCpu; ocl::cvtColor(frame, frameGray, CV_BGR2GRAY); //ocl::equalizeHist(frameGray, frameGray); //Mat mm(frameGray); //cvWaitKey(100); fd.detectMultiScale(frameGray,faces,1.05,3,0|CV_HAAR_FIND_BIGGEST_OBJECT ,minSize,maxSize); for(int i=0; i< faces.size() ; i++) { if(faces.size()) //circle(img, Point(palm[i].x+ palm[i].width/2,palm[i].y+palm[i].height/2),palm[i].width,Scalar(255,0,0), 2,8 ); cv::rectangle(frameCpu, faces[i],Scalar(255,0,0), 2,8 ); } imshow("fsfs",frameCpu); cvWaitKey(1);
如果你有一个好的CPU和RAM性能或更多,你可以设置scaleFactor = 1 minNeighbors = 3
如果你在一个embedded式系统里工作,我推荐你select像scaleFactor = 2这样的smth(更高的值意味着更低的精确度)minNeighbors = 1,(更高的值意味着更低的精度,但更多的可靠性)如果CPU性能和RAM不够,将会冻结。
希望能帮助到你