Haar Cascade分类器不会检测简单正面图片中的面部

时间:2015-06-09 00:52:20

标签: python opencv computer-vision

尝试使用Haar Cascade Classifier使用opencv + python进行一些简单的人脸检测。

以下代码可以完美地检测image1image2中的面孔,但无法在image3中检测到

请帮助我了解image3

中未检测到脸部的原因是什么
import numpy as np
import cv2

face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')

img = cv2.imread('/home/swiftguy/computer-vision/image3.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

faces = face_cascade.detectMultiScale(gray, 1.3, 3)
for (x,y,w,h) in faces:
    img2 = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
    roi_gray = gray[y:y+h, x:x+w]
    roi_color = img[y:y+h, x:x+w]
    eyes = eye_cascade.detectMultiScale(roi_gray)
    for (ex,ey,ew,eh) in eyes:
            cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2)

cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

2 个答案:

答案 0 :(得分:1)

haar级联工作在二元原理上,如果你通过documentation,它解释了人脸检测的整个过程,为了参考目的,我附上了样本图片,简要介绍。

enter image description here

enter image description here

从图像中可以看出,处理灰度图像以匹配预定义的图案,黑白框分别代表较暗和较亮像素的像素密度,因此该过程完全取决于亮度形成特定特征或图案的像素。

要确定是否应将像素视为黑色或白色,则设置阈值。现在考虑第二个快照中的右下角图像,它使用了明显的事实,即眉毛比肤色更深,因此我们眼睛周围的区域可以简化为BWB(黑白黑),其中第一个B表示较暗的左眉毛像素,W代表眉毛之间的肤色,而最后的B代表右眉毛,但是有很多这样的haar功能。

现在来到您的图像,图像的亮度稍微高一些,并且突出的黑色功能也缺失,例如:眉毛,嘴唇等。所以有可能亮度应构成haar要素的像素值大于阈值,因此某些BWB要素可能看起来像WWW要素,因此无法满足给定图像中面部的标准。

答案 1 :(得分:0)

这主要是由于脸部的高亮度,以及儿童脸部(主要是鼻梁周围)缺乏尖锐的特征。面部检测前的直方图均衡可以提高像这样的图像的检测精度。

如果你的探测器需要在这些图像上运行良好,一种可能性就是用一组相似的图像训练分类器。