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

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

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

3天內(nèi)不再提示

PyQT5+OpenCV多線程協(xié)作演示

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

引言

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

應用程序概述

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

多線程協(xié)作信號觸發(fā)示意圖

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

代碼實現(xiàn)

這樣實現(xiàn)了三個類

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

審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 多線程
    +關(guān)注

    關(guān)注

    0

    文章

    278

    瀏覽量

    19956
  • 應用程序
    +關(guān)注

    關(guān)注

    37

    文章

    3268

    瀏覽量

    57705
  • OpenCV
    +關(guān)注

    關(guān)注

    31

    文章

    635

    瀏覽量

    41350
  • 圖像分析
    +關(guān)注

    關(guān)注

    0

    文章

    82

    瀏覽量

    18679
  • pyqt5
    +關(guān)注

    關(guān)注

    0

    文章

    25

    瀏覽量

    3402

原文標題:PyQT5+OpenCV多線程協(xié)作演示

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

收藏 人收藏

    評論

    相關(guān)推薦

    Java多線程的用法

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

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

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

    多線程好還是單線程好?單線程多線程的區(qū)別 優(yōu)缺點分析

    摘要:如今單線程多線程已經(jīng)得到普遍運用,那么到底多線程好還是單線程好呢?單線程多線程的區(qū)別又
    發(fā)表于 12-08 09:33 ?8.1w次閱讀

    mfc多線程編程實例及代碼,mfc多線程間通信介紹

    摘要:本文主要以MFC多線程為中心,分別對MFC多線程的實例、MFC多線程之間的通信展開的一系列研究,下面我們來看看原文。
    發(fā)表于 12-08 15:23 ?1.8w次閱讀
    mfc<b class='flag-5'>多線程</b>編程實例及代碼,mfc<b class='flag-5'>多線程</b>間通信介紹

    什么是多線程編程?多線程編程基礎(chǔ)知識

    摘要:多線程編程是現(xiàn)代軟件技術(shù)中很重要的一個環(huán)節(jié)。要弄懂多線程,這就要牽涉到多進程。本文主要以多線程編程以及多線程編程相關(guān)知識而做出的一些結(jié)論。
    發(fā)表于 12-08 16:30 ?1.3w次閱讀

    PyQT多線程正確的調(diào)用方式

    我這兩天一直想把YOLOv5上加個訓練的界面,把控制臺的輸出重定向到一個PyQT5寫的界面上,然后我很順序的寫好了一個簡單的測試,發(fā)現(xiàn)可以重定向了,一直實時獲取輸出了。
    的頭像 發(fā)表于 08-29 10:24 ?2109次閱讀

    PyQT5+OpenCV開發(fā)的應用如何打包發(fā)布?

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

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

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

    SpringBoot實現(xiàn)多線程

    SpringBoot實現(xiàn)多線程
    的頭像 發(fā)表于 01-12 16:59 ?1831次閱讀
    SpringBoot實現(xiàn)<b class='flag-5'>多線程</b>

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

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

    labview AMC多線程

    labview_AMC多線程
    發(fā)表于 08-21 10:31 ?32次下載

    基于PyQT5與ONNXRUNTIME實現(xiàn)風格遷移應用

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

    多線程如何保證數(shù)據(jù)的同步

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

    mfc多線程編程實例

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

    java實現(xiàn)多線程的幾種方式

    了多種實現(xiàn)多線程的方式,本文將詳細介紹以下幾種方式: 1.繼承Thread類 2.實現(xiàn)Runnable接口 3.Callable和Future 4.線程5.Java 8中
    的頭像 發(fā)表于 03-14 16:55 ?709次閱讀
    主站蜘蛛池模板: 性做久久久久久久久| 91在线视频免费| 国产h视频在线| 亚洲免费观看视频| 四虎库| 国产精品最新资源网| 午夜国产| 成人黄色一级片| 一区二区三区欧美在线| 天堂网2014| 白丝丝袜高跟国产在线视频| 午夜欧美精品| 中文字幕一区二区三区在线播放| 免费看黄视频的网站| 亚洲啊v在线| 国产精品久久久久影院色老大| 黄色网久久| 亚洲网站一区| 欧美a区| xxxxxx日本人免费| 色成人免费网站| 色综合五月婷婷| 国产亚洲精品成人a在线| 九九热在线视频观看 | 亚洲一级视频在线观看| 三级高清| a级网| 亚洲www美色| 精品色视频| 欧美三级网址| 欧美专区一区二区三区| 末发育娇小性色xxxxx视频| 一区二区三区高清| 咪咪爱毛片| 天天干夜夜欢| 亚洲一区二区在线视频| 农村妇女野外一级毛片| 福利视频自拍偷拍| 日韩免费高清一级毛片在线| free欧美性| 男男扒开后菊惩罚|