使用opencv检测没有眉毛和下巴的人脸
Posted
技术标签:
【中文标题】使用opencv检测没有眉毛和下巴的人脸【英文标题】:Detect faces without eyebrows and jaw using opencv 【发布时间】:2020-09-20 00:05:39 【问题描述】:我正在尝试使用 OpenCV haar 级联分类器检测人脸(特别是睁开眼睛的人脸)。但是,我在检测没有眉毛和/或下巴的面孔时遇到了问题,如下图所示。我曾尝试过许多用于人脸检测的 haar 级联,例如 haarcascade_frontalface_default.xml、haarcascade_frontalface_alt_tree.xml 等。但所有这些都不起作用。
这是我的代码:
import cv2
import os
import glob
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('haarcascade_eye_tree_eyeglasses.xml')
count = 0
path = "./test/*.png"
for index, filename in enumerate(glob.glob(path)):
img = cv2.imread(filename)
basename = os.path.splitext(os.path.basename(filename))[0]
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
for (x,y,w,h) in faces:
# 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)
if len(eyes) >= 2:
count = count + 1
output_dir = './test/output'
cv2.imwrite(f'output_dir/basename.png', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
提前谢谢你!
【问题讨论】:
【参考方案1】:用dlib
使用面部标志,这个方法可能对你有用,看这两个链接:
另外,请参阅此链接:
dlib-and-deep-learning【讨论】:
【参考方案2】:如果您安装了 tensorflow,则可以使用神经网络来检测人脸,这比简单的 haar 分类器准确度要高得多。
这是一个使用 MTCNN 检测器的示例,它使用 tensorflow 作为后端。
from mtcnn.mtcnn import MTCNN
from PIL import Image
import numpy as np
img = Image.open('6qNFu.png') # load the image
img = np.asarray(img, dtype='uint8') # convert to numpy array
img = img[:,:,0:3] # drop the alpha channel
detector = MTCNN() # initialize MTCNN detector
print(detector.detect_faces(img)) # use MTCNN detector to return bounding box and face metrics
使用边界框,您可以从图像中提取人脸。注意:如果面部像上面的例子一样被截断,它可能会返回一个负坐标,这是它认为面部可能在哪里的外推。
这是关于 MTCNN 库的文档:https://pypi.org/project/mtcnn/ 它还告诉您如何安装它。
【讨论】:
谢谢,这似乎比 haar 分类器效果更好,并且可以检测睁眼和闭眼。无论如何,由于我有很多图像,并且只想选择睁开眼睛的图像,我该如何实现呢?以上是关于使用opencv检测没有眉毛和下巴的人脸的主要内容,如果未能解决你的问题,请参考以下文章
使用matlab机器视觉工具箱实现人脸特征的检测和定位,识别并标注眉毛,眼睛,鼻子,嘴巴
OpenCV4.5.4 DNN人脸识别模块使用介绍--如何快速搭建一个人脸识别系统
opencv代码没有检测到人脸的数量也没有在人脸周围放一个圆圈
学习 opencv---(11)OpenC 边缘检测:Canny算子,Sobel算子,Laplace算子,Scharr滤波器