OpenCV detectMultiScale()参数的建议值

时间:2013-12-27 12:48:21

标签: c++ opencv cascade-classifier

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() )

3 个答案:

答案 0 :(得分:126)

在这些参数中,您需要更加关注其中的四个:

  • scaleFactor - 参数指定每个图像比例下图像尺寸减少的程度。

    基本上,比例因子用于创建比例金字塔。可以找到更多解释here。简而言之,正如here所述,您的模型在训练期间定义了固定大小,在xml中可见。这意味着如果存在,则在图像中检测到这种尺寸的面部。但是,通过重新缩放输入图像,您可以将较大的面调整为较小的面,使其可被算法检测到。

    1.05 是一个很好的可能值,这意味着您只需要一小步调整大小,即将大小缩小5%,就可以增加匹配大小的机会找到检测模型。这也意味着算法运行得更慢,因为它更彻底。为了加快检测速度,您可以将其增加到1.4,并且可能会完全丢失一些面孔。

  • minNeighbors - 参数指定每个候选矩形应保留多少个邻居。

    此参数将影响检测到的面部的质量。值越高,检测越少,但质量越高。 3~6 是一个很好的价值。

  • minSize - 最小可能的对象大小。小于的对象将被忽略。

    此参数确定您要检测的小尺寸。你决定了!通常, [30, 30] 是人脸检测的良好开端。

  • maxSize - 最大可能的对象大小。大于此值的对象将被忽略。

    此参数确定您要检测的大小。再一次,你决定了! 通常情况下,您不需要手动设置,默认值假定您要检测没有脸部大小的上限。

答案 1 :(得分:-4)

如果您具有良好的CPU和RAM性能或更高,则可以进行设置 比例因子= 1 minNeighbors = 3

如果您正在像树莓这样的嵌入式系统中工作,我建议选择像smth一样 scaleFactor = 2,(值越高意味着精度越低) minNeighbors = 1,(值越高意味着精度越低但可靠性越高) 算法将运行得更快,否则如果CPU性能和RAM不够,它将会冻结。

希望有所帮助

答案 2 :(得分:-4)

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);