使用openCV haarcascade_frontalfacedetection面部检测面部的不同大小

时间:2017-03-29 08:26:42

标签: opencv face-detection

我正试图为我找出最好的面部检测算法。我已经尝试过不同的方法,但检测效果不好。我使用的是openCV haarcascase(尝试不同类型)

我的问题是:我如何设置面部检测的大小,以便检测大面孔(关闭人物)以及使用相同代码的小面孔(缩小)。

当我使用以下命令时,即使图像中没有面部,我也会获得面部检测:

faceDetector.detectMultiScale(image, faceDetections, 1.1, 3, 0 | Objdetect.CASCADE_SCALE_IMAGE,
                new Size(**50,50**), new Size()); 

但是,如果我使用新尺寸( 200,200 ),例如我无法检测脸部“小”的照片中的脸部。

有没有人知道如何在没有“发明”不存在的面孔的情况下对小脸和大脸进行检测?

1 个答案:

答案 0 :(得分:0)

detectMultiScale 函数具有参数min和max face size。在选择面部尺寸之前,不要忘记考虑图像尺寸。试试那样的smth

double max_face_size_percent = 1;
double min_face_size_percent = 0.15;

cv::Size min_face_size = cv::Size(grayImage.size().width * min_face_size_percent,grayImage.size().height * min_face_size_percent);
cv::Size max_face_size = cv::Size(grayImage.size().width * max_face_size_percent, grayImage.size().height * max_face_size_percent);

detector.detectMultiScale(grayImage, detected_faces, (double) scale_factor, 3, 0, min_face_size, max_face_size);

您可以使用此代码

选择之后找到的最大面孔
    double best_face_metric = 0;
    std::vector<cv::Rect>::iterator bestFaceIterator = detected_faces.begin();

    for (std::vector<cv::Rect>::iterator it = detected_faces.begin(); it != detected_faces.end(); ++it) {
        double curr_face_metric = it->width + it->height;
        if (curr_face_metric > best_face_metric) {
            best_face_metric = curr_face_metric;
            bestFaceIterator = it;
        }
    }

    cv::Rect_<double> bestFace(bestFaceIterator->x, bestFaceIterator->y, bestFaceIterator->width,
                               bestFaceIterator->height);

或者实施任何类型的解决方案,自己选择正确的面孔