OpenCV-Python快速入门系列30案例:实时人脸检测

代码

视频和模型库在第一篇文章中有git地址。

import cv2 as cv

# 模型路径
MODEL_BIN = "models/face_detector/opencv_face_detector_uint8.pb"
CONFIG_TEXT = "models/face_detector/opencv_face_detector.pbtxt"

def load_model(model_bin, config_text):
    """加载 DNN 模型"""
    try:
        net = cv.dnn.readNetFromTensorflow(model_bin, config_text)
        return net
    except Exception as e:
        print(f"加载模型失败: {e}")
        return None

def process_frame(net, frame):
    """对帧进行人脸检测"""
    h, w, _ = frame.shape

    # 预处理输入图像
    blob = cv.dnn.blobFromImage(frame, 1.0, (300, 300), (104.0, 177.0, 123.0), False, False)
    net.setInput(blob)

    # 执行前向传播
    outs = net.forward()  # 输出形状: 1x1xNx7
    for detection in outs[0, 0, :, :]:
        score = float(detection[2])
        if score > 0.5:  # 置信度阈值
            # 计算边界框
            left = int(detection[3] * w)
            top = int(detection[4] * h)
            right = int(detection[5] * w)
            bottom = int(detection[6] * h)

            # 绘制矩形框
            cv.rectangle(frame, (left, top), (right, bottom), (0, 255, 0), 2)

            # 绘制置信度
            label = f'{score:.2f}'
            label_size, baseline = cv.getTextSize(label, cv.FONT_HERSHEY_SIMPLEX, 0.5, 1)
            top = max(top, label_size[1])  # 确保文本不超出顶部
            cv.rectangle(frame, (left, top - label_size[1] - baseline),
                         (left + label_size[0], top + baseline), (0, 255, 0), cv.FILLED)
            cv.putText(frame, label, (left, top - baseline), cv.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 0), 1)

    return frame

def face_detect(video_path=None):
    """人脸检测主函数"""
    # 加载模型
    net = load_model(MODEL_BIN, CONFIG_TEXT)
    if net is None:
        return

    # 打开视频源
    video_capture = cv.VideoCapture(0 if video_path is None else video_path)
    if not video_capture.isOpened():
        print("无法打开视频源")
        return

    print("按 'q' 键退出")

    while True:
        ret, frame = video_capture.read()
        if not ret:
            print("视频结束或无法读取帧")
            break

        # 处理帧
        frame = process_frame(net, frame)

        # 显示结果
        cv.imshow('Video', frame)

        # 按 'q' 键退出
        if cv.waitKey(1) & 0xFF == ord('q'):
            break

    # 释放资源
    video_capture.release()
    cv.destroyAllWindows()

# 调用函数
# face_detect('images/example_dsh.mp4')
face_detect(0)

功能概述

  1. 加载预训练的 TensorFlow 模型进行人脸检测。
  2. 支持从摄像头或视频文件实时读取视频流。
  3. 检测到的人脸用矩形框标注,并在框旁显示置信度。
  4. 实现模块化代码设计,方便扩展和优化。

应用场景

  • 实时监控:在安全监控中检测人脸。
  • 人脸识别前处理:实时获取人脸图像,用于后续识别。
  • 表情分析:结合其他模型,进行实时表情检测。

运行效果

图片[1]-OpenCV-Python快速入门系列30案例:实时人脸检测-天煜博客

结尾

跟随贾老师的课程到这里就结束了,后续本系列可能还会增加老师关于Python-OpenCV相关的文章,敬请期待!

© 版权声明
THE END
喜欢就支持一下吧
点赞11 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容