这里我们使用官方提供用于人脸和眼镜识别 xml 文件来实现人脸识别,随后我们会自己尝试定义一个自己的物体识别文件 haarcascade,用于识别一些物件。
https://github.com/opencv/opencv/tree/master/data
可以从本地获取 haarcascade 文件,我们 python 命令行下输入
>>> import cv2
>>> print(cv2.__file__)
可以查看到的 cv2 的安装目录,然后用 open 命令进入该安装目录下,将包含 haarcascade 文件的data 文件夹 copy 到项目目录下也就可以使用官方提供 haarcascade 文件。
open /usr/local/lib/python2.7/site-packages/cv2
引入我们依赖 cv2
import cv2
import numpy as np
引入 haarcascade 文件
引入下载下来 haarcascade 文件来用于识别物体的规则
face_dascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
eye_casc = cv2.CascadeClassifier('haarcascade_eye.xml')
我们通过摄像头捕捉视频流,有关如何通过摄像头获取视频流请参照计算机视觉 OpenCV (2)
获取分类器
cap = cv2.VideoCapture(0)
while True:
ret, img = cap.read()
有关 detectMultiScale 参数第一个是我们处理灰度的图像,后面两个参数是 scaleFactor=1.3 minNeighbors=5 有关这两个参数暂时不做详细解释,也可以使用默认值。识别出 face 会返回 4 值,分别为左上角的坐标和识别区域的宽度和高度。利用这些值我们可以通过矩形将人脸的范围表示出来。
while True:
ret, img = cap.read()
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
faces = face_dascade.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)
来一个自拍
face_cascade = cv2.CascadeClassifier('/Users/jangwoo/Desktop/Zi/opencv-demo/cascades/data/haarcascade_frontalface_alt2.xml')
while(True):
ret, frame = cap.read()
gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray,scaleFactor=1.5,minNeighbors=5)
for(x, y, w, h) in faces:
print(x,y,w,h)
roi_gray = gray[y:y+h,x:x+w]
img_item = 'my-image.png'
cv2.imwrite(img_item,roi_gray)
cv2.imshow('frame',frame)
k = cv2.waitKey(30) & 0xff
if k == 27:
break
cap.release()
cv2.destroyAllWindows()
为了巩固上面知识我们可以来一个自拍,大家可以尝试一下。
eye 通常都位于 face 区域内,所以我们再识别出 face 区域后,在这个区域的图像中查找 eye,工作类似于 face 的识别方法,这里就不做过多赘述了。
roi_gray = gray[y:y+h,x:x+w]
roi_color = img[y:y+h,x:x+w]
eyes = eye_casc.detectMultiScale(roi_gray)
for (ex,ey,ew,eh) in eyes:
cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2)
最后就是一些常规在 OpenCV 中工作,显示处理后的图像和关闭视频后进行一些必要的回收处理。
cv2.imshow('img',img)
k = cv2.waitKey(30) & 0xff
if k == 27:
break
cap.release()
cv2.destroyAllWindows()
完整代码
while True:
ret, img = cap.read()
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
faces = face_dascade.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_casc.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)
k = cv2.waitKey(30) & 0xff
if k == 27:
break
cap.release()
cv2.destroyAllWindows()
提醒一下我开始带眼镜,就没有识别出我们的脸,我以为代码问题,后来摘下眼镜就 OK 而且还有一个问题就是可能把鼻孔以识别出来了。
网友评论