66

推荐的参数是什么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() )
4

3 回答 3

158

在这些参数中,需要特别注意其中的四个:

  • scaleFactor– 指定在每个图像比例下图像尺寸减小多少的参数。

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

    1.05是一个很好的可能值,这意味着您使用一小步来调整大小,即将大小减小 5%,您增加了找到与模型匹配大小以进行检测的机会。这也意味着该算法工作得更慢,因为它更彻底。您可以将其增加到 1.4 以加快检测速度,但可能会完全丢失一些面孔。

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

    该参数会影响检测到的人脸质量。更高的值导致更少的检测,但质量更高。3~6物有所值。

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

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

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

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

于 2013-12-27T17:36:09.327 回答
-6

如果您有良好的 CPU 和 RAM 性能或更多,您可以设置 scaleFactor=1 minNeighbors=3

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

希望能帮助到你

于 2015-07-26T11:25:36.213 回答
-7
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);
于 2017-01-09T08:11:59.150 回答