屏幕距离识别加语音提醒

效果

QQ录屏20240406131651

语音播放

import pygame
pygame.mixer.init()   #初始化
pygame.mixer.music.load(r"7359.wav")   #文件位置
pygame.mixer.music.play(1)   #播放语音
while pygame.mixer.music.get_busy():  # 在音频播放为完成之前不退出程序pass

完整代码

1.多线程使语音可以播放完,预防卡音。

2.小于35厘米语音提醒并更换距离提醒字体颜色,一般情况下用蓝色字体显示。

3.使用过程中可以把倒数第二行注释掉,不进行窗口的显示,仅判断距离

import cv2
from cvzone.FaceMeshModule import FaceMeshDetector
import pygame
import threading
from PIL import Image, ImageDraw, ImageFont
import numpy as np# 初始化pygame.mixer
pygame.mixer.init()
# 加载音频文件
pygame.mixer.music.load('7359.wav')  # 靠的太近啦  #音频文件自行修改
# 设置摄像头
cap = cv2.VideoCapture(0)
detector = FaceMeshDetector(maxFaces=1)
# 定义播放音频的函数
def play_audio():pygame.mixer.music.play(1)while pygame.mixer.music.get_busy():continue
# 开始检测人脸
while True:success, img = cap.read()img, faces = detector.findFaceMesh(img, draw=False)if faces:face = faces[0]pointLeft = face[145]pointRight = face[374]w, _ = detector.findDistance(pointLeft, pointRight)W = 6.3f = 600d = (W * f) / wprint(d)# 设置距离颜色if d < 35:print("过近提醒")# 检查是否正在播放音频if not pygame.mixer.music.get_busy():# 使用线程播放音频,避免阻塞主程序audio_thread = threading.Thread(target=play_audio)audio_thread.start()text_color = (255, 0, 0)  # 红色else:text_color = (0, 0, 255)  # 蓝色# 将 Depth 文本显示为汉语pil_img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))draw = ImageDraw.Draw(pil_img)font = ImageFont.truetype("msyh.ttc", 36)  # 使用微软雅黑字体,大小为36draw.text((face[10][0] - 95, face[10][1] - 5), f'距离:{int(d)}厘米', font=font, fill=text_color)img = cv2.cvtColor(np.array(pil_img), cv2.COLOR_RGB2BGR)cv2.imshow("Distance recognition", img)  # 窗口名只能是英文cv2.waitKey(1)

UI设计

用pyqt设计了个UI把视频流嵌入

并设计了个进度条用来实时显示距离

输入距离设置 低于xx时自动提醒

import sys
from PyQt5 import QtGui
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtCore import Qt, QPoint
from esp32_ui import Ui_Form  # UI
import ping  # qrc生成的py #样式表
import cv2
from cvzone.FaceMeshModule import FaceMeshDetector
import pygame
import threading
from PIL import Image, ImageDraw, ImageFont
import numpy as np
class guWindow(QWidget):def __init__(self):super().__init__()self.gu = Ui_Form()self.gu.setupUi(self)self.gu.lineEdit.returnPressed.connect(self.gumou)  # lineEdit回车运行self.video_label = self.gu.label_2# 2 QLabel2self.user_name_qwidget = self.gu.lineEditself.progress_bar = self.gu.progressBar  #进度条self.setWindowOpacity(0.90)  # 设置窗口透明度self.setWindowFlag(Qt.FramelessWindowHint)  # 去除边框self.setAttribute(Qt.WA_TranslucentBackground)  # 去除白色背景self.offset = QPoint()  # 记录鼠标按下的初始位置def mousePressEvent(self, event):self.offset = event.pos()def mouseMoveEvent(self, event):if event.buttons() == Qt.LeftButton:self.move(self.pos() + event.pos() - self.offset)  # 移动窗口位置def gumou(self):  # 按钮绑定的函数 功能cap = cv2.VideoCapture(0)detector = FaceMeshDetector(maxFaces=1)pygame.mixer.init()# 加载音频文件pygame.mixer.music.load('7359.wav')  # 靠的太近啦def play_audio():pygame.mixer.music.play(1)while pygame.mixer.music.get_busy():continuewhile True:success, img = cap.read()img, faces = detector.findFaceMesh(img, draw=False)if faces:face = faces[0]pointLeft = face[145]pointRight = face[374]w, _ = detector.findDistance(pointLeft, pointRight)W = 6.5f = 600  # 焦距d = (W * f) / wprint(d)# 设置距离颜色if d < 35:print("过近提醒")# 检查是否正在播放音频if not pygame.mixer.music.get_busy():# 使用线程播放音频,避免阻塞主程序audio_thread = threading.Thread(target=play_audio)audio_thread.start()text_color = (255, 0, 0)  # 红色else:text_color = (0, 0, 255)  # 蓝色# Update the QProgressBar valueself.progress_bar.setValue(int(d))# 将 Depth 文本显示为汉语pil_img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))draw = ImageDraw.Draw(pil_img)font = ImageFont.truetype("msyh.ttc", 36)  # 使用微软雅黑字体,大小为36draw.text((face[10][0] - 95, face[10][1] - 5), f'距离:{int(d)}厘米', font=font, fill=text_color)img = cv2.cvtColor(np.array(pil_img), cv2.COLOR_RGB2BGR)h, w, c = img.shapebytesPerLine = c * wif c == 3:  # 如果颜色通道为3(BGR)q_img = QtGui.QImage(img.data, w, h, bytesPerLine, QtGui.QImage.Format_BGR888)else:  # 如果颜色通道为4(BGRA)q_img = QtGui.QImage(img.data, w, h, bytesPerLine, QtGui.QImage.Format_BGRA8888)# Convert QImage to QPixmappixmap = QtGui.QPixmap.fromImage(q_img)# Display QPixmap on QLabelself.video_label.setPixmap(pixmap)self.video_label.setScaledContents(True)self.video_label.update()cv2.waitKey(1)
if __name__ == '__main__':app = QApplication(sys.argv)icon = QtGui.QIcon(':/jay.ico')app.setWindowIcon(icon)# 创建可拖动窗口实例ui = guWindow()  # 函数# 显示窗口ui.show()# 启动应用程序事件循环sys.exit(app.exec_())

ui代码

import sys
from PyQt5 import QtGui
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtCore import Qt, QPoint, pyqtSignal
from esp32_ui import Ui_Form  # UI
import ping  # qrc生成的py #样式表
import cv2
from cvzone.FaceMeshModule import FaceMeshDetector
import pygame
import threading
from PIL import Image, ImageDraw, ImageFont
import numpy as npclass guWindow(QWidget):close_signal = pyqtSignal()def __init__(self):super().__init__()self.gu = Ui_Form()self.gu.setupUi(self)self.gu.lineEdit.returnPressed.connect(self.gumou)  # lineEdit回车运行self.video_label = self.gu.label_2# 2 QLabel2self.user_name_qwidget = self.gu.lineEditself.progress_bar = self.gu.progressBar  #进度条self.setWindowOpacity(0.90)  # 设置窗口透明度self.setWindowFlag(Qt.FramelessWindowHint)  # 去除边框self.setAttribute(Qt.WA_TranslucentBackground)  # 去除白色背景self.offset = QPoint()  # 记录鼠标按下的初始位置self.close_signal.connect(self.closeEvent)def closeEvent(self, event):# 关闭窗口时发送信号self.stop_capture()def mousePressEvent(self, event):self.offset = event.pos()def mouseMoveEvent(self, event):if event.buttons() == Qt.LeftButton:self.move(self.pos() + event.pos() - self.offset)  # 移动窗口位置def gumou(self):  # 按钮绑定的函数 功能s = self.user_name_qwidget.text()self.user_name_qwidget.clear()try:distance_threshold = float(s)  # 将用户输入的文本转换为浮点数作为距离阈值except ValueError:print("Invalid input. Please enter a valid number.")returncap = cv2.VideoCapture(0)self.detector = FaceMeshDetector(maxFaces=1)pygame.mixer.init()# 加载音频文件pygame.mixer.music.load('7359.wav')  # 靠的太近啦self.capture_active = Truedef play_audio():pygame.mixer.music.play(1)while pygame.mixer.music.get_busy():continuewhile self.capture_active:success, img = cap.read()img, faces = self.detector.findFaceMesh(img, draw=False)if faces:face = faces[0]pointLeft = face[145]pointRight = face[374]w, _ = self.detector.findDistance(pointLeft, pointRight)W = 6.5f = 600  # 焦距d = (W * f) / wprint(d)# 设置距离颜色if d < distance_threshold:  # 使用用户输入的距离阈值作为判断条件print("过近提醒")# 检查是否正在播放音频if not pygame.mixer.music.get_busy():# 使用线程播放音频,避免阻塞主程序audio_thread = threading.Thread(target=play_audio)audio_thread.start()text_color = (255, 0, 0)  # 红色else:text_color = (0, 0, 255)  # 蓝色# Update the QProgressBar valueself.progress_bar.setValue(int(d))# 将 Depth 文本显示为汉语pil_img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))draw = ImageDraw.Draw(pil_img)font = ImageFont.truetype("msyh.ttc", 36)  # 使用微软雅黑字体,大小为36draw.text((face[10][0] - 95, face[10][1] - 5), f'距离:{int(d)}厘米', font=font, fill=text_color)img = cv2.cvtColor(np.array(pil_img), cv2.COLOR_RGB2BGR)h, w, c = img.shapebytesPerLine = c * wif c == 3:  # 如果颜色通道为3(BGR)q_img = QtGui.QImage(img.data, w, h, bytesPerLine, QtGui.QImage.Format_BGR888)else:  # 如果颜色通道为4(BGRA)q_img = QtGui.QImage(img.data, w, h, bytesPerLine, QtGui.QImage.Format_BGRA8888)# Convert QImage to QPixmappixmap = QtGui.QPixmap.fromImage(q_img)# Display QPixmap on QLabelself.video_label.setPixmap(pixmap)self.video_label.setScaledContents(True)self.video_label.update()cv2.waitKey(1)def stop_capture(self):self.capture_active = Falseif __name__ == '__main__':app = QApplication(sys.argv)icon = QtGui.QIcon(':/jay.ico')app.setWindowIcon(icon)# 创建可拖动窗口实例ui = guWindow()  # 函数# 显示窗口ui.show()# 启动应用程序事件循环sys.exit(app.exec_())

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/803192.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Session

文章目录 1.Session基本介绍1.Session有什么用?2.Session基本原理3.Session可以做什么&#xff1f;4.如何理解Session&#xff1f;5. Session基本使用 2.Session底层机制1.示意图2.创建session底层机制1.有sessionid&#xff0c;但没session对象1.由于访问了jsp的主页面&#…

vue实现富文本编辑器的具体方法

可以实现富文本的插件&#xff1a;vue-quill-editor、editor-for-vue 我们以 editor-for-vue 为例实现&#xff1a; 传送门&#xff1a;wangEditor官网地址 安装&#xff1a; npm install wangeditor/editor --save npm install wangeditor/editor-for-vue --save具体使用方…

分布式锁的原子性问题

4.6 分布式锁的原子性问题 更为极端的误删逻辑说明&#xff1a; 线程1现在持有锁之后&#xff0c;在执行业务逻辑过程中&#xff0c;他正准备删除锁&#xff0c;而且已经走到了条件判断的过程中&#xff0c;比如他已经拿到了当前这把锁确实是属于他自己的&#xff0c;正准备删…

【matlab非线性规划工具箱安装2 GloptiPoly 3.10工具箱】

【matlab非线性规划工具箱安装2 GloptiPoly 3.10工具箱】 该博客是非线性手眼标定代码中所依赖的matlab工具箱的安装内容&#xff0c;除了进行手眼标定以外&#xff0c;该工具箱还可以用于其他的非线性规划问题 在安装该工具箱之前请先安装SeDuMi 手眼标定传送门&#xff1a…

实验案例一:交换机的初始配置

1、实验环境 实验用具包括一台 Cisco 交换机&#xff0c;一台 PC&#xff0c;一根 Console 线缆。 2、需求描述 如图 5.17 所示&#xff0c;实验案例一的配置需求如下。 通过 PC 连接并配置一台 Cisco 交换机在交换机的各个配置模式之间切换将交换机主机的名称改为 BDON 3、…

上门服务小程序|上门服务系统|上门服务软件开发流程

在如今快节奏的生活中&#xff0c;上门服务小程序的需求越来越多。它们向用户提供了方便、高效的服务方式&#xff0c;解决了传统服务行业中的很多痛点。如果你也想开发一个上门服务小程序&#xff0c;以下是开发流程和需要注意的事项。 1、确定需求&#xff1a;在开始开发之前…

✌2024/4/3—力扣—整数反转

代码实现&#xff1a; int reverse(int x) {long num 0;while (x ! 0) {num num * 10 x % 10;x x / 10;}if ((int)num ! num) {return 0;}return (int)num; }

Spring Cloud微服务入门(五)

Sentinel的安装与使用 安装部署Sentinel 下载Sentinel&#xff1a; https://github.com/alibaba/Sentinel/releases Sentinel控制台 https://localhost:8080 用户和密码为sentinel 使用Sentinel 加依赖&#xff1a; 写配置&#xff1a; 输入&#xff1a; java -Dserver.po…

UI自动化测试-pytest框架

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

Lua热更新(AssetBundle)

AssetBundle 新版本导入ab包报错,则删除其中的Tests文件夹。 给资源分组 打包设置:平台、路径、重复打包清空文件夹、复制到streaming文件夹 建议勾选 建议使用LZ4压缩方式 用来观察文件中的包大小,不常用 参数总结: 这六个只做了解,重要的是上面的

Struts2的入门:新建项目——》导入jar包——》jsp,action,struts.xml,web.xml——》在项目运行

文章目录 配置环境tomcat 新建项目导入jar包新建jsp界面新建action类新建struts.xml,用来配置action文件配置Struts2的核心过滤器&#xff1a;web.xml 启动测试给一个返回界面在struts.xml中配置以实现页面的跳转&#xff1a;result再写个success.jsp最后在项目运行 配置环境 …

【数据分享】我国第七次人口普查的100m分辨率人口栅格数据(免费获取\tif格式\2020年)

人口空间分布数据是我们在各项研究中经常使用的数据。之前我们分享过来源于LandScan数据集的2000-2022年的1km精度的人口空间分布栅格数据&#xff08;可查看之前的文章获悉详情&#xff09;&#xff01; 相较于LandScan全球人口数据集&#xff0c;我国历次人口普查的数据对于…

SpringBoot通用模块--文件上传开发(阿里云OSS)

文件上传&#xff0c;是指将本地图片、视频、音频等文件上传到服务器上&#xff0c;可以供其他用户浏览或下载的过程。文件上传在项目中应用非常广泛&#xff0c;我们经常发抖音、发朋友圈都用到了文件上传功能。 实现文件上传服务&#xff0c;需要有存储的支持&#xff0c;那…

基于支持 GPT 的服务的初创公司

Kafkai&#xff1a;多语言长篇内容生成&#xff0c;AI写作的新趋势 介绍 随着生成式预训练 Transformer (GPT) 的出现&#xff0c;技术世界正在见证范式转变。 这种人工智能驱动的创新不仅仅是一种转瞬即逝的趋势&#xff0c;而是一种趋势。 它已成为科技行业的基石&#xff0c…

【C语言】简单介绍进制和操作符

&#x1f308;个人主页&#xff1a;是店小二呀 &#x1f308;C语言笔记专栏&#xff1a;C语言笔记 &#x1f308;C笔记专栏&#xff1a; C笔记 &#x1f308;喜欢的诗句:无人扶我青云志 我自踏雪至山巅 本文简要介绍进制和操作符&#xff0c;愿能为您提供帮助&#xff01;文章…

异常的种类

Oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645 Oracle 运行时错误可以分为 Oracle 错误和用户自定义错误&#xff0c;与此对应&#xff0c;根据异常产生的机制和原理&#xff0c;可将 Oracle 的系统异常分为 3 种 预定义…

使用VPN时,Java程序无法访问远程网络的解决办法

应用场景&#xff1a; 电脑连接VPN之后&#xff0c;Java程序无法连接远程服务&#xff0c;比如第三方接口、远程数据库连接、远程微服务等。我个人遇到的情况有连接海康威视SDK&#xff0c;influxdb以及一些微服务。 解决办法&#xff1a; 启动Java时加入参数&#xff1a;-D…

比较好玩的车子 高尔夫6

https://www.sohu.com/a/484063087_221273 四万多如愿收获手动挡高尔夫6&#xff0c;可靠性、经济性、操控性兼顾_搜狐汽车_搜狐网 2.基本上其他人也不知道到底是什么相关的车子信息

基于单片机和ICL7135多档位数字电压表设计

**单片机设计介绍&#xff0c;基于单片机和ICL7135多档位数字电压表设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机和ICL7135的多档位数字电压表设计是一个结合了硬件与软件技术的综合性项目。这种设计旨在实现一…

Pnpm + Turbo 搭建 Web Component Monorepo 组件库

技术选型 使用 Pnpm Turbo 搭建 Web Component Monorepo项目 stencil-component-ui 组件库 pnpm 作为包管理器Turborepo 作为构建系统Vitepress 管理文档 pnpm 技术 什么是 pnpm? 它有哪些优势&#xff1f; pnpm 跟 npm、yarn一样&#xff0c;都是用于管理Node包依赖的管…