PyQt5入門以及與OpenCV的簡單集成

PyQt5與OpenCV簡介

PyQt

PyQt是Python語言的GUI編程解決方案之一嚷节。可以用來代替Python內(nèi)置的Tkinter虎锚。其它替代者還有PyGTK硫痰、wxPython等。與Qt一樣窜护,PyQt是一個自由軟件效斑。

PyQt的開發(fā)者是英國的“Riverbank Computing”公司。它提供了GPL與商業(yè)協(xié)議兩種授權(quán)方式柱徙,因此它可以免費地用于自由軟件的開發(fā)缓屠。PyQt可以運行于Microsoft Windows奇昙、Mac OS X、Linux以及Unix的多數(shù)變種上敌完。

pyqt5是一套Python綁定QT5應(yīng)用的框架储耐。它可用于Python 2和3。pyqt5的官方網(wǎng)站
http://www.riverbankcomputing.co.uk/news

pyqt5做為Python的一個模塊蠢挡,它有620多個類和6000個函數(shù)和方法弧岳。
pyqt5的類別分為幾個模塊,包括以下:

QtCore
QtGui
QtWidgets
QtMultimedia
QtBluetooth
QtNetwork
QtPositioning
Enginio
QtWebSockets
QtWebKit
QtWebKitWidgets
QtXml
QtSvg
QtSql
QtTest

QtCore:包含了核心的非GUI功能业踏。此模塊用于處理時間禽炬、文件和目錄、各種數(shù)據(jù)類型勤家、流腹尖、URL、MIME類型伐脖、線程或進程热幔。
QtGui包含類窗口系統(tǒng)集成、事件處理讼庇、二維圖形绎巨、基本成像、字體和文本蠕啄。
qtwidgets模塊包含創(chuàng)造經(jīng)典桌面風(fēng)格的用戶界面提供了一套UI元素的類场勤。
QtMultimedia包含的類來處理多媒體內(nèi)容和API來訪問相機和收音機的功能。
Qtbluetooth模塊包含類的掃描設(shè)備和連接并與他們互動歼跟。描述模塊包含了網(wǎng)絡(luò)編程的類和媳。這些類便于TCP和IP和UDP客戶端和服務(wù)器的編碼,使網(wǎng)絡(luò)編程更容易和更便攜哈街。
Qtpositioning包含類的利用各種可能的來源留瞳,確定位置,包括衛(wèi)星骚秦、Wi-Fi她倘、或一個文本文件。
Enginio模塊實現(xiàn)了客戶端庫訪問Qt云服務(wù)托管的應(yīng)用程序運行時作箍。
Qtwebsockets模塊包含實現(xiàn)WebSocket協(xié)議類帝牡。
QtWebKit包含一個基于Webkit2圖書館Web瀏覽器實現(xiàn)類。
Qtwebkitwidgets包含的類的基礎(chǔ)webkit1一用于qtwidgets應(yīng)用Web瀏覽器的實現(xiàn)蒙揣。
QtXml包含與XML文件的類。這個模塊為SAX和DOM API提供了實現(xiàn)开瞭。
QtSvg模塊提供了顯示SVG文件內(nèi)容的類懒震≌窒ⅲ可伸縮矢量圖形(SVG)是一種描述二維圖形和圖形應(yīng)用的語言。
QtSql模塊提供操作數(shù)據(jù)庫的類个扰。
QtTest包含的功能瓷炮,使pyqt5應(yīng)用程序的單元測試

PyQt5不兼容PyQt4。PyQt5有一些巨大的改進递宅。但是娘香,遷移并不是很難,兩者的區(qū)別如下:
重新組合模塊办龄,一些模塊已經(jīng)被廢棄(QtScript)沧竟,有些被分為兩個子模塊(QtGui, QtWebKit)窃蹋。
添加了新的模塊,比如QtBluetooth, QtPositioning,和Enginio禁筏。
廢棄了SINGAL()和SLOT()的調(diào)用方式,使用了新的信號和xx處理方式癣防。
不再支持所有被標記為廢棄的或不建議使用的Qt API

OpenCV的全稱是Open Source Computer Vision Library绍豁,是一個跨平臺的計算機視覺庫。OpenCV是由英特爾公司發(fā)起并參與開發(fā)驶悟,以BSD許可證授權(quán)發(fā)行胡野,可以在商業(yè)和研究領(lǐng)域中免費使用。OpenCV可用于開發(fā)實時的圖像處理痕鳍、計算機視覺以及模式識別程序硫豆。該程序庫也可以使用英特爾公司的IPP進行加速處理。

PyQt5 demo 3個

demo1, 簡單的GUI

#!/usr/bin/python3
# -*- coding: utf-8 -*-

"""
PyQt5 demo 1
"""

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton

# demo1繼承自QWidget
class demo1(QWidget):

    # 構(gòu)造函數(shù)
    def __init__(self):
        # 父類初始化
        super().__init__()
        self.init_show()

    def init_show(self):
        btn = QPushButton('Hello, PyQt5', self)
        btn.move(300, 200)
        btn.resize(100, 40)

        self.setWindowTitle('demo1')
        self.resize(800, 600)

# 運行
if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = demo1()
    w.show()
    app.exec()

demo2, 簡單的signal與slot


#!/usr/bin/python3
# -*- coding: utf-8 -*-

"""
simple signal
"""
import sys
from PyQt5.QtWidgets import QApplication, QDialog, QPushButton

app = QApplication(sys.argv)
dlg = QDialog()
dlg.setWindowTitle('just close it')
dlg.resize(300, 200)

btn = QPushButton(dlg)
btn.resize(100, 50)
btn.setText('click it!')
btn.move(100, 100)

# 將btn的clicked信號與dlg的close槽連接
btn.clicked.connect(dlg.close)

dlg.show()
sys.exit(app.exec())

demo3, 簡單的串口通信


#!/usr/bin/python3
# -*- coding: utf-8 -*-

"""
PyQt5 demo 2
"""
# 導(dǎo)入QSerialPort庫
from PyQt5.QtSerialPort import QSerialPort
from PyQt5.QtCore import QIODevice, QByteArray

port = QSerialPort('COM1')

# QSerialPort的一些通信設(shè)定
port.setBaudRate(QSerialPort.Baud9600)
port.setFlowControl(QSerialPort.FlowControl(0))
port.setParity(QSerialPort.Parity(7))
port.setStopBits(QSerialPort.StopBits(1))

# 實際代碼中應(yīng)判斷是否打開成功
port.open(QIODevice.ReadWrite)

byte = QByteArray()
byte.resize(6)
byte.fill('0')

port.write(byte)
port.flush()
port.close()

OpenCV demo

demo1, 簡單讀取一個image

import cv2

"""
simple opencv snippet
"""
# 讀取圖像
img = cv2.imread('D:/wuhan.jpg')

# 顯示圖像
cv2.imshow('wuhan', img)

# 等待鍵盤輸入事件
cv2.waitKey(0)

#銷毀所有window
cv2.destroyAllWindows()

demo2, 簡單的圖像處理

import cv2

"""
simple opencv snippet 02
"""
# 讀取圖像
img = cv2.imread('D:/lena.jpg', 0)

# 對圖像做直方圖均衡處理
equ = cv2.equalizeHist(img)

# 采用cancy算子進行邊緣檢測
edge = cv2.Canny(img, 50, 50)

# 顯示圖像
cv2.imshow('img', img)
cv2.imshow('equ', equ)
cv2.imshow('edge', edge)

cv2.waitKey(0)
cv2.destroyAllWindows()

simple opencv snippet 02

PyQt5與OpenCV的簡單集成

#!/usr/bin/python3
# -*- coding: utf-8 -*-

import sys
import cv2 as cv
import numpy as np
from PyQt5.QtGui import QImage, QPixmap
from PyQt5.QtWidgets import (QApplication, QDialog, QFileDialog, QGridLayout,
                             QLabel, QPushButton)


class win(QDialog):
    def __init__(self):

        # 初始化一個img的ndarray, 用于存儲圖像
        self.img = np.ndarray(())

        super().__init__()
        self.initUI()

    def initUI(self):
        self.resize(400, 300)
        self.btnOpen = QPushButton('Open', self)
        self.btnSave = QPushButton('Save', self)
        self.btnProcess = QPushButton('Process', self)
        self.btnQuit = QPushButton('Quit', self)
        self.label = QLabel()

        # 布局設(shè)定
        layout = QGridLayout(self)
        layout.addWidget(self.label, 0, 1, 3, 4)
        layout.addWidget(self.btnOpen, 4, 1, 1, 1)
        layout.addWidget(self.btnSave, 4, 2, 1, 1)
        layout.addWidget(self.btnProcess, 4, 3, 1, 1)
        layout.addWidget(self.btnQuit, 4, 4, 1, 1)

        # 信號與槽連接, PyQt5與Qt5相同, 信號可綁定普通成員函數(shù)
        self.btnOpen.clicked.connect(self.openSlot)
        self.btnSave.clicked.connect(self.saveSlot)
        self.btnProcess.clicked.connect(self.processSlot)
        self.btnQuit.clicked.connect(self.close)

    def openSlot(self):
        # 調(diào)用打開文件diglog
        fileName, tmp = QFileDialog.getOpenFileName(
            self, 'Open Image', './__data', '*.png *.jpg *.bmp')

        if fileName is '':
            return

        # 采用opencv函數(shù)讀取數(shù)據(jù)
        self.img = cv.imread(fileName, -1)

        if self.img.size == 1:
            return

        self.refreshShow()

    def saveSlot(self):
        # 調(diào)用存儲文件dialog
        fileName, tmp = QFileDialog.getSaveFileName(
            self, 'Save Image', './__data', '*.png *.jpg *.bmp', '*.png')

        if fileName is '':
            return
        if self.img.size == 1:
            return

        # 調(diào)用opencv寫入圖像
        cv.imwrite(fileName, self.img)

    def processSlot(self):
        if self.img.size == 1:
            return

        # 對圖像做模糊處理, 窗口設(shè)定為5x5
        self.img = cv.blur(self.img, (5, 5))

        self.refreshShow()

    def refreshShow(self):
        # 提取圖像的尺寸和通道, 用于將opencv下的image轉(zhuǎn)換成Qimage
        height, width, channel = self.img.shape
        bytesPerLine = 3 * width
        self.qImg = QImage(self.img.data, width, height, bytesPerLine,
                           QImage.Format_RGB888).rgbSwapped()

        # 將Qimage顯示出來
        self.label.setPixmap(QPixmap.fromImage(self.qImg))


if __name__ == '__main__':
    a = QApplication(sys.argv)
    w = win()
    w.show()
    sys.exit(a.exec_())
PyQt5與OpenCV的簡單集成

結(jié)語

PyQt將Qt強大的界面開發(fā)功能帶入到Python語言中,結(jié)合Python語言的特性,可方便快捷地實現(xiàn)編程人員的想法,更可以結(jié)合OpenCV庫包含的種種算法實現(xiàn)對圖像和視頻的處理.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末额获,一起剝皮案震驚了整個濱河市够庙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌抄邀,老刑警劉巖耘眨,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異境肾,居然都是意外死亡剔难,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進店門奥喻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來偶宫,“玉大人,你說我怎么就攤上這事环鲤〈壳鳎” “怎么了?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長吵冒。 經(jīng)常有香客問我纯命,道長,這世上最難降的妖魔是什么痹栖? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任亿汞,我火速辦了婚禮,結(jié)果婚禮上揪阿,老公的妹妹穿的比我還像新娘疗我。我一直安慰自己,他們只是感情好南捂,可當我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布吴裤。 她就那樣靜靜地躺著,像睡著了一般黑毅。 火紅的嫁衣襯著肌膚如雪嚼摩。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天矿瘦,我揣著相機與錄音枕面,去河邊找鬼。 笑死缚去,一個胖子當著我的面吹牛潮秘,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播易结,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼枕荞,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了搞动?” 一聲冷哼從身側(cè)響起躏精,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎鹦肿,沒想到半個月后矗烛,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡箩溃,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年瞭吃,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片涣旨。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡歪架,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出霹陡,到底是詐尸還是另有隱情和蚪,我是刑警寧澤止状,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站惠呼,受9級特大地震影響导俘,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜剔蹋,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望辅髓。 院中可真熱鬧泣崩,春花似錦、人聲如沸洛口。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽第焰。三九已至买优,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間挺举,已是汗流浹背杀赢。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留湘纵,地道東北人脂崔。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像梧喷,于是被迫代替她去往敵國和親砌左。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,724評論 2 351

推薦閱讀更多精彩內(nèi)容