0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

PyQT5+OpenCV多线程协作演示

OpenCV学堂 来源:OpenCV学堂 2023-03-08 14:58 次阅读

引言

学习多线程最典型的问题就是如何在多个线程之间传递消息与写作,PyQT5的线程支持在不同线程之间传递信号触发事件,实现多个线程之间的协助,完成诸如生产者-消费者这样经典的多线程协作。本文将通过QThread与信号槽机制构建一个生产者-消费者模型,演示多个线程之间的协作。

应用程序概述

这里演示了一个从图像采集(用本地图像数据集替代)到图像分析处理(简单二值化+形态学处理)、到主界面更新的应用程序。主界面是UI线程、图像采集跟图像分析分别在两个不同的工作线程中,通过信号与槽机制协作工作,相互配合实现图像采集到分析到结果更新到界面线程。

多线程协作信号触发示意图

6747069e-ba80-11ed-bfe3-dac502259ad0.png

代码实现

这样实现了三个类

ImageFetchThread // 图像采集
ImageAnalysisThread // 图像分析
ContentPanel // 界面显示与更新

这三个类的代码分别,interwetten与威廉的赔率体系 图像采集线程

 1classImageFetchThread(QtCore.QThread):
 2fire_stats_signal=QtCore.pyqtSignal(dict)
 3
 4def__init__(self,images_dir):
 5super(ImageFetchThread,self).__init__()
 6self.images_dir=images_dir
 7self.read_next=True
 8
 9defrequest_image(self):
10self.read_next=True
11
12defrun(self):
13iflen(self.images_dir)==0:
14return
15files=os.listdir(self.images_dir)
16idx=0
17whileTrue:
18ifidx==len(files):
19break
20ifself.read_nextisTrue:
21print("graboneimage...")
22image=cv.imread(os.path.join(self.images_dir,files[idx]))
23gray=cv.cvtColor(image,cv.COLOR_BGR2GRAY)
24idx+=1
25self.read_next=False
26self.fire_stats_signal.emit({"im_data":gray})
27self.fire_stats_signal.emit({"done":"done"})
28return

处理图像线程

 1classImageAnalysisThread(QtCore.QThread):
 2request_image_signal=QtCore.pyqtSignal()
 3update_result_signal=QtCore.pyqtSignal(dict)
 4
 5def__init__(self):
 6super(ImageAnalysisThread,self).__init__()
 7self.image_data=None
 8self.stop=False
 9
10defprocess_im(self,results):
11self.image_data=results.get("im_data")
12ifresults.get("done")isnotNone:
13self.stop=True
14
15defrun(self):
16whileTrue:
17ifself.stopisTrue:
18break
19ifself.image_dataisNone:
20continue
21print("startedtoprocessoneimage...")
22#ret,binary=cv.threshold(self.image_data,0,255,cv.THRESH_BINARY|cv.THRESH_OTSU)
23binary=cv.adaptiveThreshold(self.image_data,255,cv.ADAPTIVE_THRESH_GAUSSIAN_C,
24cv.THRESH_BINARY_INV,25,10)
25se=cv.getStructuringElement(cv.MORPH_RECT,(7,7))
26resutl=cv.morphologyEx(binary,cv.MORPH_DILATE,se)
27self.request_image_signal.emit()
28self.update_result_signal.emit({"im_data":resutl})
29self.image_data=None
30self.update_result_signal.emit({"done":"done"})
31return

界面线程

 1classContentPanel(QtWidgets.QWidget):
 2def__init__(self,parent=None):
 3super().__init__(parent)
 4fileBtn=QtWidgets.QPushButton("目录...")
 5self.image_files_dir=QtWidgets.QLineEdit()
 6self.image_files_dir.setMinimumWidth(100)
 7self.image_files_dir.setEnabled(False)
 8self.processBtn=QtWidgets.QPushButton("开始处理")
 9hbox_layout=QtWidgets.QHBoxLayout()
10hbox_layout.addWidget(fileBtn)
11hbox_layout.addWidget(self.image_files_dir)
12hbox_layout.addWidget(self.processBtn)
13panel1=QtWidgets.QGroupBox("目录选择")
14panel1.setLayout(hbox_layout)
15
16#图像标签
17self.imgLabel=QtWidgets.QLabel()
18self.imgLabel.setMinimumSize(800,600)
19self.imgLabel.setStyleSheet("background-color:black;color:deeppink")
20self.imgLabel.setAlignment(QtCore.Qt.AlignCenter)
21
22#添加到布局管理器中
23vbox_layout=QtWidgets.QVBoxLayout()
24vbox_layout.addWidget(panel1)
25vbox_layout.addWidget(self.imgLabel)
26vbox_layout.addStretch(1)
27
28#面板容器
29self.setLayout(vbox_layout)
30
31#setuplistener
32fileBtn.clicked.connect(self.on_select_image_dir)
33self.processBtn.clicked.connect(self.on_process)
34
35self.fetch_thread=None
36self.analysis_thread=None
37
38defon_select_image_dir(self):
39img_dir=QtWidgets.QFileDialog.getExistingDirectory(self,"图像文件夹",".")
40self.image_files_dir.setText(img_dir)

演示部分

675a835e-ba80-11ed-bfe3-dac502259ad0.png

67697a8a-ba80-11ed-bfe3-dac502259ad0.png

677cb65e-ba80-11ed-bfe3-dac502259ad0.png

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 多线程
    +关注

    关注

    0

    文章

    277

    浏览量

    19933
  • 应用程序
    +关注

    关注

    37

    文章

    3253

    浏览量

    57650
  • OpenCV
    +关注

    关注

    30

    文章

    629

    浏览量

    41309
  • 图像分析
    +关注

    关注

    0

    文章

    82

    浏览量

    18668
  • pyqt5
    +关注

    关注

    0

    文章

    25

    浏览量

    3395

原文标题:PyQT5+OpenCV多线程协作演示

文章出处:【微信号:CVSCHOOL,微信公众号:OpenCV学堂】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Java多线程的用法

    本文将介绍一下Java多线程的用法。 基础介绍 什么是多线程 指的是在一个进程中同时运行多个线程,每个线程都可以独立执行不同的任务或操作。 与单线程
    的头像 发表于 09-30 17:07 939次阅读

    可视可交互!H618上用OpenCV读取图像显示到PyQt5窗口上

    这里分享一个代码,功能是使用图像处理库opencv从摄像头获取数据,缩放后从pyqt5的窗口中显示出来。安装opencvsudo pip3 install opencv-python创建一个
    发表于 01-10 09:55

    多线程好还是单线程好?单线程多线程的区别 优缺点分析

    摘要:如今单线程多线程已经得到普遍运用,那么到底多线程好还是单线程好呢?单线程多线程的区别又
    发表于 12-08 09:33 8.1w次阅读

    mfc多线程编程实例及代码,mfc多线程间通信介绍

    摘要:本文主要以MFC多线程为中心,分别对MFC多线程的实例、MFC多线程之间的通信展开的一系列研究,下面我们来看看原文。
    发表于 12-08 15:23 1.8w次阅读
    mfc<b class='flag-5'>多线程</b>编程实例及代码,mfc<b class='flag-5'>多线程</b>间通信介绍

    什么是多线程编程?多线程编程基础知识

    摘要:多线程编程是现代软件威廉希尔官方网站 中很重要的一个环节。要弄懂多线程,这就要牵涉到多进程。本文主要以多线程编程以及多线程编程相关知识而做出的一些结论。
    发表于 12-08 16:30 1.3w次阅读

    PyQT多线程正确的调用方式

    我这两天一直想把YOLOv5上加个训练的界面,把控制台的输出重定向到一个PyQT5写的界面上,然后我很顺序的写好了一个简单的测试,发现可以重定向了,一直实时获取输出了。
    的头像 发表于 08-29 10:24 2087次阅读

    PyQT5+OpenCV开发的应用如何打包发布?

    我自己用PyQT5写了一个应用程序,基本上都写好了,到了打包发布这个环节,我知道的有两个工具可以帮我打包分别是。
    的头像 发表于 10-25 09:40 2623次阅读

    OpenCV+PyQT5开发桌面应用几个重要的坑与解决

    大概去年八月份的时候,我打算用OpenCV+PyQT5开发一套OpenCV教学演示与快速验证桌面软件,说实话那个时候我对PyQT5的理解就是Hello World水平。经过一年多开发锤
    的头像 发表于 12-13 11:55 1650次阅读

    SpringBoot实现多线程

    SpringBoot实现多线程
    的头像 发表于 01-12 16:59 1808次阅读
    SpringBoot实现<b class='flag-5'>多线程</b>

    多线程事务怎么回滚?一个简单示例演示多线程事务

    在spring中可以使用@Transactional注解去控制事务,使出现异常时会进行回滚,在多线程中,这个注解则不会生效,如果主线程需要先执行一些修改数据库的操作,当子线程在进行处理出现异常时,主
    发表于 08-09 12:22 659次阅读
    <b class='flag-5'>多线程</b>事务怎么回滚?一个简单示例<b class='flag-5'>演示</b><b class='flag-5'>多线程</b>事务

    labview AMC多线程

    labview_AMC多线程
    发表于 08-21 10:31 31次下载

    基于PyQT5与ONNXRUNTIME实现风格迁移应用

    2023年一月份跟二月份创建了一个PyQT5人工智能软件开发系列的文章系列,过去的两个月都没怎么更新,心里一直想有时间继续更新下去,今天又更新了一篇,基于PyQT5实现多线程、界面化、风格迁移模型的实时推理。
    的头像 发表于 10-25 10:35 509次阅读
    基于<b class='flag-5'>PyQT5</b>与ONNXRUNTIME实现风格迁移应用

    多线程如何保证数据的同步

    多线程编程是一种并发编程的方法,意味着程序中同时运行多个线程,每个线程可独立执行不同的任务,共享同一份数据。由于多线程并发执行的特点,会引发数据同步的问题,即保证多个
    的头像 发表于 11-17 14:22 1186次阅读

    mfc多线程编程实例

    (图形用户界面)应用程序的开发。在这篇文章中,我们将重点介绍MFC中的多线程编程。 多线程编程在软件开发中非常重要,它可以实现程序的并发执行,提高程序的效率和响应速度。MFC提供了丰富的多线程支持,可以轻松地实现
    的头像 发表于 12-01 14:29 1460次阅读

    java实现多线程的几种方式

    了多种实现多线程的方式,本文将详细介绍以下几种方式: 1.继承Thread类 2.实现Runnable接口 3.Callable和Future 4.线程5.Java 8中
    的头像 发表于 03-14 16:55 624次阅读