使用opencv和覆盆子相机模块进行人脸检测的最佳算法是啥

Posted

技术标签:

【中文标题】使用opencv和覆盆子相机模块进行人脸检测的最佳算法是啥【英文标题】:What is the best algorithm for face detection using opencv and raspberry camera module使用opencv和覆盆子相机模块进行人脸检测的最佳算法是什么 【发布时间】:2015-09-18 14:40:47 【问题描述】:

我正在使用 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 with opencv 3 gold 和 raspicam-0.1.3 libarrry for the pi摄像头模组

【问题讨论】:

【参考方案1】:

如果您只需要人脸检测器,Viola-Jones 物体检测器既快速又非常准确。用于眼睛检测的 Haar 级联分类器包含在 OpenCV 中。

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

【讨论】:

【参考方案2】:

根据我的经验,最好的方法是 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 级联返回几个边界框(它们是候选框)。其中一些候选人将包含一张脸,而另一些则不包含。如果边界框的大部分像素都是绿色的,那么很可能没有人脸。您需要过滤肤色像素。您可以使用 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 是皮肤遮罩。白色的所有像素都是皮肤,黑色的所有像素都不是皮肤。那么你只需要统计掩码中白色像素的个数:

int number_skin_pixels = cv::countNonZero(result_mask);

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

【讨论】:

好的,谢谢,我已经尝试过了...您对如何优化 faceetct.cpp 中的代码有任何想法吗,因为有很多参数...我也用 lbpcascade_frontalface.xml 进行了测试.它提供了很好的检测......对于我的情况,我需要捕捉走在街上的人的脸 @user3530803 lpd 比 haar 更快,但准确度较低。我编辑了我的答案以添加一些您可能需要的示例 @user3530803 参数 scale_factor 和 min_neighbours 是提高准确率的关键。如果你在一个不杂乱的环境中寻找一张脸(比如一张只有一个人的照片),我提出的价值观非常有效。如果图像中有很多人或背景凌乱,则需要稍微更改这些值 @user3530803 如果您添加滤色器,它也可以很好地工作。 Haar 级联只考虑灰度图像,因此可能导致误报。如果您按颜色过滤候选人,您可能会拒绝那些不是肤色的候选人。 谢谢...我能做些什么过滤我听说过高斯方法是这样吗??

以上是关于使用opencv和覆盆子相机模块进行人脸检测的最佳算法是啥的主要内容,如果未能解决你的问题,请参考以下文章

Android中的人脸检测?

如何以及在何处使用带有 QT 的 basler 相机实现 opencv 人脸检测代码

使用树莓派、pi 相机、python 和 Open Cv 进行人脸识别

对于 OpenCV 人脸检测和识别,人脸是不是略微失真是不是重要?

#yyds干货盘点#Python图像处理,cv2模块,OpenCV实现人脸检测

基于OpenCV的图片和视频人脸识别