python使用pyqt多线程来显示视频_pyqt多进程显示视频_雅痞匪徒(Nike)的博客-程序员宅基地

技术标签: python  多线程  python技术  

在正式开始之前,得说几句感想,在最初学python的时候,对于多线程多进程,只有一个概念以及知道大概怎么用,但是什么情况下使用多线程,什么情况下使用多进程,我对这个概念还不是很清晰,正好前一个月左右做了个项目,在这个项目中,我使用了多线程来在界面上显示视频,今天想了想,还是写上这个,用于以后自己看或者给其他有兴趣的朋友看。

使用的技术:python + pyqt + opencv

在使用pyqt的过程中,我们经常就会遇到一种情况,当我们在界面上要显示视频的时候,会出现卡死的情况,要解决这个问题,就得用到多线程的技术,利用分出去的线程来处理后台发过来的图像数据,然后线程将这个图像进行显示。

首先,在Pyqt中,我们如何利用designed来设计整个软件的模样,如何让这个软件的界面好看,这个不属于我们这篇文章的讨论内容,我们值讨论如何让界面正常的显示视频并且不会卡顿。

为了解决这个问题,我们可以得了解pyqt的信号机制这些,这些也不属于我这篇文章讨论的内容,有不明白的可以自行了解,在这个问题中,我们要解决这个问题,得构建一个类,这个类继承pyqt中的QThread,代码如下:

'''this code is designed by nike hu'''
class imageThread(QThread):
    showImage = pyqtSignal(object) # 这里可以不要,这里是定义信号的
    def __init__(self, image): # 在调用这个类的时候传入image这个参数
        super().__init__()
        self.image = image

    def run(self): # 在使用这个类的时候直接调用这个接口就行
        # self.showImage.emit(image_color)
        image = self.image
        (imageH, imageW) = image.shape[0:2]
        Qimag = cv2.cvtColor(image, cv2.COLOR_RGB2BGR) # pyqt中正常显示图片需要将opencv中的bgr转化为rgb
        QiM = QImage(Qimag.data, imageW, imageH,
                     imageW * 3, QImage.Format_RGB888) # 这也是将图像显示在界面中的必备步骤,QImage是从PyQt5.QtGui中导入的
        ui.hotImage.setPixmap(QPixmap.fromImage(QiM)) # ui.hotImage是pyqt中的lable控件,这个名字是你在画界面的时候自己定义的

在处理这类问题的时候,我的处理方法一般是把整个界面当成一个主线程,然后我会另外开一个线程来处理后台的数据,我们将这个线程称为子线程1,那么子线程1在处理接收到的每一帧图像数据的时候,我要么在子线程1的基础上另外开一个子线程2来处理图像的线程,子线程2将图像显示完就自己结束自己,或者我在主线程上开两个线程,一个子线程1,一个子线程2,子线程2是一个while循环,子线程1负责处理后台数据,然后通过全局变量的方式,子线程2来读取子线程1处理的图像数据,经过我的实验,最后界面是不再存在卡顿的现象。由于我的那个涉及到显示视频的是一个完整的项目,要将里面的代码拆分出来显示,不好拆分,所以就不再贴代码了,思路我已经提供了。对了,注意视频流图像读取的速度以及界面显示图像的速度,如果是毫无间隙的进行操作,也可能会出现卡顿现象,这时候,使用time.sleep(0.01)让这个线程休息0.01s或者再稍微长一点的时间,那么就可以避免这个问题的产生。

总结一下:多线程适用这种i/o延时高的操作,如果后台涉及到大量的数据运算的情况,那么就必须得利用多进程了,我有空会写一篇来处理人脸识别中导致的视频显示的效果帧数太低的情况。

2020 4.14

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/yapifeitu/article/details/105513187

智能推荐

C语言X天学习计划——期末篇(选择篇三)_122 c语言中的文件类型只有()。 a) 索引文件和文本文件两种 b) ascii文件和二-程序员宅基地

10121fgets(str,n,fp)函数从文件中读入一个字符串,以下正确的叙述是()。CA)字符串读入后不会自动加入’\0’B)fp是file类型的指针C)fgets函数将从文件中最多读入n-1个字符D)fgets函数将从文件中最多读入n个字符10122C语言中的文件类型只有()。BA)索引文件和文本文件两种B)ASCII文件和二进制文件两种C)文本文件一种D)二进制文件一种10123C语言中,文件由()。DA)记录组成B)由数据行组成C)_122 c语言中的文件类型只有()。 a) 索引文件和文本文件两种 b) ascii文件和二

H.264几大开源编码器简介_单片机 h264 移植-程序员宅基地

1 JM德国hhi研究所负责开发的H.264的官方测试源码,对于264的学术研究和比较都必须基于JM。JM完全实现了H.264的全部内容,JM8.6之前的版本实现了H.264_200503标准,8.6之后的版本开始开始支持H.264附加案的高保真技术。但JM程序结构非常复杂,编码复杂度极高,只考虑对所有技术的完整实现,而忽视了实用性。JM包括了编码和解码。2 X_单片机 h264 移植

【机器人学习】分拣机器人运动学分析及轨迹规划仿真_CAE工作者的博客-程序员宅基地

一、 目的1、设计一个六自由度机器人,至少包含一个伸缩关节,要求机器人工作空间能满足分拣工位要求。2、根据自己设计的机器人,建立DH坐标系,设定各关节变量的取值范围,并列出齐次变换矩阵并在matlab进行仿真。二、内容1、下载并安装MATLAB里的 Robotic机器人工具箱。2、编写机器人位姿运动学方程,即给定关节变量,求解机器人末端相对于基坐标的齐次变换矩阵。并在此基础上,用工具箱里的命令fkine验证程序的正确性。3、编写机器人速度运动学中求解雅克比矩阵的程序,并在此基础上,用工具箱里的命

swagger3.0中,如何在@GetMapping中写多个参数,包括数组类型的参数_getmapping多个参数-程序员宅基地

如何在@GetMapping中写多个参数,包括数组类型的参数一、直接上代码@PreAuthorize("@ss.hasPermi('zdy:yfsYy:list')")@GetMapping("/yfs/send/{jiHuaId}&&{yiYuanIds}")@ApiOperation("一键发送到************计划")@ApiImplicitParams({@ApiImplicitParam(name = "jiHuaId",value = "计划id",requi_getmapping多个参数

Java多线程系列--“JUC集合”08之 LinkedBlockingQueue-程序员宅基地

LinkedBlockingQueue介绍LinkedBlockingQueue是一个单向链表实现的阻塞队列。该队列按 FIFO(先进先出)排序元素,新元素插入到队列的尾部,并且队列获取操作会获得位于队列头部的元素。链接队列的吞吐量通常要高于基于数组的队列,但是在大多数并发应用程序中,其可预知的性能要低。此外,LinkedBlockingQueue还是可选容量的(防止过度膨胀),即可以指定...

eclipse, idea安装lombok插件-程序员宅基地

参考博客:https://www.cnblogs.com/quan-coder/p/8387040.html一:在开发工具中安装插件:Eclipse:  下载地址:https://projectlombok.org/download  将下载的lombok.jar文件,放到eclipse安装路径,该jar包也就是lombok插件的jar文件了, 如下图   然后打..._io.renren.common.validator.group不存在

随便推点

layUI的富文本编辑器和图片的上传_layedit富文本插入本地图片-程序员宅基地

layUI的富文本编辑器需要注意的几点一,创建富文本编辑器<div class="layui-input-block"> <textarea id="teacherSy" class="layui-textarea" name="teacherSynopsis"lay-verify="teacherSynopsis" ></textarea> </div>这是必须的 var editIndex _layedit富文本插入本地图片

flume 1.7.0用户手册_flume插件目录pluguins.d-程序员宅基地

原文链接:http://www.jianshu.com/p/50f384b86bdf介绍概述Apache Flume是为有效收集聚合和移动大量来自不同源到中心数据存储而设计的可分布,可靠的,可用的系统。Apache Flume的用途不仅限于日志数据聚合。由于数据源是可定制的,Flume可用于传输大量事物数据包括但不限于网络流量数据,社交媒体产生的数据,Email消息和很多其它类型的_flume插件目录pluguins.d

Cache和Buffer的区别-程序员宅基地

结合文章:RAM、ROM、高速缓冲存储区别与联系 内存在电脑中起着举足轻重的作用。内存一般采用半导体存储单元,包括随机存储器(RAM),只读存储器(ROM),以及高速缓存(CACHE)。只不过因为RAM是其中最重要的存储器,所以通常所说的内存即指电脑系统中的RAM。 RAM要求每时每刻都不断地供电,否则数据会丢失。如果在关闭电源以后RAM中的数据也不丢失就好了,这样就可以在每一次开机...

扒站,仿站,下载网页,工具,软件,神器,无脑傻瓜版,一键操作_扒站工具网页版-程序员宅基地

一个扒站神器,通俗易懂的操作,加上简洁明快的界面。并且下载好的网站自动打包、整理,真正实现傻瓜式一键扒站下载的网站:自动打包整理: 链接地址:https://download.csdn.net/download/qq_42177208/10553353..._扒站工具网页版

Tomcat需不需要配置环境变量的问题_tomcat需要配置环境变量吗-程序员宅基地

一.问题导入Tomcat究竟需不需要配置环境变量?配置环境这对于很多初学者来说,是个头疼的问题。行不行,试试才知道。实践是检验真理的唯一标准。二.分析问题我现在使用的是绿色解压版,亲测是不用配置环境变量的。如下图所示我并没有配置什么CATALINA_HOME。1.本地启动Tomcat2.你或许不是很喜欢黑窗口界面,我们可以使用图形化界面来启动Tomcat,但是我们发现如下图所示无法..._tomcat需要配置环境变量吗

php ajax缓存,AJAX 缓存问题的两种解决方法(IE)-程序员宅基地

ajax 清除缓存的两种方法做一个项目用到Ajax,开始觉得挺好,后来发现一个问题,例如删除一项,恢复之后就不能再接着删除,必须要等一段时间,后来知道是IE缓存的问题AJAX缓存页面是一个刚接触AJAX的人一定会遇到的问题,造成这个问题的关键性人物又是Ie...在网上找了好多资料后,总结一下1:在AJAX请求的页面后加个随机函数,我们可以使用随机时间函数在javascript发送的URL后加上t=..._ajax请求php有缓存吗