published on in Python

影像处理・目标检测

返回教程主页

上篇 影像处理・网络摄像头

在成功调用摄像头并获取视频内容后,我们可以对视频内容进行目标检测,为了方便上手,这里采用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()

下篇 影像处理・人脸识别