OpenCV-Python入門教程7-PyQt編寫GUI界面

前面一直都是使用命令行運行代碼,不夠人性化。這篇用Python編寫一個GUI界面,使用PyQt5編寫圖像處理程序。包括:打開、關閉攝像頭,捕獲圖片,讀取本地圖片,灰度化和Otsu自動閾值分割的功能。

使用Qt Designer來設計界面。而anaconda里自帶了designer.exe,我使用的就是這個。designer.exe的路徑:D:\ProgramData\Anaconda3\Library\bin\,如果是普通的Python環境,則需要自行安裝

pip install pyqt5-tools

安裝完成后,designer.exe應該在Python的安裝目錄下:xxx\Lib\site-packages\pyqt5_tools\

生成一個簡單的界面,后面還會用到

import sys
from PyQt5.QtWidgets import QApplication, QWidgetif __name__ == '__main__':app = QApplication(sys.argv)window = QWidget()window.setWindowTitle('Hello World!')window.show()sys.exit(app.exec_())

一、界面設計

在D:\ProgramData\Anaconda3\Library\bin\下打開designer.exe,會彈出創建新窗體的窗口,我們直接點擊"創建"(英文版是create)

界面左側是Qt的常用控件"Widget Box",右側有一個控件屬性窗口"Property Editor"。本例中我們只用到了"Push Button"控件和"Label"控件,可以在屬性窗口調整它的大小150x150(可以根據自己的需求適當調大或者縮小):

控件上顯示的文字"text"屬性和控件的名字"objectName"屬性需要修改,便于顯示和代碼調用,可以按照下面的表格命名:

控件顯示內容text控件名objectName
PushButton打開攝像頭btnOpenCamera
PushButton捕獲圖片btnCapture
PushButton打開圖片btnReadImage
PushButton灰度化btnGray
PushButton閾值分割btnThreshold
Label攝像頭labelCamera
Label捕獲圖labelCapture
Label結果圖labelResult

前面設計好了界面,接下來就是實現"打開攝像頭"到"閾值分割"這五個按鈕的功能,也就是給每個按鈕指定一個函數,邏輯代碼寫在這個函數里面。這個函數就稱事件,Qt中稱為槽連接

點擊Designer工具欄的Edit Signals/Slots按鈕,進入槽函數編輯界面,點擊旁邊的"Edit Widgets"可以恢復正常視圖:

在彈出的配置窗口中,可以看到左側是按鈕的常用事件,我們選擇點擊事件”clicked()”,然后添加一個名為”btnOpenCamera_Clicked()”的槽函數:

重復上面的步驟,給五個按鈕添加五個槽函數,最終結果如下:

Ctrl + S保存.ui文件。我們需要將ui轉py代碼。

打開cmd命令行,切換到ui文件的保存目錄。Windows下有個小技巧,可以在目錄的地址欄輸入cmd,一步切換到當前目錄:

執行這條指令

pyuic5 -o mainForm.py using_pyqt_create_ui.ui

生成mainForm.py文件,里面包含一個名為”Ui_MainWindow”的類。

二、編寫邏輯代碼

mainForm.py是根據ui文件生成的,也就是說,一旦ui文件有所改變,需要重新生成覆蓋原來的文件。

新建一個mainEntry.py存放邏輯代碼,代碼雖然很長,但是很簡單并不難懂。有些部分有所重復,并沒有將其封裝成一個函數(博主能力有限),感興趣的可以試一下

import sys
import cv2
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import QFileDialog, QMainWindow
from mainForm import Ui_MainWindowclass PyQtMainEntry(QMainWindow, Ui_MainWindow):def __init__(self):super().__init__()self.setupUi(self)self.camera = cv2.VideoCapture(0)self.is_camera_opened = False  # 攝像頭有沒有打開標記# 定時器:30ms捕獲一幀self._timer = QtCore.QTimer(self)self._timer.timeout.connect(self._queryFrame)self._timer.setInterval(30)def btnOpenCamera_Clicked(self):'''打開和關閉攝像頭'''self.is_camera_opened = ~self.is_camera_openedif self.is_camera_opened:self.btnOpenCamera.setText("關閉攝像頭")self._timer.start()else:self.btnOpenCamera.setText("打開攝像頭")self._timer.stop()def btnCapture_Clicked(self):'''捕獲圖片'''# 攝像頭未打開,不執行任何操作if not self.is_camera_opened:returnself.captured = self.frame# 后面這幾行代碼幾乎都一樣,可以嘗試封裝成一個函數rows, cols, channels = self.captured.shapebytesPerLine = channels * cols# Qt顯示圖片時,需要先轉換成QImgage類型QImg = QImage(self.captured.data, cols, rows, bytesPerLine, QImage.Format_RGB888)self.labelCapture.setPixmap(QPixmap.fromImage(QImg).scaled(self.labelCapture.size(), Qt.KeepAspectRatio, Qt.SmoothTransformation))def btnReadImage_Clicked(self):'''從本地讀取圖片 文件路徑不能有中文'''# 打開文件選取對話框filename, _ = QFileDialog.getOpenFileName(self, '打開圖片')if filename:self.captured = cv2.imread(str(filename))# OpenCV圖像以BGR通道存儲,顯示時需要從BGR轉到RGBself.captured = cv2.cvtColor(self.captured, cv2.COLOR_BGR2RGB)rows, cols, channels = self.captured.shapebytesPerLine = channels * colsQImg = QImage(self.captured.data, cols, rows, bytesPerLine, QImage.Format_RGB888)self.labelCapture.setPixmap(QPixmap.fromImage(QImg).scaled(self.labelCapture.size(), Qt.KeepAspectRatio, Qt.SmoothTransformation))def btnGray_Clicked(self):'''灰度化'''# 如果沒有捕獲圖片,則不執行操作if not hasattr(self, "captured"):returnself.cpatured = cv2.cvtColor(self.captured, cv2.COLOR_RGB2GRAY)rows, columns = self.cpatured.shapebytesPerLine = columns# 灰度圖是單通道,所以需要用Format_Indexed8QImg = QImage(self.cpatured.data, columns, rows, bytesPerLine, QImage.Format_Indexed8)self.labelResult.setPixmap(QPixmap.fromImage(QImg).scaled(self.labelResult.size(), Qt.KeepAspectRatio, Qt.SmoothTransformation))def btnThreshold_Clicked(self):'''Otsu自動閾值分割'''if not hasattr(self, "captured"):return_, self.cpatured = cv2.threshold(self.cpatured, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)rows, columns = self.cpatured.shapebytesPerLine = columns# 閾值分割圖也是單通道,也需要用Format_Indexed8QImg = QImage(self.cpatured.data, columns, rows, bytesPerLine, QImage.Format_Indexed8)self.labelResult.setPixmap(QPixmap.fromImage(QImg).scaled(self.labelResult.size(), Qt.KeepAspectRatio, Qt.SmoothTransformation))@QtCore.pyqtSlot()def _queryFrame(self):'''循環捕獲圖片'''ret, self.frame = self.camera.read()img_rows, img_cols, channels = self.frame.shapebytesPerLine = channels * img_colscv2.cvtColor(self.frame, cv2.COLOR_BGR2RGB, self.frame)QImg = QImage(self.frame.data, img_cols, img_rows, bytesPerLine, QImage.Format_RGB888)self.labelCamera.setPixmap(QPixmap.fromImage(QImg).scaled(self.labelCamera.size(), Qt.KeepAspectRatio, Qt.SmoothTransformation))if __name__ == "__main__":app = QtWidgets.QApplication(sys.argv)window = PyQtMainEntry()window.show()sys.exit(app.exec_())

?參考網址:https://tianchi.aliyun.com/course/courseConsole?courseId=40992&chapterIndex=1&sectionIndex=16

轉載于:https://www.cnblogs.com/gezhuangzhuang/p/10289980.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/537059.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/537059.shtml
英文地址,請注明出處:http://en.pswp.cn/news/537059.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

spark 廣播變量大數據_大數據處理 | Spark集群搭建及基本使用

點擊藍字關注我前面用了一篇文章詳細的介紹了集群HDFS文件系統的搭建,HDFS文件系統只是一個用于存儲數據的系統,它主要是用來服務于大數據計算框架,例如MapReduce、Spark,本文就接著上一篇文章來詳細介紹一下Spark集群的搭建及Spa…

如何將本地項目上傳到gitee

*************************************優雅的分割線 ********************************** 分享一波:程序員賺外快-必看的巔峰干貨 如果以上內容對你覺得有用,并想獲取更多的賺錢方式和免費的技術教程 請關注微信公眾號:HB荷包 一個能讓你學習技術和賺錢方法的公眾號,持續更…

oracle dg 備庫未設置convert參數導致ORA-01111,ORA-01110

2019獨角獸企業重金招聘Python工程師標準>>> 查看trace 文件: MRP0: Background Managed Standby Recovery process started (amls) started logmerger process Sun Jan 20 07:55:53 2019 Managed Standby Recovery starting Real Time Apply MRP0: Back…

git回退歷史版本無法上傳_Git系列教程(二):版本庫中添加文件、版本回退

Git系列教程(一):簡介、安裝、配置我們學習了分布式和版本控制系統的概念、Git具有的8個功能以及如何在Windows上安裝Git、進行相關配置并創建版本庫。Git版本庫中添加文件Git 的工作就是創建和保存你的項目的快照及與之后的快照進行對比。我們編寫一個readme.txt文…

nginx反向代理配置如何去除前綴

使用nginx做反向代理的時候,可以簡單的直接把請求原封不動的轉發給下一個服務。設置proxy_pass請求只會替換域名,如果要根據不同的url后綴來訪問不同的服務,則需要通過如下方法: 方法一:加"/"** server {l…

「作文素材詳解」寫作必知篇:語言優美不是作文第一要求

語言優美不是作文第一要求“教孩子寫作文,老師家長應該先提升自己。”“語言優美不是作文的第一要求。”“如果教孩子寫漂亮的違心話,會害了他一輩子。”日前,著名作家肖復興來到體育東路小學,與廣州的一線語文教師交流&#xff0…

華為安裝gsm框架_華為nova5怎么下載安裝谷歌服務助手,安裝GMS框架教程

看到不少的華為nova5用戶喜歡這個谷歌服務助手,也就是想安裝這個GMS框架,可是一直不知道如何下載安裝,這個谷歌服務框架是可以在系統軟件里面可以刪除的一個APK程序,但現在有很多的軟件和游戲需要谷歌服務的支持,那咱們…

VMware安裝虛擬機并使用NAT模式連接網絡

*************************************優雅的分割線 ********************************** 分享一波:程序員賺外快-必看的巔峰干貨 如果以上內容對你覺得有用,并想獲取更多的賺錢方式和免費的技術教程 請關注微信公眾號:HB荷包 一個能讓你學習技術和賺錢方法的公眾號,持續更…

PHPStudy下Apache SSL證書安裝教程

一、安裝SSL證書的環境 Apache安裝目錄:E:phpStudyPHPTutorialApache 以上為windows下測試SSL證書安裝的目錄,具體目錄請根據自己的實際環境! 二、獲取SSL證書 成功在沃通申請SSL證書后,會得到一個壓縮包文件,解壓后得到四個文件&…

laravel 集成采集_新版2020 Laravel采集網站程序

環境:php5.6數據庫:mysql5.5集成環境軟件:護衛神apache這套程序是520.ag 的網站很早的程序了是去年還是前年 應該是前年免費采集網站 但是經常掛 其實他網站掛和服務器沒有多大關系 是程序沒有作好優化這套程序可以大家做起來 自己用就可以了 放出去免費采集的話 網站容易死程…

詳解模板方法設計模式

分享一波:程序員賺外快-必看的巔峰干貨 概念 定義一個操作中的算法骨架,而將一些步驟延遲到子類中。模板方法使得子類可以不改變一個算法的結構即可重定義該算法的重復代碼全部在父類里面,不同業務的,使用抽象方法,抽取給子類進…

怎么從已有文件中挑選需要的文字重新生成新文件_CAD問題全面解答(幾乎涵蓋了CAD使用的全部問題)...

1.【CTrlN無效時之解決辦法】眾所周知CTRLN是新建命令但有時候CTRLN則出現選擇面板這時只需到OP選項里調下設置操作:OP(選項)------系統-------右側有一個啟動(A顯示啟動對話框B不顯示啟動對話框)選擇A則新建命令有效,反則無效2.【Ctrl鍵無效之解決辦法】…

中國官方要求進一步加強中資商業銀行境外機構合規管理

中新社北京1月22日電 (記者 王恩博)為推動在境外設有經營性機構的中資商業銀行進一步優化集團合規管理體系,健全跨境合規管理機制,提高跨境合規管理有效性,實現境外機構安全穩健運行,中國銀保監會22日發布《關于加強中資商業銀行境…

詳解:設計模式之-代理設計

分享一波:程序員賺外快-必看的巔峰干貨 概念 通過代理控制對象的訪問,可以詳細訪問某個對象的方法,在這個方法調用處理,或調用后處理(類似于AOP)。 代理設計模式應用場景:AOP、權限控制、事務 常見代理的分類有&am…

【實時+排重】擺脫渠道統計刷量作弊行為

如今的渠道統計不僅要看精準度,更要看數據的真實性。 對App的推廣業務而言,渠道監測和統計是必不可少的環節,不論以什么形式開展推廣,終究都要具體落實到App的安裝量、激活量等指標上。但在如今數據刷量和作假行為橫行的背景下&am…

python清空idle的內容_Python IDLE清空窗口的實例

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里技術人對外發布原創技術內容的最大平臺&…

詳解:設計模式之-單例設計模式

分享一波:程序員賺外快-必看的巔峰干貨 前言 近期預計1-2周左右會更新設計模式專題文章。 單例設計模式:保證在一個JVM中,只能存在一個實例。 應用場景:Servlet,Spring IOC,線程池,連接池,S…

rabbitmq可靠性投遞_阿里Java研發二面:了解RabbitMQ?說說RabbitMQ可靠性投遞

上期寫到高并發下RabbitMq消息中間件你應該介么玩今天給小伙伴說說!有自己看法的也可以在評論區留言探討,也可以轉發關注下我以后會長期分享!目錄:確保消息發送到RabbitMQ服務器確保消息被正確的路由確保消息在隊列正確地存儲確保…

IBM發布Open Liberty 18.0.0.4,支持MicroProfile 2.1和反應性擴展框架

IBM在2018年第四季度發布的Open Liberty 18.0.0.4提供了對MicroProfile 2.1、反應性擴展框架和連接池指標的全面支持。根據發布說明:Open Liberty現在對JAX-RS 2.1進行了反應性擴展,這樣你就可以使用來自Apache CXF和Jersey的提供程序。在ops方面&#x…

b700a怎么連藍牙_233621藍牙2.1無線音箱B700A小測

隨著藍牙技術的發展,使用藍牙的相關產品也越來越多,各種藍牙耳機、藍牙鍵盤、藍牙鼠標都讓我們的外設擺脫了線材的束縛。小編之前也介紹過一款便攜藍牙音箱,也評測過一款藍牙耳機,而今天拿到的是一款采用藍牙2.1技術,造…