阿里云服務(wù)器上做淘寶客網(wǎng)站濟(jì)南網(wǎng)站建設(shè)方案
????????OpenCV 提供了豐富的圖像處理和計(jì)算機(jī)視覺(jué)功能,可以實(shí)現(xiàn)各種復(fù)雜的圖像處理任務(wù),如目標(biāo)檢測(cè)、人臉識(shí)別、圖像分割等。
????????PyQt(或PySide)是一個(gè)創(chuàng)建GUI應(yīng)用程序的工具包,它是Python編程語(yǔ)言和Qt庫(kù)的成功融合。Qt庫(kù)是最強(qiáng)大的GUI庫(kù)之一。Qt的快速界面編輯工具Qt Designer提供了直觀的可視化界面設(shè)計(jì)環(huán)境,通過(guò)拖拽和放置控件來(lái)設(shè)計(jì)界面,簡(jiǎn)化了界面設(shè)計(jì)的過(guò)程。PyQt提供了豐富的控件庫(kù),同時(shí)支持多種媒體文件的展示。尤其是PyQt的信號(hào)與槽的刷新機(jī)制提供了高效和可靠的信號(hào)響應(yīng)機(jī)制。
????????下面以一個(gè)實(shí)際的項(xiàng)目搭建過(guò)程為demo,嘗試聯(lián)合使用以上兩個(gè)庫(kù),力爭(zhēng)各盡所長(zhǎng)。原則上,前端的界面顯示和操作交給PySide,后臺(tái)的圖像處理交給OpenCV。
這是一個(gè)顯微拍照畫面內(nèi)的輪廓識(shí)別和尺寸測(cè)量、數(shù)量統(tǒng)計(jì)項(xiàng)目。
一、顯示界面框架搭建
1、主界面
主界面利用Qt Designer?制作,命名為main_window.ui并保存。
?主按鈕站:
應(yīng)該達(dá)到的運(yùn)行效果:
2、主界面的按鈕
?按鈕有兩種:
第一種是“點(diǎn)動(dòng)”式的,圖標(biāo)為雙狀態(tài),例如“新建項(xiàng)目”按鈕。其樣式表為:
第二種是“翻轉(zhuǎn)“式的,每點(diǎn)擊一次狀態(tài)反轉(zhuǎn),即:可以反轉(zhuǎn)”checked“狀態(tài)。按鈕圖標(biāo)為三個(gè)狀態(tài),例如“局部放大”按鈕。其樣式表為:?
?這種按鈕,自定義了一個(gè)特性:activated來(lái)取代系統(tǒng)自帶的checked,當(dāng)這個(gè)特性activated="true"時(shí),改變按鈕的背景色。當(dāng)然也可以使用系統(tǒng)自帶的checked特性來(lái)實(shí)現(xiàn)同樣的功能,這里的目的主要是練習(xí)一下 按鈕的自定義特性的應(yīng)用。
使用系統(tǒng)自帶的checked特性:
兩種方法在顯示上的微妙差別如下:左邊是自定義特性的,右邊是使用系統(tǒng)自帶的checked特性來(lái)實(shí)現(xiàn)的。區(qū)別在于系統(tǒng)自帶的checked特性顯示的邊框是pressed,即按下時(shí)的邊框特性。
3、階梯漸變的色條
主界面的顏色樣例條,自定義腳本,命名為GradientLabel.py:
from PySide6.QtGui import QPainter, QColor, QLinearGradient
from PySide6.QtWidgets import QMainWindow, QLabel, QVBoxLayout, QWidget
from PySide6.QtCore import Qtclass GradientLabel(QLabel):# 定義顏色def def_colors(self, begin_color, mid_color, end_color):self.begin_color = begin_colorself.mid_color = mid_colorself.end_color = end_color# 重新定義繪畫事件def paintEvent(self, event):painter = QPainter(self)painter.setRenderHint(QPainter.Antialiasing)gradient = QLinearGradient(0, 0, 0, self.height())gradient.setColorAt(1, self.end_color)gradient.setColorAt(0.5, self.mid_color)gradient.setColorAt(0, self.begin_color)painter.fillRect(self.rect(), gradient)class MyMainWindow(QMainWindow):def __init__(self):super().__init__()central_widget = QWidget(self)self.setCentralWidget(central_widget)layout = QVBoxLayout(central_widget)gradient_label = GradientLabel(self)begin = QColor(255, 100, 0)mid = QColor(8, 180, 8)end = QColor(80, 80, 255)gradient_label.def_colors(begin, mid, end)gradient_label.setAlignment(Qt.AlignCenter)layout.addWidget(gradient_label)self.setWindowTitle("Gradient Label Example")if __name__ == "__main__":import sysfrom PySide6.QtWidgets import QApplicationapp = QApplication(sys.argv)window = MyMainWindow()window.show()sys.exit(app.exec())
?運(yùn)行效果:
?將自定義腳本保存在主程序腳本同目錄,并在Qt Designer 將顏色樣例條”提升為“該自定義腳本。
4、圖像顯示區(qū)的自定義腳本
?這是一個(gè)QLabel,其顯示的內(nèi)容為QPixmap。腳本逐步再完善。
二、主程序腳本框架搭建?
1、目錄結(jié)構(gòu):
?JSON:存放json文件
MEDIA:存放媒體文件
PROJECT:工程文件
PYS:存放腳本
SRC:按鈕圖標(biāo)等源文件
UIS:存放顯示界面文件
2、編寫初步的主程序框架:
?首先要使用pyuic和pyrcc工具將圖像資源轉(zhuǎn)換成py文件并與主程序腳本放置在同一文件夾下,然后編寫主程序腳本:
# 這是一個(gè)圖像處理小應(yīng)用的示例腳本。# encoding: utf-8
import json
import sysfrom PySide6.QtCore import QObject
from PySide6.QtWidgets import QApplication, QMainWindowimport main_window_rc # 導(dǎo)入主畫面# 定義主窗口
class MainWindow(QMainWindow, main_window_rc.Ui_MainWindow):def __init__(self):super().__init__()# ################公用的作業(yè)函數(shù)#############################
class Jobs:@staticmethod# 讀取JSON文件,分配參數(shù)def read_json():with open('../JSON/setting.json', 'r', encoding='utf-8') as file_json:ui.json_data = json.load(file_json)ui.settings = ui.json_data['setting'] # 項(xiàng)目參數(shù)的定義@staticmethod# 系統(tǒng)的初始化def start_todo():pass# 退出前的操作@staticmethoddef before_quit():with open('../JSON/setting.json', 'w') as file: # 保存json文件json.dump(ui.json_data, file, indent=4)# ################圖像處理的過(guò)程函數(shù)#############################
def Image_processing(steps):for step in steps:# 系統(tǒng)的初始化if step == 'start':pass# step0,步驟0if step == 0:passcontinue# step1,步驟1if step == 1:passcontinue# step2,步驟2if step == 2:passcontinue# ###########################信號(hào)的連接和槽函數(shù)####################################
def signal_slot():# #####################主窗口的信號(hào)和槽####################################pass# #############################主程序###################################
if __name__ == '__main__':app = QApplication(sys.argv)# #######################項(xiàng)目級(jí)別的定義###################################class UI(QObject): # 將項(xiàng)目定義為QObject,用來(lái)管理項(xiàng)目級(jí)別的信號(hào)和變量# ###########__init__###############def __init__(self):super().__init__()# ########################本項(xiàng)目的實(shí)例化###################################ui = UI() # 項(xiàng)目實(shí)例化# ########################實(shí)例化畫面#################################window1 = MainWindow() # 主畫面實(shí)例化window1.show() # 顯示畫面window1.setupUi(window1) # 畫面初始化Jobs.start_todo() # 系統(tǒng)初始化signal_slot() # 信號(hào)與槽的定義app.aboutToQuit.connect(Jobs.before_quit) # 退出系統(tǒng)之前的操作sys.exit(app.exec())
?本階段運(yùn)行截圖:
?持續(xù)更新,直至完成。
感興趣的朋友可以向我索要源文件并參與項(xiàng)目的共同學(xué)習(xí)和完善,同時(shí)也特別期待大神高手的指點(diǎn)和批評(píng)!