发布于 2015-07-08 17:57:24
在我的经验中,最好的一个是哈卡雷兹。我使用的文件是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);
如果有许多皮肤像素,那么你可以假设有一张脸。如果没有,则会出现假阳性。
发布于 2015-07-07 04:57:28
如果你只需要一个人脸探测器,Viola物体探测器是快速和非常准确的.OpenCV中包含了用于眼睛检测的Haar级联分类器。
LBP检测器也可以被训练来识别人脸,但是由于你没有使用识别的计划,所以你可以跳过它。
发布于 2022-10-28 06:29:47
OpenCV最近在其库中添加了YuNet人脸检测模型。
这是一个非常准确的模型,但仍然是轻量级的运行在CPU上的实时速度。
代码:
# 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)
下面是其他流行的人脸检测算法的比较。
速度
平均精度
终极人脸检测指南 -对最先进的人脸检测算法进行了详细的解释和比较.
https://stackoverflow.com/questions/31161341
复制相似问题