基于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
相关产品推荐
相关产品推荐

