使用opencv和树莓相机模块进行人脸检测的最佳算法是什么

What is the best algorithm for face detection using opencv and raspberry camera module

我正在使用 opencv 进行人脸和眼睛检测(不需要识别),我发现了一些我可以使用的算法:

Viola–Jones 对象检测框架:该算法在 OpenCV 中作为 cvHaarDetectObjects() 实现。 https://en.wikipedia.org/wiki/Viola%E2%80%93Jones_object_detection_framework 局部二进制模式 (LBP) 是一种用于计算机视觉分类的特征 https://en.wikipedia.org/wiki/Local_binary_patterns 3.....

我只是一个新手,我想知道什么是最好的人脸算法(在速度、性能和精度方面),尤其是使用 opencv 的眼睛检测: ) 非常感谢

更新:对于我的情况,我需要从约 2-5 米的距离捕捉走在街上的人的脸,我使用 raspberry pi 2 和 opencv 3 gold 和 raspicam-0.1。 3 用于 pi 相机模块的库

如果您只需要面部检测器,Viola-Jones 对象检测器速度快且非常准确。用于眼睛检测的 Haar 级联分类器包含在 OpenCV 中。

也可以训练 LBP 检测器来识别人脸,但由于您没有使用识别的计划,因此可以跳过它。

根据我的经验,最好的是 Haarcascade。我使用的文件是haarcascade_frontalface_alt2.xml。我对所有 haar 文件做了很多测试,发现这个是最好的。

std::vector<Rect> faces;
Mat img_gray;
Mat img; //here you have to load the image

CascadeClassifier face_cascade;
face_cascade.load("haarcascade_frontalface_alt2.xml");

cvtColor( img, img_gray, CV_BGR2GRAY );
cv::equalizeHist( img_gray, img_gray );

int rect_size = 20;
float scale_factor = 1.05;
int min_neighbours = 1;
face_cascade.detectMultiScale( img_gray, faces, scale_factor, min_neighbours, 0|CV_HAAR_SCALE_IMAGE, Size(rect_size, rect_size) );

haar级联returns几个bounding box(它们都是候选)。其中一些候选人将包含一张脸,而另一些则没有。如果边界框的大部分像素都是绿色的,那么可能没有人脸。您需要过滤肤色像素。你可以用 HSV 做到这一点。首先你需要设置一个范围,在我们的例子中这个范围只允许肤色像素。

cv::Scalar  hsv_min = cv::Scalar(0, 30, 60);
cv::Scalar  hsv_max = cv::Scalar(20, 150, 255);
cvtColor(image, hsv_image, CV_BGR2HSV);
inRange (hsv_image, hsv_min, hsv_max, result_mask);

result_mask是皮肤面膜。所有白色像素都是皮肤,所有黑色像素都不是皮肤。那么你只需要统计mask中白色像素的个数:

int number_skin_pixels = cv::countNonZero(result_mask);

如果有很多皮肤像素,那么你可以假设有一张脸。如果不是,则存在误报