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



系列文章链接
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添加界面(三)相关推荐

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

    [原创文章]欢迎正常授权转载(联系作者) [反对恶意复制粘贴,如有发现必维权] [微信公众号原文传送门] CSDN上好多人留言想要我上面程序的源码,但是真的抱歉,由于种种原因我不能直接将这个代码给大家 ...

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

    [原创文章]欢迎正常授权转载(联系作者) [反对恶意复制粘贴,如有发现必维权] [微信公众号原文传送门] 上篇详细介绍实现利用PyQt给SSD加界面的三种方案(没学的赶快点进来学呀,哈哈).这篇将详细 ...

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

    [原创文章]欢迎正常授权转载(联系作者) [反对恶意复制粘贴,如有发现必维权] [微信公众号原文传送门] ​这篇文章将详细介绍利用多进程的实现-方案3(代码获取见文章末尾).相比之前的稍微复杂一点,先 ...

  4. pascal行人voc_利用Pascal VOC目标检测数据深度学习进行目标检测

    利用 Pascal VOC 目标检测数据深度学习进行目标检测 穆玉理 [期刊名称] <通讯世界> [年 ( 卷 ), 期] 2018(000)005 [摘要] 随着信息社会的发展 , 尤其 ...

  5. 睿智的目标检测20——利用mAP计算目标检测精确度

    睿智的目标检测20--利用mAP计算目标检测精确度 学习前言 GITHUB代码下载 知识储备 1.IOU的概念 2.TP TN FP FN的概念 3.precision(精确度)和recall(召回率 ...

  6. CV:基于深度学习实现目标检测之GUI界面产品设计并实现图片识别、视频识别、摄像头识别(准确度非常高)

    CV:基于深度学习实现目标检测之GUI界面产品设计并实现图片识别.视频识别.摄像头识别(准确度非常高) 目录 GUI编程设计界面 产品演示 GUI编程设计界面 产品演示 视频演示:https://bl ...

  7. 【三维目标检测】VoxelNet(三):模型详解

    前两节详细介绍了VoxelNet的数据处理部分,本节主要介绍VoxelNet详细的模型结构及其损失函数.数据处理部分请参考:三维点云目标检测 - VoxelNet详解之数据处理 (二)_Coding的 ...

  8. 目标检测论文综述(三)One-Stage(YOLO系列)

    一.CNN based One-Stage Detectors 所有论文综述均保持如下格式: 1.一页PPT内容总结一篇论文 2.标题格式一致:出处 年份 <标题> 3.内容格式一致:针对 ...

  9. 利用yolov3 进行目标检测(可自定义检测的类别)

    最近在研究车辆检测相关算法,因yolo算法的速度和精度基本均能满足要求,原版的yolo v3算法是检测多类物体,本人是在原来代码的基础上修改为检测单目标车辆,并基于预训练权重在VOC2007数据集上进 ...

最新文章

  1. MyBatis和SpringMVC集成事务在Junit测试下有效但是在实际项目无效的问题
  2. wagtail python cms 测试部署
  3. Dubbo与SpringBoot整合流程(从实例入手,附代码下载)
  4. 华软linux虚拟机密码,Linux_账户和组管理
  5. 【完整可运行代码】剑指 Offer 29. 顺时针打印矩阵
  6. 在基于图论的Java程序中基于DSL的输入图数据的方法
  7. 《UNIX环境高级编程 3rd》笔记(1 / 21):UNIX基础知识
  8. 金蝶kis云,调用增删改查注意点
  9. JS之Window对象
  10. MFC开发之显示网页
  11. 【网络安全】最全渗透学习攻略
  12. 163接收邮件服务器pop3,pop3设置(163邮箱imap pop3设置)
  13. 各版本音标 IPA DJ KK 音标对照表
  14. EXP-00091: Exporting questionable statistics
  15. 2021年12月中国A股钢铁行业上市企业市值排行榜:行业总市值较11月增长1.18%,金洲管道增幅最大(附月榜TOP44详单)
  16. 关于开源软件开发的若干问题
  17. 冰刃 IceSword1.22 中文版
  18. 袋鼠云研发手记 | 开源·数栈-扩展FlinkSQL实现流与维表的join
  19. python字体有哪些种类_Python的数据类型(字符串类型),python
  20. linux “<“ 会引发血案

热门文章

  1. Xmodem Ymodem Zmodem
  2. 不会 Python 没关系,手把手教你用 web scraper 抓取豆瓣电影 top 250 和 b 站排行榜...
  3. PTA乙级 1096 大美数——15分
  4. 数字音频与模拟音频的区别?
  5. 用Go语言 实现的数学相关案例汇总 (Golang经典编程案例)
  6. 关系型数据库SQL开发语言
  7. 我从「空气换大饼」中看到的是,币安智能链何时有这么多资产和玩家了?
  8. mysql双机备份最简单_MySQL的本地备份和双机相互备份脚本
  9. 闪银奇异java面试题_2021年闪银奇异Java高级 招聘招聘-闪银奇异Java高级 招聘招聘求职信息-拉勾招聘...
  10. 公主同盟自然流程攻略(GBA版)第1关 盗贼山寨