我正试图为我找出最好的面部检测算法。我已经尝试过不同的方法,但检测效果不好。我使用的是openCV haarcascase(尝试不同类型)
我的问题是:我如何设置面部检测的大小,以便检测大面孔(关闭人物)以及使用相同代码的小面孔(缩小)。
当我使用以下命令时,即使图像中没有面部,我也会获得面部检测:
faceDetector.detectMultiScale(image, faceDetections, 1.1, 3, 0 | Objdetect.CASCADE_SCALE_IMAGE,
new Size(**50,50**), new Size());
但是,如果我使用新尺寸( 200,200 ),例如我无法检测脸部“小”的照片中的脸部。
有没有人知道如何在没有“发明”不存在的面孔的情况下对小脸和大脸进行检测?
答案 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);
或者实施任何类型的解决方案,自己选择正确的面孔