利用OpenCV实现视频人脸检测,包含眼部检测。首先,将人脸检测和眼部检测需要的模型文件haarcascade_eye.xml和haarcascade_frontalface_default.xml放到代码文件同级目录下的cascades文件中。
代码:
from cv2 import cv2
def detect():
#加载人脸训练数据
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
face_cascade.load('C:/SOURCE/python/OpenCV/facedetect/cascades/haarcascade_frontalface_default.xml')
#加载人眼训练数据
eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')
eye_cascade.load('C:/SOURCE/python/OpenCV/facedetect/cascades/haarcascade_eye.xml')
camera = cv2.VideoCapture(0) #打开摄像头
sucess,frame = camera.read() #读取摄像头中的帧
while sucess and cv2.waitKey(1) == -1:
gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY) #转为灰度图
faces = face_cascade.detectMultiScale(gray,1.2,3) #人脸检测
for (x,y,w,h) in faces:
cv2.rectangle(frame,(x,y),(x+w,y+h),(0,255,0),2) #在人脸周围绘制方框
face_gray = gray[y:y+h,x:x+w] #从人脸方框裁剪出单独的部分进行后续眼部识别
eyes = eye_cascade.detectMultiScale(face_gray,1.1,3,0,(40,40)) #进行眼部检测
for (ex,ey,ew,eh) in eyes:
cv2.rectangle(frame,(x+ex,y+ey),(x+ex+ew,y+ey+eh),(0,255,0),2) #绘制眼部方框
cv2.imshow('camera',frame)
sucess,frame = camera.read() #读取下一帧
#按下键盘任意按钮关闭摄像头
camera.release()
cv2.destroyAllWindows()
if __name__=="__main__":
detect()
整个实现过程比较简单,先通过OpenCV调用摄像头,从视频中分离每一帧画面,再调用OpenCV预训练的模型face_cascade对画面进行人脸检测,检测到人脸后,在对应帧画面上绘制绿色方框。这里在人脸检测基础上还做了眼部检测,由于人脸已经检测到了,我们只需要将检测到的人脸单独提取出来,再调用eye_cascade进行眼部检测,同样在检测到的眼部周围绘制绿色框。完成检测和标记后,调用OpenCV进行显示。
测试效果: