使用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);
如果有很多皮肤像素,那么你可以假设有一张脸。如果不是,则存在误报
我正在使用 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);
如果有很多皮肤像素,那么你可以假设有一张脸。如果不是,则存在误报