首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用opencv和raspberry摄像机模块进行人脸检测的最佳算法是什么?

使用opencv和raspberry摄像机模块进行人脸检测的最佳算法是什么?
EN

Stack Overflow用户
提问于 2015-07-01 12:28:03
回答 3查看 6.4K关注 0票数 3

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

Viola对象检测框架:该算法在OpenCV中实现为cvHaarDetectObjects()。框架 Local (LBP)是一种用于计算机视觉模式 3分类的特征。

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

更新:就我的情况而言,我需要在距离~ 2-5米的地方捕捉走在街上的人的脸,我用raspberry pi 2配opencv 3金色和raspicam-0.1.3 libarrry作为pi相机模块。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-07-08 17:57:24

在我的经验中,最好的一个是哈卡雷兹。我使用的文件是haarcascade_frontalface_alt2.xml。我对所有的haar文件做了很多测试,发现这个是最好的。

代码语言:javascript
运行
复制
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做这件事。首先,您需要设置一个范围,在我们的情况下,这个范围只允许皮肤颜色像素。

代码语言:javascript
运行
复制
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是一种皮肤面膜。所有白色像素都是皮肤,所有黑色像素都不是皮肤。然后,只需计算掩码中的白色像素数:

代码语言:javascript
运行
复制
int number_skin_pixels = cv::countNonZero(result_mask);

如果有许多皮肤像素,那么你可以假设有一张脸。如果没有,则会出现假阳性。

票数 4
EN

Stack Overflow用户

发布于 2015-07-07 04:57:28

如果你只需要一个人脸探测器,Viola物体探测器是快速和非常准确的.OpenCV中包含了用于眼睛检测的Haar级联分类器。

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

票数 3
EN

Stack Overflow用户

发布于 2022-10-28 06:29:47

OpenCV最近在其库中添加了YuNet人脸检测模型。

这是一个非常准确的模型,但仍然是轻量级的运行在CPU上的实时速度。

尤内演示

代码:

代码语言:javascript
运行
复制
# Initialize detector
detector = cv2.FaceDetectorYN.create("face_detection_yunet_2022mar.onnx", "", (320, 320))
# Read image
img = cv2.imread("image.jpg")
# Get image shape
img_W = int(img.shape[1])
img_H = int(img.shape[0])
# Set input size
detector.setInputSize((img_W, img_H))
# Getting detections
detections = detector.detect(img)

下面是其他流行的人脸检测算法的比较。

速度

速度比较

平均精度

AP比较

终极人脸检测指南 -对最先进的人脸检测算法进行了详细的解释和比较.

人脸检测指南视频

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31161341

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档