阅读 422

【Python3-OpenCV】实现实时摄像头人脸检测篇

这是我参与更文挑战的第7天,活动详情查看: 更文挑战

OpenCV是一个C++库,目前流行的计算机视觉编程库,用于实时处理计算机视觉方面的问题,它涵盖了很多计算机视觉领域的模块。在Python中常使用OpenCV库实现图像处理。

image.png

本文将介绍如何在Python3中使用OpenCV实现实时摄像头人脸检测:

参考: Opencv4 官方文档 : docs.opencv.org/4.2.0/

准备工作:

设备准备:

USB摄像头 接入PC电脑USB口,并调试正常打开视频。如果电脑内置了电脑摄像头,测试一下摄像头能否正常使用。

下载特征分类模型: XML模型库:github.com/opencv/open…

1.找到haarcascade_frontalface_default.xml文件,点击进去。如果想尝试检测其它特征区域,下载对应的xml文件即可。

image.png

2.找到Raw,右键链接(目标)另存为。

image.png

实现过程

调用模型库文件

将刚才下载好的模型库文件导入到程序中 代码实现:

face_cascade = cv2.CascadeClassifier('F:\\yolo-data\\opencv 3.3\\opencv\\sources\\data\\haarcascades\\haarcascade_frontalface_default.xml')
复制代码

打开摄像头

打开电脑的USB摄像头或者自带摄像头。

代码实现:

cap = cv2.VideoCapture(0)
复制代码

设置显示窗口的大小

cap.set(3, 640)
cap.set(4, 480)
复制代码

设置变量记录人脸数码

faceNum = 0
复制代码

人脸检测

读取视频帧,调用Opencv特征文件进行人脸检测

代码实现:

while True:
    # 读取视频帧
    ret, frame = cap.read()
    # 图像灰度处理
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    # 设定人脸识别参数
    faces = face_cascade.detectMultiScale(gray, scaleFactor=1.3, minNeighbors=3)

    faceNum = len(faces)
    print("人脸数量: %s" % faceNum)

    if len(faces) > 0:
        for faceRect in faces:
            x, y, w, h = faceRect
            # -------- 在人脸周围绘制矩形
            cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 255, 0), 2)
复制代码

设置退出机制

L键退出程序 ** 代码实现:**

if cv2.waitKey(1) & 0xff == ord('L'):
    break
复制代码

程序运行

image.png

全部代码

import cv2

# 调用模型库文件
face_cascade = cv2.CascadeClassifier('F:\\yolo-data\\opencv 3.3\\opencv\\sources\\data\\haarcascades\\haarcascade_frontalface_default.xml')
# 打开内置摄像头
cap = cv2.VideoCapture(0)
# 设置视频窗口大小
cap.set(3, 640)
cap.set(4, 480)
faceNum = 0

while True:
    # 读取视频帧
    ret, frame = cap.read()
    # 图像灰度处理
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    # 设定人脸识别参数
    faces = face_cascade.detectMultiScale(gray, scaleFactor=1.3, minNeighbors=3)

    faceNum = len(faces)
    print("人脸数量: %s" % faceNum)

    if len(faces) > 0:
        for faceRect in faces:
            x, y, w, h = faceRect
            # -------- 在人脸周围绘制矩形
            cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 255, 0), 2)

    # 显示图像
    cv2.imshow('Output', frame)

    # L键退出显示
    if cv2.waitKey(1) & 0xff == ord('L'):
        break
# 释放资源
cv2.destroyAllWindows()
cap.release()
复制代码

本月将陆续推出相关系列文章,

篇篇精彩,尽请关注。

文章分类
后端