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

OpenCV人脸距离检测程序定时语音播报实现方法咨询

实现方案

可用功能函数说明

  • 语音播报使用pyttsx3库的离线TTS接口,核心用到两个函数:
    • engine.say(text):传入要播报的文本内容,加入播报队列
    • engine.runAndWait():执行队列里的播报任务,阻塞直到播报完成
  • 定时逻辑用Python标准库time的time()函数实现,通过记录上次播报的时间戳,和当前时间做差判断是否到达间隔阈值,不需要额外引入定时框架,性能开销极低。

原有代码优化点

你现有代码把FaceMeshDetector和CascadeClassifier的初始化放在了视频循环内部,每帧都会重新加载模型,会导致帧率严重下降,需要把这类初始化操作移到循环外只执行一次;原代码中定义的Face类没有实际作用,属于冗余代码可以直接移除。

完整实现代码

import cv2
import time
import pyttsx3
import cvzone
from cvzone.FaceMeshModule import FaceMeshDetector

# 初始化语音引擎
engine = pyttsx3.init()
# 配置播报语速,数值越大语速越快
engine.setProperty('rate', 150)
# 配置音量,范围0-1
engine.setProperty('volume', 0.9)

# 初始化检测器,移到循环外只加载一次
detector = FaceMeshDetector(maxFaces=3)
cascade_classifier = cv2.CascadeClassifier(
    f"{cv2.data.haarcascades}haarcascade_frontalface_default.xml")

window_name = "Detected Objects in webcam"
video = cv2.VideoCapture(0)
# 记录上次播报的时间戳,初始设为0保证启动后立刻播一次
last_speak_time = 0
# 播报间隔,单位秒,可在2-3之间自行调整
SPEAK_INTERVAL = 2.5
# 人脸两眼间距参考值,单位cm
FACE_EYE_WIDTH = 6.3
# 摄像头焦距,根据自己的摄像头校准即可
FOCAL_LENGTH = 600

while video.isOpened():
    ret, frame = video.read()
    if not ret:
        break

    img, faces = detector.findFaceMesh(frame, draw=False)
    image = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    detected_objects = cascade_classifier.detectMultiScale(
        image, minSize=(20, 20))

    # 绘制Haar检测到的人脸框
    if len(detected_objects) != 0:
        for (x, y, height, width) in detected_objects:
            cv2.rectangle(
                frame, (x, y), ((x + height), (y + width)), (0, 255, 0), 5
            )

    current_distance_list = []
    # 计算人脸距离
    for face in faces:
        r_point = face[374]
        l_point = face[145]
        point_width, _ = detector.findDistance(l_point, r_point)
        distance = (FACE_EYE_WIDTH * FOCAL_LENGTH) / point_width
        current_distance_list.append(distance)
        # 绘制距离文本
        cvzone.putTextRect(
            frame, f"Depth:{distance:.2f} cm", (face[10][0]-95, face[10][1]-5), scale=1.8
        )

    # 到达播报间隔且检测到人脸时触发播报
    current_time = time.time()
    if current_time - last_speak_time >= SPEAK_INTERVAL and len(current_distance_list) > 0:
        # 多个人脸时取平均距离播报,可按需改成最近/最远值
        avg_distance = sum(current_distance_list) / len(current_distance_list)
        speak_text = f"当前检测到{len(current_distance_list)}张人脸,平均距离{int(avg_distance)}厘米"
        engine.say(speak_text)
        engine.runAndWait()
        # 更新上次播报时间
        last_speak_time = current_time

    cv2.imshow(window_name, frame)
    key = cv2.waitKey(1) & 0xFF
    if key == ord("q"):
        break

video.release()
cv2.destroyAllWindows()

使用说明

  1. 先执行pip install pyttsx3安装语音依赖库
  2. SPEAK_INTERVAL参数可直接调整播报间隔,设置2或3都可以
  3. 如果播报距离和实际距离有偏差,调整FOCAL_LENGTH焦距参数校准即可,数值越大算出的距离越远
  4. 多人人脸场景下默认播报平均距离,需要其他统计逻辑直接修改speak_text的生成规则即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 18:12:29