【搞事情】利用PyQt为目标检测SSD300添加界面(三)

2024-04-25 19:08

本文主要是介绍【搞事情】利用PyQt为目标检测SSD300添加界面(三),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【原创文章】欢迎正常授权转载(联系作者)
【反对恶意复制粘贴,如有发现必维权】
【微信公众号原文传送门】


软件最终效果


系列文章链接
1. 问题总体描述及三种方案;
2. 方案1详解(附代码);

这篇文章将详细介绍方案2的实现(代码获取见文章末尾)。

老规矩先看看下载好的代码文件构成。
在这里插入图片描述
其中 “ssd” 文件夹中是SSD检测的关键文件,关于这部分之前写文章了,里面详细介绍了如何训练一个属于自己的SSD300,有代码、有预训练的权值文件,不清楚的请移步这里


需求分析

先简单做一个需求分析,看看我们要怎样实现。
在这里插入图片描述
首先,要解决的问题:电脑性能太好(如果你有的话,土豪交朋友吗?),导致使用帧循环的方法时,视频会被“加速”播放,我们想让它按正常的速度播放。
之后,我们先了解一个概念FPS(每秒帧数),对应的可以计算出一帧应该显示几秒。例如:

(FPS: Frames Per Second)
FPS = 20  
(TPF: times Per Frame,这个是我自己造的,哈哈哈哈)    
TPF = 1 / 20 (单位:s)

只要控制 读取图像–>检测–>显示 的节奏,让显示图像的时间与视频的 FPS 对应,那么看起来视频就是正常播放的啦。

通过 计时器(QTimer) 可以很好的实现这个需求,计时器时间一到就会发送 “超时信号 给对应的槽函数(用于检测显示),槽函数收到信号后就开始执行,槽函数执行结束后等待再一次被调用。

最后一个需求是要通过界面的按钮来控制 开始结束 ,这个就很简单,构造函数里实例化计时器,然后在对应的槽函数里 开始停止 计时器就可以了。


代码分析

下面开始详细介绍代码。主要介绍下面几个函数,其他的函数在上篇文章中已经讲过或者比较简单,就不介绍了。(偷个懒,嘿嘿嘿)

1. 构造函数
def __init__(self, parent=None):
"""...上一篇文章已经介绍过......这里就不写了......这里说点不一样的...
"""
# 视频文件路径self.camera_index = None    # 用于保存视频文件路径self.FPS = None             # 用于保存视频文件FPS# 初始化计时器self.timer = QTimer(self)  # 更新计时器self.timer.timeout.connect(self.timer_update) # 超时信号连接对应的槽函数

在构造函数中初始化必要的变量,同时实例化一个 QTimer计时器 ,并将 “超时”信号 与对应的槽函数绑定起来。代码中self.timer_update为计时器超时信号的槽函数,这里作为参数传入不可以加’()’,后面会详细说。

2. ‘开始’点击槽函数
def on_pushButton_start_clicked(self):"""Slot documentation goes here."""# TODO: not implemented yet# 获取数据流self.cap = cv2.VideoCapture(self.camera_index)if self.cap.isOpened():# 获取视频的FPS# FPS ---- 每秒多少帧self.FPS = self.cap.get(cv2.CAP_PROP_FPS)if isinstance(self.FPS, float):         # 正常获取的FPS是floatself.FPS = int(self.FPS)            # 如果正确获取FPS就保存在变量else:self.FPS = 20                       # 没正确获取则设为 20帧/s# 计时器开始计时# 计时器的参数为 ms 为了正常速度播放,计时器的参数计算为 1/FPS * 1000 = 1000/FPSself.timer.start(int(1000/self.FPS))# 锁定开始按钮self.pushButton_start.setEnabled(False)else:QMessageBox.warning(self, '数据流打开警告', '数据流打开错误!\n请重新尝试。')

该函数的主要功能是:打开视频数据流获取视频流的FPS计时器开始计时。需要注意的是计时器的时间设置问题。
函数self.timer.start(时间,单位:ms)的参数与 1/FPS 之间还需要乘以 1000 ,同时这个值还应该考虑到图像预处理以及检测的时间,适当的减小这个值,如果不考虑的话可能会出现“慢速播放”。

3. ‘结束’点击槽函数

该函数比较简单,主要功能是停止计时器的功能,同时为下一次检测做准备。

def on_pushButton_end_clicked(self):"""Slot documentation goes here."""# TODO: not implemented yet# 重设self.resst_detector()    # 详细代码在下方# 清除显示self.textEdit.clear()def resst_detector(self):"""重设检测器,为下一次检测准备:return:"""# 释放摄像头if hasattr(self, 'cap'):self.cap.release()del self.cap# 释放‘开始’按钮self.pushButton_start.setEnabled(True)# 显示空白图片self.show_img(self.img_none)# 停止计时器self.timer.stop()
4. 计时器槽函数
def timer_update(self):"""计时器槽函数:return:"""if self.cap.isOpened():# 读取图像ret, self.img_scr = self.cap.read()# 如果视频读取完毕if not ret:# 计时器停止计时self.timer.stop()# 对话框提示QMessageBox.information(self, '播放提示', '视频已播放完毕!')# 释放摄像头if hasattr(self, 'cap'):self.cap.release()del self.cap# 释放‘开始’按钮self.pushButton_start.setEnabled(True)# 预处理图片# 转为RGBself.img_scr = cv2.cvtColor(self.img_scr, cv2.COLOR_BGR2RGB)# 检测self.preds = self.ssd.Predict(self.img_scr)# 过滤self.preds = self.filter(self.preds, inclued_class=self.include_class)self.img_scr = self.draw_img(self.img_scr, self.preds)
​h, w = self.img_scr.shape[:2]self.text = self.decode_preds(self.preds, w=w, h=h)self.textEdit.setText(self.text)# 显示图像self.show_img(self.img_scr)# 响应UIQApplication.processEvents()else:self.textEdit.setText('数据流未打开!!!\n请检查')self.resst_detector()    # 没有打开就重设一下

看过上篇文章的是不是很熟悉,没错。基本就是帧循环里面的东西。

5. ‘文件打开’槽函数

为了方便更换被检测视频,创建了一个按钮用于打开文件对话框选择文件,基本功能就是为了实现给变量self.camera_index赋值。

def on_pushButton_open_clicked(self):"""Slot documentation goes here."""# TODO: not implemented yet# 打开文件对话框path = QFileDialog.getOpenFileName(self, '打开待检测视频', './', '*.avi;;*.mp4;;AllFile(*.*)', '')if path[0] != '':    # 点‘取消’,path[0]的值会为‘’path = os.path.normpath(os.path.abspath(path[0]))self.camera_index = pathself.textEdit.setText('{}已选中!'.format(path))else:self.textEdit.setText('当前未选中任何文件')
​预告:方案3应该下周整理完毕并更新

关注下方公众号,回复关键字即可获取下载地址。
  • 本文配套源代码下载地址::

    回复“SSD界面2”获取。


如果你读后有收获,欢迎关注我的微信公众号
上面有更多完全免费教程,我也会不定期更新
ღ ღ ღ 打开微信扫描下方二维码关注 ღ ღ ღ

在这里插入图片描述

这篇关于【搞事情】利用PyQt为目标检测SSD300添加界面(三)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/935541

相关文章

Python中构建终端应用界面利器Blessed模块的使用

《Python中构建终端应用界面利器Blessed模块的使用》Blessed库作为一个轻量级且功能强大的解决方案,开始在开发者中赢得口碑,今天,我们就一起来探索一下它是如何让终端UI开发变得轻松而高... 目录一、安装与配置:简单、快速、无障碍二、基本功能:从彩色文本到动态交互1. 显示基本内容2. 创建链

如何用Java结合经纬度位置计算目标点的日出日落时间详解

《如何用Java结合经纬度位置计算目标点的日出日落时间详解》这篇文章主详细讲解了如何基于目标点的经纬度计算日出日落时间,提供了在线API和Java库两种计算方法,并通过实际案例展示了其应用,需要的朋友... 目录前言一、应用示例1、天安门升旗时间2、湖南省日出日落信息二、Java日出日落计算1、在线API2

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

烟火目标检测数据集 7800张 烟火检测 带标注 voc yolo

一个包含7800张带标注图像的数据集,专门用于烟火目标检测,是一个非常有价值的资源,尤其对于那些致力于公共安全、事件管理和烟花表演监控等领域的人士而言。下面是对此数据集的一个详细介绍: 数据集名称:烟火目标检测数据集 数据集规模: 图片数量:7800张类别:主要包含烟火类目标,可能还包括其他相关类别,如烟火发射装置、背景等。格式:图像文件通常为JPEG或PNG格式;标注文件可能为X

基于 YOLOv5 的积水检测系统:打造高效智能的智慧城市应用

在城市发展中,积水问题日益严重,特别是在大雨过后,积水往往会影响交通甚至威胁人们的安全。通过现代计算机视觉技术,我们能够智能化地检测和识别积水区域,减少潜在危险。本文将介绍如何使用 YOLOv5 和 PyQt5 搭建一个积水检测系统,结合深度学习和直观的图形界面,为用户提供高效的解决方案。 源码地址: PyQt5+YoloV5 实现积水检测系统 预览: 项目背景

JavaFX应用更新检测功能(在线自动更新方案)

JavaFX开发的桌面应用属于C端,一般来说需要版本检测和自动更新功能,这里记录一下一种版本检测和自动更新的方法。 1. 整体方案 JavaFX.应用版本检测、自动更新主要涉及一下步骤: 读取本地应用版本拉取远程版本并比较两个版本如果需要升级,那么拉取更新历史弹出升级控制窗口用户选择升级时,拉取升级包解压,重启应用用户选择忽略时,本地版本标志为忽略版本用户选择取消时,隐藏升级控制窗口 2.

[数据集][目标检测]血细胞检测数据集VOC+YOLO格式2757张4类别

数据集格式:Pascal VOC格式+YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):2757 标注数量(xml文件个数):2757 标注数量(txt文件个数):2757 标注类别数:4 标注类别名称:["Platelets","RBC","WBC","sickle cell"] 每个类别标注的框数:

一款支持同一个屏幕界面同时播放多个视频的视频播放软件

GridPlayer 是一款基于 VLC 的免费开源跨平台多视频同步播放工具,支持在一块屏幕上同时播放多个视频。其主要功能包括: 多视频播放:用户可以在一个窗口中同时播放任意数量的视频,数量仅受硬件性能限制。支持多种格式和流媒体:GridPlayer 支持所有由 VLC 支持的视频格式以及流媒体 URL(如 m3u8 链接)。自定义网格布局:用户可以配置播放器的网格布局,以适应不同的观看需求。硬

Temu官方宣导务必将所有的点位材料进行检测-RSL资质检测

关于饰品类产品合规问题宣导: 产品法规RSL要求 RSL测试是根据REACH法规及附录17的要求进行测试。REACH法规是欧洲一项重要的法规,其中包含许多对化学物质进行限制的规定和高度关注物质。 为了确保珠宝首饰的安全性,欧盟REACH法规规定,珠宝首饰上架各大电商平台前必须进行RSLReport(欧盟禁限用化学物质检测报告)资质认证,以确保产品不含对人体有害的化学物质。 RSL-铅,

Python知识点:如何使用Python开发桌面应用(Tkinter、PyQt)

Python 提供了多个库来开发桌面应用程序,其中最常见的两个是 Tkinter 和 PyQt。这两者各有优点,选择取决于你的需求。以下我会介绍如何使用 Tkinter 和 PyQt 开发简单的桌面应用程序。 1. 使用 Tkinter 开发桌面应用 Tkinter 是 Python 的标准库,它非常轻量级且跨平台。它适合开发简单的桌面应用,入门较容易。 安装 Tkinter Tkinte