屏幕距离识别加语音提醒

news2024/9/24 1:27:38

效果

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.3
        f = 600
        d = (W * f) / w
        print(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)  # 使用微软雅黑字体,大小为36
        draw.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 QLabel2
        self.user_name_qwidget = self.gu.lineEdit
        self.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():
                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.5
                f = 600  # 焦距
                d = (W * f) / w
                print(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 value
                self.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)  # 使用微软雅黑字体,大小为36
                draw.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.shape
            bytesPerLine = c * w
            if 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 QPixmap
            pixmap = QtGui.QPixmap.fromImage(q_img)
            # Display QPixmap on QLabel
            self.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 np

class 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 QLabel2
        self.user_name_qwidget = self.gu.lineEdit
        self.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.")
            return
        cap = cv2.VideoCapture(0)
        self.detector = FaceMeshDetector(maxFaces=1)
        pygame.mixer.init()
        # 加载音频文件
        pygame.mixer.music.load('7359.wav')  # 靠的太近啦
        self.capture_active = True

        def play_audio():
            pygame.mixer.music.play(1)
            while pygame.mixer.music.get_busy():
                continue

        while 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.5
                f = 600  # 焦距
                d = (W * f) / w
                print(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 value
                self.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)  # 使用微软雅黑字体,大小为36
                draw.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.shape
            bytesPerLine = c * w
            if 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 QPixmap
            pixmap = QtGui.QPixmap.fromImage(q_img)
            # Display QPixmap on QLabel
            self.video_label.setPixmap(pixmap)
            self.video_label.setScaledContents(True)
            self.video_label.update()
            cv2.waitKey(1)

    def stop_capture(self):
        self.capture_active = False

if __name__ == '__main__':
    app = QApplication(sys.argv)
    icon = QtGui.QIcon(':/jay.ico')
    app.setWindowIcon(icon)
    # 创建可拖动窗口实例
    ui = guWindow()  # 函数
    # 显示窗口
    ui.show()
    # 启动应用程序事件循环
    sys.exit(app.exec_())

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

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

相关文章

im即时通讯源码/仿微信app源码+php即时通讯源码带红包+客服+禁言等系统php+uniapp开发

即时通讯(IM)系统是现代互联网应用中不可或缺的一部分&#xff0c;它允许用户进行实时的文本、语音、视频交流。随着技术的发展&#xff0c;IM系统的功能越来越丰富&#xff0c;如红包、客服、禁言等。本文将探讨如何使用PHP语言开发一个功能完备的即时通讯系统&#xff0c;包括…

git commit 提交报错pre-commit hook failed (add --no-verify to bypass) 解决方法,亲测有效

问题截图 今天在执行 git commit 命令时报错&#xff1a;pre-commit hook failed (add --no-verify to bypass) 解决 参考文章&#xff1a;git commit报错&#xff1a;pre-commit hook failed的解决方法 具体原理什么的就不解释了&#xff0c;可以看看上面的参考文章 解决方…

《Fundamentals of Power Electronics》——脉宽调制器建模

下图给出了一个简单脉宽调制器电路的原理图。 脉宽调制器电路产生一个用于指令转换器功率管导通和关断的逻辑信号δ(t)。该逻辑信号δ(t)是周期性的&#xff0c;其频率为fs&#xff0c;占空比为d(t)。脉宽调制器的输入是一个模拟控制信号vc(t)。脉宽调制器的作用是产生一个与模…

开源!自制一个桌面宠物(STM32CUBEMX HAL库 PWM波 小项目)

原视频&#xff1a;好&#xff0c;自制一个桌面宠物&#xff01;_哔哩哔哩_bilibili 基础所需&#xff1a;基础电路认识&#xff0c;C语言&#xff0c;STM32开发&#xff0c;STM32CUBEIDE或CUBEMX和Keil使用&#xff08;重要&#xff09;&#xff0c;一点点艺术细胞、一点点耐…

前端之深拷贝

前提&#xff1a; 就是在实际开发中&#xff0c;我有一个编辑的弹窗&#xff0c;可以查看和编辑&#xff0c;因为弹窗里面是一个步骤条&#xff0c;点击下一步就要向对应的接口发送请求&#xff0c;考虑到就比如我点击下一步&#xff0c;此次表箱信息其实不需要修改&#xff0…

Linux —— 信号(2)

Linux —— 信号&#xff08;2&#xff09; 信号的序号kill系统调用不可被自定义的信号raiseabort 异常传递信号SIGFPESIGSEGV alarm传递信号 我们今天来接着了解信号&#xff1a; 信号的序号 我们来看看信号的序号&#xff1a; 信号的序号是从1开始&#xff0c;到31我们称这…

为什么要梯度累积

文章目录 梯度累积什么是梯度累积如何理解理解梯度累积梯度累积的工作原理 梯度累积的数学原理梯度累积过程如何实现梯度累积 梯度累积的可视化 梯度累积 什么是梯度累积 随着深度学习模型变得越来越复杂&#xff0c;模型的训练通常需要更多的计算资源&#xff0c;特别是在训…

【热门话题】ElementUI 快速入门指南

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 ElementUI 快速入门指南环境准备安装 ElementUI创建 Vue 项目安装 ElementUI 基…

Android selinux权限

一.SE 概述 SELinux 是由美国NSA&#xff08;国安局&#xff09;和 SCC 开发的 Linux的一个扩张强制访问控制安全模块。原先是在Fluke上开发的&#xff0c;2000年以 GNU GPL 发布。从 fedora core 2开始&#xff0c; 2.6内核的版本都支持SELinux。 在 SELinux 出现之前&#…

开源模型应用落地-CodeQwen模型小试-小试牛刀(一)

一、前言 代码专家模型是基于人工智能的先进技术&#xff0c;它能够自动分析和理解大量的代码库&#xff0c;并从中学习常见的编码模式和最佳实践。这种模型可以提供准确而高效的代码建议&#xff0c;帮助开发人员在编写代码时避免常见的错误和陷阱。 通过学习代码专家模型&…

百度语音识别开发笔记

目录 简述 开发环境 1、按照官方文档步骤开通短语音识别-普通话 2、创建应用 3、下载SDK 4、SDK集成 5、相关接口简单说明 5.1权限和key 5.2初始化 5.3注册回调消息 5.4开始转换 5.5停止转换 6、问题 简述 最近想做一些语音识别的应用&#xff0c;对比了几个大厂…

电路笔记 :芯片封装、电阻电容封装类型介绍

芯片的零件型号、位号和封装 项目定义作用零件型号每个零件在设计和制造中的唯一标识符号用于识别零件的特定规格、制造商和其他重要信息位号在电路图或设计图纸上标识每个零件位置的符号帮助准确定位每个零件的位置&#xff0c;以便正确安装到相应位置上封装电子元器件的外部…

AXS2005 2.4W单通道AB类音频功率放大器 兼容HAA8002,LTK8002,NS8002

深圳市润泽芯电子有限公司为爱协生一级代理 技术支持 欢迎试样~Tel&#xff1a;18028786817 AXS2005是爱协生推出的2.4W单通道AB类音频功率放大器 可兼容HAA8002&#xff0c;LTK8002&#xff0c;NS8002&#xff0c;XS8002&#xff0c;XA8002&#xff0c;8002B。 简介 AXS2005…

网络基础(1)网络编程套接字TCP,守护进程化

TCP协议 下面我们来学习一下TCP套接字的使用。 也就是使用一下基本的接口。首先TCP套接字的使用和UDP套接字的使用是大同小异的&#xff0c;但是多了一些步骤。 这里回顾一下&#xff1a;UDP是不可靠的&#xff0c;无连接的协议。而TCP则是可靠的&#xff0c;面向连接的协议…

LNMP部署wordpress

1.环境准备 总体架构介绍 序号类型名称外网地址内网地址软件02负载均衡服务器lb0110.0.0.5192.168.88.5nginx keepalived03负载均衡服务器lb0210.0.0.6192.168.88.6nginx keepalived04web服务器web0110.0.0.7192.168.88.7nginx05web服务器web0210.0.0.8192.168.88.8nginx06we…

真希望我父母读过这本书的笔记(二)

系列文章目录 真希望我父母读过这本书的笔记&#xff08;一&#xff09; 真希望我父母读过这本书的笔记&#xff08;二&#xff09; 文章目录 系列文章目录PART 5 培养心理健康的孩子亲子关系决定心理健康互动及来回交流如何开始交流互看游戏交流恐惧症 若遇棘手之际&#xff0…

机器学习---朴素贝叶斯

朴素贝叶斯是一种用于分类和预测任务的算法&#xff0c;他的原理是基于贝叶斯定理。其中朴素的意思是假设各特征之间相互独立。这个实验我是用的老师课后作业的题目预测某天是否会打乒乓球&#xff0c;假设每个特征独立。 目录 贝叶斯公式&#xff1a; 训练集&#xff1a; 处…

视频剪辑:视频文件元数据修改工具,批量操作提升效率和准确性

在视频剪辑和后期处理的过程中&#xff0c;除了对视频本身的编辑和修改&#xff0c;元数据的管理和修改同样重要。元数据&#xff0c;如标题、艺术家、专辑封面等&#xff0c;不仅提供了视频文件的基本信息&#xff0c;还有助于更好地组织、搜索和共享视频内容。而针对视频文件…

微信答题链接怎么做_新手也能快速上手制作

在数字营销日新月异的今天&#xff0c;如何有效吸引用户参与、提升品牌曝光度&#xff0c;成为了每一个营销人都在思考的问题。而微信答题链接&#xff0c;作为一种新兴的互动营销方式&#xff0c;正以其独特的魅力&#xff0c;在营销界掀起一股新的热潮。今天&#xff0c;就让…

XSS Challenges 靶场通关解析

前言 XSS Challenges&#xff08;跨站脚本攻击挑战&#xff09;是一种用于学习和测试跨站脚本&#xff08;XSS&#xff09;漏洞的实验性平台。这些挑战旨在帮助安全研究人员和开发人员了解XSS漏洞的工作原理、检测方法和防御技巧。 通常&#xff0c;XSS Challenges平台提供一…