准备工作:
opencv提供了人脸检测的xml文件,l使用find -path "*harrcascade"可以看到这里有十几个xml文件。
准备一张人脸图片
import cv2
#读取图片bgr
im=cv2.imread('img_face1.jpg')
#转换成灰阶图
gray=cv2,cvtColor(im,cv2.COLOR_BGR2GRAY)
cascadeclassifier=cv2.CascadeClassifier('./xml/harrcascade_frontalface_default.xml')
#返回的人脸坐标,传递的参数是scaleFactor和minNeighbors他们分别代表人脸检测中每次迭代图像的压缩率以及人脸矩形相邻的最小数目
faces=cascadeclassifier.detectMultiScale(gray,(1.3),5)
for (x,y,w,h) in faces:
#绘制矩形由于图片是bgr所以(225,0,0)是绿色的
im=cv2.rectangle(im,(x,y),(x+w,y+h),(225,0,0))
cv2.imwrite('./img/img_face1_detect.jpg')
识别结果
从摄像头内识别人脸
import cv2
#获取摄像头设备多个摄像头编号从0开始
camare=cv2.VideoCapture(0)
#人脸识别文件
detect_face=cv2.CascadeClassifier('./xml/haarcascade_frontal_default.xml')
#眼睛识别文件
detect_eye=cv2.CascadeClaaifier('./xml/haarcascade_eye.xml')
#循环读取摄像头
while True:
#读取摄像头的每一帧
success,frame=camera.read()
faces=detect_face.detectMultiScale(frame,1.3,5)
for(x,y,w,h) in faces:
#脸部绘制一个绿的矩形框住面部
frame=cv2.rectangle(frame,(x,y),(x+w,y+h),(225,0,0))
#分割脸部,用于识别眼睛
face=frame[y:y+h,x:x+w]
#识别眼睛
eyes=detect_eye.detectMultiScale(face,1.03,5,0,(40,40))
for(ex,ey,ew,eh) in eyes:
#用蓝色的矩形框住眼睛,注意这里的坐标需要加上上一级的
frame=cv2.rectangle(frame,(ex+x,ey+y),(ex+x+ew,ey+y+eh),(0,225,0))
#显示最终的帧
cv2.imshow('camera',frame)
#按键检测113指的是‘q’
if cv2.waitKey(90)==113:
#释放摄像头
camera.release()
#关闭窗口
cv2.destroyAllWindows()
#跳出循环
break