在图片中识别如上节所示,那么在动态的视频中想识别人脸如何实现?通过调用机器的摄像头,实现实时人脸检测。
任务2.1:使用OpenCV实现视频中的人脸检测。
以下是OpenCV中调用摄像头的代码示例,当点击ESC时,退出摄像程序。
| #!/usr/bin/Python # -*- coding: utf-8 -*- import cv2 # 初始化 cap = cv2.VideoCapture(0) # 视频缩放放大小 scaling_factor = 0.5 #循环摄像,直至点击ESC键 while True: # 读取视频中的一帧(frame) ret, frame = cap.read() #图像大小绽放 frame = cv2.resize(frame, None, fx=scaling_factor, fy=scaling_factor, interpolation=cv2.INTER_AREA) #显示图像 cv2.imshow('camera', frame) # 获取键盘事件 c = cv2.waitKey(1) if c == 27: #ESC break # 释放摄像头 cap.release() # 关闭窗口 cv2.destroyAllWindows() |
任务2.2:当需要保存图像,则点击的键盘是“s”。
参考代码如下:
| import time if c ==ord('s'): i = i + 1; cv2.imwrite('img' + time.strftime('%m-%d-%S', time.localtime(time.time())) + str(i) + '.jpg', frame) elifc == 27: #ESC break |
点击三下“s”键后,保存的图像结果如图所示。
任务2.3:实时获取视频并检测其中的人脸。
参考代码如下:
| #!/usr/bin/Python # -*- coding: utf-8 -*- import cv2 import numpyas np # 加载人脸检测器 face_cascade = cv2.CascadeClassifier('cascade_files/haarcascade_frontalface_alt.xml') # 检测分类器是否存在 if face_cascade.empty(): raise IOError('Unable to load the face cascade classifier xml file') # 初始化视频接口 cap = cv2.VideoCapture(0) # 定义缩放比例尺 scaling_factor = 0.5 # 点击ESC退出 while True: # 获取当前视频中的一帧图像 ret, frame = cap.read() frame = cv2.resize(frame, None, fx=scaling_factor, fy=scaling_factor, interpolation=cv2.INTER_AREA) # 转换成灰度图 gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 运行人脸检测 face_rects = face_cascade.detectMultiScale(gray, 1.3, 5) # 画出识别框 for (x,y,w,h) in face_rects: cv2.rectangle(frame, (x,y), (x+w,y+h), (255,0,0), 2) # 在视频中显示该图像 cv2.imshow('Face Detector-Camera', frame) # 如何ESC被按下,退出程序 c = cv2.waitKey(1) if c == 27: break cap.release() cv2.destroyAllWindows() |
实时人脸检测运行结果如图8.8所示。

(1)有人脸 (2)无人脸