You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于OpenCV实时人脸检测:如何仅在检测到人脸时执行代码块?

问题描述

我有一段实时人脸检测的代码如下:

import cv2


class FaceRec:
    # Enable camera
    cap = cv2.VideoCapture(0)
    cap.set(3, 640)
    cap.set(4, 420)

    # import cascade file for facial recognition
    faceCascade = cv2.CascadeClassifier(cv2.data.haarcascades + "haarcascade_frontalface_default.xml")

    while True:
        success, img = cap.read()
        imgGray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        # Getting corners around the face
        faces = faceCascade.detectMultiScale(imgGray, 1.3, 5)  # 1.3 = scale factor, 5 = minimum neighbor
        # drawing bounding box around face
        for (x, y, w, h) in faces:
            img = cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 3)

        cv2.imshow('face_detect', img)
        if cv2.waitKey(10) & 0xFF == ord('q'):
            break
    cap.release()
    cv2.destroyWindow('face_detect')

这段代码通过摄像头检测人脸并在人脸进入画面时绘制bounding box。我希望仅在检测到人脸时执行某一代码块,请问该如何实现?我曾尝试加入while循环,但代码在检测到人脸前就开始运行了,不符合需求。


解决方案

首先修正原代码的规范问题:你把执行逻辑直接写在了类的顶层,这不符合Python类的设计规范,应该把这些代码放到类的方法中(比如run方法)。

实现“仅检测到人脸时执行特定代码块”的核心逻辑是判断检测到的人脸列表faces是否非空——当len(faces) > 0时,说明当前帧检测到了人脸,此时执行目标代码块即可。

修改后的完整代码示例:

import cv2


class FaceRec:
    def __init__(self):
        # 初始化摄像头
        self.cap = cv2.VideoCapture(0)
        self.cap.set(3, 640)
        self.cap.set(4, 420)
        # 加载人脸检测级联分类器
        self.faceCascade = cv2.CascadeClassifier(cv2.data.haarcascades + "haarcascade_frontalface_default.xml")

    def run(self):
        while True:
            success, img = self.cap.read()
            if not success:
                break  # 读取帧失败时退出循环
            imgGray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
            faces = self.faceCascade.detectMultiScale(imgGray, 1.3, 5)

            # 绘制人脸 bounding box
            for (x, y, w, h) in faces:
                img = cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 3)

            # 仅当检测到人脸时执行的代码块
            if len(faces) > 0:
                # 在这里替换成你需要执行的逻辑,比如打印提示、触发其他操作
                print("检测到人脸!")
                # 示例:获取第一个人脸的位置信息
                x, y, w, h = faces[0]
                print(f"人脸位置:x={x}, y={y}, 宽={w}, 高={h}")

            cv2.imshow('face_detect', img)
            if cv2.waitKey(10) & 0xFF == ord('q'):
                break

        # 释放资源
        self.cap.release()
        cv2.destroyAllWindows()


# 启动人脸检测
if __name__ == "__main__":
    face_rec = FaceRec()
    face_rec.run()

额外优化提示

如果需要避免人脸持续存在时重复触发代码(比如只在人脸刚进入画面时执行一次),可以添加一个状态变量记录上一帧的检测结果:

def run(self):
    face_detected_last = False  # 记录上一帧是否检测到人脸
    while True:
        # ...(省略前面的帧读取、检测逻辑)
        if len(faces) > 0:
            if not face_detected_last:
                # 仅当人脸刚出现时执行一次
                print("人脸首次进入画面!")
            face_detected_last = True
        else:
            face_detected_last = False
        # ...(省略后续显示、退出逻辑)

内容的提问来源于stack exchange,提问作者Khaos_Prime

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 05:00:24