在成功调用摄像头并获取视频内容后,我们可以对视频内容进行目标检测,为了方便上手,这里采用OpenCV人脸检测作为作为实例学习。
我们需要下载OpenCV官方已经训练好的人脸检测器数据文件:
https://raw.githubusercontent.com/opencv/opencv/master/data/haarcascades/haarcascade_frontalface_alt.xml
创建检测器
创建一个检测器并载入下载的检测器数据:
face_cascade_data = 'haarcascade_frontalface_alt.xml'
face_cascade = cv.CascadeClassifier()
face_cascade.load(cv.samples.findFile(face_cascade_data))
传入函数cv.samples.findFile
的参数是我们下载好的检测器数据文件的路径。
检测与标记
我们创建一个函数用于处理目标检测,并将检测结果标记描绘到图像上:
def face_detect(frame):
gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
gray = cv.equalizeHist(gray)
faces = face_cascade.detectMultiScale(gray)
for x, y, w, h in faces:
cv.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 3)
在将图像放入检测器前,我们可以将图像转换成灰度图cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
;有时为了提升效果可以对图像进行色彩均衡化操作cv.equalizeHist(gray)
;使用face_cascade.detectMultiScale
方法进行检测,可以使用for in循环遍历取出每一个检测到的人脸位置信息。
结合摄像头调用
我们可以在之前的摄像头调用实例代码中应用人脸检测:
import cv2 as cv
def face_detect(frame):
gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
gray = cv.equalizeHist(gray)
faces = face_cascade.detectMultiScale(gray)
for x, y, w, h in faces:
cv.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 3)
face_cascade_data = 'haarcascade_frontalface_alt.xml'
face_cascade = cv.CascadeClassifier()
face_cascade.load(cv.samples.findFile(face_cascade_data))
video = cv.VideoCapture(0)
while video.isOpened():
ret, frame = video.read()
if ret == True:
face_detect(frame)
cv.imshow('My Video', frame[:, ::-1])
if cv.waitKey(20) & 0xFF == ord('q'):
break
else:
break
video.release()
cv.destroyAllWindows()