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