在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

PyQT5+OpenCV多線程協作演示

OpenCV學堂 ? 來源:OpenCV學堂 ? 2023-03-08 14:58 ? 次閱讀

引言

學習多線程最典型的問題就是如何在多個線程之間傳遞消息與寫作,PyQT5的線程支持在不同線程之間傳遞信號觸發事件,實現多個線程之間的協助,完成諸如生產者-消費者這樣經典的多線程協作。本文將通過QThread與信號槽機制構建一個生產者-消費者模型,演示多個線程之間的協作。

應用程序概述

這里演示了一個從圖像采集(用本地圖像數據集替代)到圖像分析處理(簡單二值化+形態學處理)、到主界面更新的應用程序。主界面是UI線程、圖像采集跟圖像分析分別在兩個不同的工作線程中,通過信號與槽機制協作工作,相互配合實現圖像采集到分析到結果更新到界面線程。

多線程協作信號觸發示意圖

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

代碼實現

這樣實現了三個類

ImageFetchThread // 圖像采集
ImageAnalysisThread // 圖像分析
ContentPanel // 界面顯示與更新

這三個類的代碼分別,模擬圖像采集線程

 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

    文章

    279

    瀏覽量

    20221
  • 應用程序
    +關注

    關注

    38

    文章

    3312

    瀏覽量

    58505
  • OpenCV
    +關注

    關注

    31

    文章

    641

    瀏覽量

    42197
  • 圖像分析
    +關注

    關注

    0

    文章

    82

    瀏覽量

    18814
  • pyqt5
    +關注

    關注

    0

    文章

    25

    瀏覽量

    3472

原文標題:PyQT5+OpenCV多線程協作演示

文章出處:【微信號:CVSCHOOL,微信公眾號:OpenCV學堂】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    Java多線程的用法

    本文將介紹一下Java多線程的用法。 基礎介紹 什么是多線程 指的是在一個進程中同時運行多個線程,每個線程都可以獨立執行不同的任務或操作。 與單線程
    的頭像 發表于 09-30 17:07 ?1089次閱讀

    可視可交互!H618上用OpenCV讀取圖像顯示到PyQt5窗口上

    這里分享一個代碼,功能是使用圖像處理庫opencv從攝像頭獲取數據,縮放后從pyqt5的窗口中顯示出來。安裝opencvsudo pip3 install opencv-python創建一個
    發表于 01-10 09:55

    多線程好還是單線程好?單線程多線程的區別 優缺點分析

    摘要:如今單線程多線程已經得到普遍運用,那么到底多線程好還是單線程好呢?單線程多線程的區別又
    發表于 12-08 09:33 ?8.2w次閱讀

    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 ?2255次閱讀

    PyQT5+OpenCV開發的應用如何打包發布?

    我自己用PyQT5寫了一個應用程序,基本上都寫好了,到了打包發布這個環節,我知道的有兩個工具可以幫我打包分別是。
    的頭像 發表于 10-25 09:40 ?2992次閱讀

    OpenCV+PyQT5開發桌面應用幾個重要的坑與解決

    大概去年八月份的時候,我打算用OpenCV+PyQT5開發一套OpenCV教學演示與快速驗證桌面軟件,說實話那個時候我對PyQT5的理解就是Hello World水平。經過一年多開發錘
    的頭像 發表于 12-13 11:55 ?2012次閱讀

    SpringBoot實現多線程

    SpringBoot實現多線程
    的頭像 發表于 01-12 16:59 ?2053次閱讀
    SpringBoot實現<b class='flag-5'>多線程</b>

    多線程事務怎么回滾?一個簡單示例演示多線程事務

    在spring中可以使用@Transactional注解去控制事務,使出現異常時會進行回滾,在多線程中,這個注解則不會生效,如果主線程需要先執行一些修改數據庫的操作,當子線程在進行處理出現異常時,主
    發表于 08-09 12:22 ?768次閱讀
    <b class='flag-5'>多線程</b>事務怎么回滾?一個簡單示例<b class='flag-5'>演示</b><b class='flag-5'>多線程</b>事務

    labview AMC多線程

    labview_AMC多線程
    發表于 08-21 10:31 ?33次下載

    基于PyQT5與ONNXRUNTIME實現風格遷移應用

    2023年一月份跟二月份創建了一個PyQT5人工智能軟件開發系列的文章系列,過去的兩個月都沒怎么更新,心里一直想有時間繼續更新下去,今天又更新了一篇,基于PyQT5實現多線程、界面化、風格遷移模型的實時推理。
    的頭像 發表于 10-25 10:35 ?622次閱讀
    基于<b class='flag-5'>PyQT5</b>與ONNXRUNTIME實現風格遷移應用

    多線程如何保證數據的同步

    多線程編程是一種并發編程的方法,意味著程序中同時運行多個線程,每個線程可獨立執行不同的任務,共享同一份數據。由于多線程并發執行的特點,會引發數據同步的問題,即保證多個
    的頭像 發表于 11-17 14:22 ?1499次閱讀

    mfc多線程編程實例

    (圖形用戶界面)應用程序的開發。在這篇文章中,我們將重點介紹MFC中的多線程編程。 多線程編程在軟件開發中非常重要,它可以實現程序的并發執行,提高程序的效率和響應速度。MFC提供了豐富的多線程支持,可以輕松地實現
    的頭像 發表于 12-01 14:29 ?1742次閱讀

    java實現多線程的幾種方式

    了多種實現多線程的方式,本文將詳細介紹以下幾種方式: 1.繼承Thread類 2.實現Runnable接口 3.Callable和Future 4.線程5.Java 8中
    的頭像 發表于 03-14 16:55 ?943次閱讀
    主站蜘蛛池模板: 色综合久久中文字幕网 | 午夜老司机福利 | 国产特级 | 国产在线高清精品二区色五郎 | 亚洲人成电影在线小说网色 | 最近在线视频免费观看2019 | 黄黄的网站 | a级黄色毛片三个搞一 | 黄色xxxx | 日韩毛片一级 | 色亚洲色图 | 爱爱小说视频永久免费网站 | 在线播放黄色网址 | 色视频在线免费看 | 午夜影视在线免费观看 | 中文字幕一区二区三区四区 | 曰本裸色私人影院噜噜噜影院 | www深夜视频在线观看高清 | 97影院理论在线观看 | 久操视频在线免费观看 | www.亚洲成人 | 一级做α爰片久久毛片 | 色综合久久98天天综合 | 1024手机在线看片 | 免费毛片网站在线观看 | 欧美高清一级片 | 精品久久天干天天天按摩 | 在线观看h视频 | 色多多影视 | 日韩一区二区三区在线 | 种子天堂bt | 四虎影视免费看 | 国产一级做a爰片久久毛片 国产一级做a爰片久久毛片男 | 色妇网 | 色视频免费观看高清完整 | 国产精品情人露脸在线观看 | 欧美在线你懂的 | 51影院在线观看成人免费 | h视频免费看 | 免费理论片在线观看播放 | 台湾一级毛片 |