You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

OpenCV人脸检测:无人脸时录像中断,如何实现持续录像?

解决OpenCV人脸识别时摄像头未检测到人脸就停止录像的问题

嘿,我看你遇到的问题是摄像头没检测到人脸时录像就停了对吧?这大概率是因为你把录像的逻辑和人脸检测的分支绑定在一起了——只有检测到人脸才会执行写入帧的操作,没检测到自然就停了。要实现持续录像,核心思路就是把录像操作和人脸检测逻辑完全分开,不管有没有检测到人脸,每一帧都要写入到录像文件里。

下面是具体的修改方案和完整代码:

关键修改点

  • 提前初始化VideoWriter对象:用来持续保存摄像头的每一帧,这个对象要放在循环开始前设置好,确保和摄像头的参数匹配。
  • 把写入帧的操作放在主循环最外层:不管有没有检测到人脸,都执行out.write(frame),保证录像不中断。
  • 人脸检测仅负责画框或日志记录:不影响录像的持续执行。

修改后的完整代码

import cv2
import logging as log
from time import sleep
import datetime as dt
import numpy as np

# 加载人脸检测器
cascPath = "haarcascade_frontalface_default.xml"
faceCascade = cv2.CascadeClassifier(cascPath)

# 初始化摄像头
cam = cv2.VideoCapture(0)
# 获取摄像头的帧率和分辨率,用于匹配录像参数
fps = cam.get(cv2.CAP_PROP_FPS)
width = int(cam.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cam.get(cv2.CAP_PROP_FRAME_HEIGHT))

# 初始化VideoWriter(编码格式根据系统调整:Windows用XVID,Linux/Mac可选MJPG)
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi', fourcc, fps, (width, height))

anterior = 0
log.basicConfig(filename='webcam.log', level=log.INFO)

# 主循环:持续读取帧、检测人脸、写入录像
while True:
    ret, frame = cam.read()
    if not ret:
        print("无法获取摄像头画面,退出程序")
        break

    # 人脸检测逻辑(仅负责识别和画框,不影响录像)
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    faces = faceCascade.detectMultiScale(
        gray,
        scaleFactor=1.1,
        minNeighbors=5,
        minSize=(30, 30)
    )

    # 在画面上绘制人脸框
    for (x, y, w, h) in faces:
        cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)

    # 记录人脸数量变化的日志
    if anterior != len(faces):
        anterior = len(faces)
        log.info("人脸数量: {} 时间: {}".format(len(faces), dt.datetime.now()))

    # 核心:不管有没有人脸,都写入当前帧到录像文件
    out.write(frame)

    # 实时显示画面(可选,不需要可以注释掉)
    cv2.imshow('Video', frame)

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

# 释放所有资源
cam.release()
out.release()
cv2.destroyAllWindows()

注意事项

  • 编码格式fourcc:不同系统支持的编码可能不同,Windows推荐用XVID,Linux或Mac可以尝试MJPG或者XVID,如果录像文件无法打开,换个编码试试。
  • 资源释放:程序退出时一定要调用cam.release()out.release(),不然可能会导致摄像头被占用或者录像文件损坏。

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

火山引擎 最新活动