视频里的人脸检测跟静态图片中的差不多,只是需要调用摄像头。
import cv2 def detect(): face_cascade = cv2.CascadeClassifier( 'cascades/haarcascade_frontalface_default.xml') eye_cascade = cv2.CascadeClassifier( 'cascades/haarcascade_eye.xml') camera = cv2.VideoCapture(0) #初始化摄像头,参数传递的是要使用的第几个摄像头 while True: ret, frame = camera.read() #read()函数返回两个值,第一个布尔值用于判断是否检测到帧,第二个为帧 gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) #捕捉到帧后将其转为灰度图像(OpenCV基于灰度色彩空间) faces = face_cascade.detectMultiScale(gray, 1.3, 5) for (x, y, w, h) in faces: img = cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2) # 蓝色矩形框 eyes = eye_cascade.detectMultiScale(gray, 1.2, 5,0,(5,5)) #直接传值的话需要多传一个flags值,否则报错 font = cv2.FONT_ITALIC cv2.putText(frame, 'xzb', (x -10, y - 10), font, 1, (255, 0, 255), 2) #在人脸框上显示文本1-图片,2-文本,3-位置,4-字体,5-大小,6-颜色,7-线宽 for (ex, ey, ew, eh) in eyes: cv2.rectangle(img, (ex,ey),(ex+ew,ey+eh),(0,255,0),2) #绿色矩形框 cv2.imshow('camera',frame) if cv2.waitKey(100) & 0xff == ord ('q'): break camera.release() cv2.destroyAllWindows() if __name__ =='__main__': detect()
结果:
face_cascade = cv2.CascadeClassifier( 'cascades/haarcascade_frontalface_default.xml') eye_cascade = cv2.CascadeClassifier( 'cascades/haarcascade_eye.xml')
这里加载了两个分类器,一个是用于检测脸,一个是检测眼睛
camera = cv2.VideoCapture(0)
初始化摄像头,参数传递的是要使用的第几个摄像头
for (x, y, w, h) in faces: img = cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2) # 蓝色矩形框 eyes = eye_cascade.detectMultiScale(gray, 1.2, 5,0,(5,5)) #直接传值的话需要多传一个flags值,否则报错 font = cv2.FONT_ITALIC #字体 cv2.putText(frame, 'xzb', (x -10, y - 10), font, 1, (255, 0, 255), 2) #在人脸框上显示文本1-图片,2-文本,3-位置,4-字体,5-大小,6-颜色,7-线宽 for (ex, ey, ew, eh) in eyes: cv2.rectangle(img, (ex,ey),(ex+ew,ey+eh),(0,255,0),2) #绿色矩形框
cv2.imshow('camera',frame)
这里是将每一帧检测到脸的图片进行眼睛检测。这样相比整张图片检测眼可以减少计算量,提高运算速度。
if cv2.waitKey(100) & 0xff == ord ('q'): break camera.release() cv2.destroyAllWindows() if __name__ =='__main__': detect()
输入q退出,不然摄像头一直会被调用。
if __name__ =='__main__': detect()是为了防止这个py文件被导入时执行。
总的来说视频检测与图像检测没有太大区别,就是将视频分割成一帧帧图片再进行处理。