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()
使用说明
- 先执行
pip install pyttsx3安装语音依赖库 SPEAK_INTERVAL参数可直接调整播报间隔,设置2或3都可以- 如果播报距离和实际距离有偏差,调整
FOCAL_LENGTH焦距参数校准即可,数值越大算出的距离越远 - 多人人脸场景下默认播报平均距离,需要其他统计逻辑直接修改
speak_text的生成规则即可
内容的提问来源于stack exchange,提问作者user19320729
相关产品推荐
相关产品推荐

