阅读本教程之前请阅读Python中的人脸识别这篇文章。必要的条件
- 安装了OpenCV
- 一个正常工作的网络摄像头
实例代码:
让我们直接进入代码
import cv2 import sys cascPath = sys.argv[1] faceCascade = cv2.CascadeClassifier(cascPath) video_capture = cv2.VideoCapture(0) while True: # 获取一帧 ret, frame = video_capture.read() gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) faces = faceCascade.detectMultiScale( gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30), flags=cv2.cv.CV_HAAR_SCALE_IMAGE ) # 在这些面周围画一个长方形 for (x, y, w, h) in faces: cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2) # 显示结果帧 cv2.imshow('Video', frame) if cv2.waitKey(1) & 0xFF == ord('q'): break # 一切完成时,释放捕获 video_capture.release() cv2.destroyAllWindows()
现在把它分解为…
import cv2 import sys cascPath = sys.argv[1] faceCascade = cv2.CascadeClassifier(cascPath)
创建一个面部级联,就像在图像示例中所做的那样。
video_capture=cv2.VideoCapture(0)
这一行将视频源设置为默认的摄像头,OpenCV可以很容易地捕捉到。
注:还可以在这里提供一个文件名,Python将读取视频文件。然而,你需要安装ffmpeg,因为OpenCV本身不能解码压缩视频。Ffmpeg充当OpenCV的前端,理想情况下,它应该直接编译成OpenCV。但是这并不容易做到,尤其是在Windows上。
whileTrue:
# Capture frame-by-frame
ret,frame=video_capture.read()
我们开始捕捉视频。这个read()
函数从视频源读取一个帧,在本例中是网络摄像头。返回俩个值:
- 实际的视频帧读(每个循环中有一个帧)
- 返回码
返回代码告诉我们是否已经用完了帧,如果我们从文件中读取,则会发生这种情况。当阅读从网络摄像头,因为我们可以永远记录,所以我们会忽略它。
# 获取一帧 ret, frame = video_capture.read() gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) faces = faceCascade.detectMultiScale( gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30), flags=cv2.cv.CV_HAAR_SCALE_IMAGE ) # 在这些面周围画一个长方形 for (x, y, w, h) in faces: cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2) # 显示结果帧 cv2.imshow('Video', frame)
这段代码应该很熟悉。需要我们捕捉到的画面中寻找那张脸。
ifcv2.waitKey(1)&0xFF==ord('q'):
break
‘Q’键被按下,退出脚本。
# 当一切完成时,释放捕获
video_capture.release()
cv2.destroyAllWindows()