使用OpenCV与PySide(PyQt)的视觉检测小项目练习

OpenCV 提供了丰富的图像处理和计算机视觉功能,可以实现各种复杂的图像处理任务,如目标检测、人脸识别、图像分割等。

PyQt(或PySide)是一个创建GUI应用程序的工具包,它是Python编程语言和Qt库的成功融合。Qt库是最强大的GUI库之一。Qt的快速界面编辑工具Qt Designer提供了直观的可视化界面设计环境,通过拖拽和放置控件来设计界面,简化了界面设计的过程。PyQt提供了丰富的控件库,同时支持多种媒体文件的展示。尤其是PyQt的信号与槽的刷新机制提供了高效和可靠的信号响应机制。

下面以一个实际的项目搭建过程为demo,尝试联合使用以上两个库,力争各尽所长。原则上,前端的界面显示和操作交给PySide,后台的图像处理交给OpenCV。

这是一个显微拍照画面内的轮廓识别和尺寸测量、数量统计项目。

一、显示界面框架搭建

1、主界面

主界面利用Qt Designer 制作,命名为main_window.ui并保存。

主按钮站:

应该达到的运行效果:

2、主界面的按钮

按钮有两种:

第一种是"点动"式的,图标为双状态,例如"新建项目"按钮。其样式表为:

第二种是"翻转"式的,每点击一次状态反转,即:可以反转"checked"状态。按钮图标为三个状态,例如"局部放大"按钮。其样式表为:

这种按钮,自定义了一个特性:activated来取代系统自带的checked,当这个特性activated="true"时,改变按钮的背景色。当然也可以使用系统自带的checked特性来实现同样的功能,这里的目的主要是练习一下 按钮的自定义特性的应用。

使用系统自带的checked特性:

两种方法在显示上的微妙差别如下:左边是自定义特性的,右边是使用系统自带的checked特性来实现的。区别在于系统自带的checked特性显示的边框是pressed,即按下时的边框特性。

3、阶梯渐变的色条

主界面的颜色样例条,自定义脚本,命名为GradientLabel.py

python 复制代码
from PySide6.QtGui import QPainter, QColor, QLinearGradient
from PySide6.QtWidgets import QMainWindow, QLabel, QVBoxLayout, QWidget
from PySide6.QtCore import Qt


class GradientLabel(QLabel):
    
    # 定义颜色
    def def_colors(self, begin_color, mid_color, end_color):
        self.begin_color = begin_color
        self.mid_color = mid_color
        self.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 sys
    from PySide6.QtWidgets import QApplication

    app = QApplication(sys.argv)
    window = MyMainWindow()
    window.show()
    sys.exit(app.exec())

运行效果:

将自定义脚本保存在主程序脚本同目录,并在Qt Designer 将颜色样例条"提升为"该自定义脚本。

4、图像显示区的自定义脚本

这是一个QLabel,其显示的内容为QPixmap。脚本逐步再完善。

二、主程序脚本框架搭建

1、目录结构:

JSON:存放json文件

MEDIA:存放媒体文件

PROJECT:工程文件

PYS:存放脚本

SRC:按钮图标等源文件

UIS:存放显示界面文件

2、编写初步的主程序框架:

首先要使用pyuic和pyrcc工具将图像资源转换成py文件并与主程序脚本放置在同一文件夹下,然后编写主程序脚本:

python 复制代码
# 这是一个图像处理小应用的示例脚本。

# encoding: utf-8
import json
import sys

from PySide6.QtCore import QObject
from PySide6.QtWidgets import QApplication, QMainWindow

import main_window_rc  # 导入主画面


# 定义主窗口
class MainWindow(QMainWindow, main_window_rc.Ui_MainWindow):
    def __init__(self):
        super().__init__()


# ################公用的作业函数#############################
class Jobs:
    @staticmethod
    # 读取JSON文件,分配参数
    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']  # 项目参数的定义

    @staticmethod
    # 系统的初始化
    def start_todo():
        pass

    # 退出前的操作
    @staticmethod
    def before_quit():
        with open('../JSON/setting.json', 'w') as file:  # 保存json文件
            json.dump(ui.json_data, file, indent=4)


# ################图像处理的过程函数#############################
def Image_processing(steps):
    for step in steps:
        # 系统的初始化
        if step == 'start':
            pass

        # step0,步骤0
        if step == 0:
            pass
            continue

        # step1,步骤1
        if step == 1:
            pass
            continue


        # step2,步骤2
        if step == 2:
            pass
            continue


# ###########################信号的连接和槽函数####################################
def signal_slot():
        # #####################主窗口的信号和槽####################################
    pass

# #############################主程序###################################
if __name__ == '__main__':
    app = QApplication(sys.argv)


    # #######################项目级别的定义###################################
    class UI(QObject):  # 将项目定义为QObject,用来管理项目级别的信号和变量
        # ###########__init__###############
        def __init__(self):
            super().__init__()


    # ########################本项目的实例化###################################
    ui = UI()  # 项目实例化

    # ########################实例化画面#################################
    window1 = MainWindow()  # 主画面实例化

    window1.show()  # 显示画面
    window1.setupUi(window1)  # 画面初始化

    Jobs.start_todo()  # 系统初始化
    signal_slot()  # 信号与槽的定义

    app.aboutToQuit.connect(Jobs.before_quit)  # 退出系统之前的操作

    sys.exit(app.exec())

本阶段运行截图:

持续更新,直至完成。

感兴趣的朋友可以向我索要源文件并参与项目的共同学习和完善,同时也特别期待大神高手的指点和批评!

相关推荐
奔跑中的小象4 小时前
统信UOS + 天数AI卡部署SGLang服务手册
人工智能·uos·sglang·天数智芯
DevSecOps选型指南4 小时前
中国版Mythos,为何是悬镜安全灵脉CodeAI?
人工智能·安全
Shockang4 小时前
LangGraph 状态机实战
人工智能
刹那芳华19924 小时前
循环神经网络的从零开始实现(RNN)
人工智能·rnn·深度学习
阿童木写作4 小时前
跨境图片翻译工具多合一,批量图片视频字幕翻译加智能抠图
人工智能·python·音视频·语音识别
科技之门4 小时前
AI3D从建模到贴图、绑骨和动画的完整流程怎么做?V2Fun完整工作流指南
人工智能·3d·贴图
宇宙第一小趴菜4 小时前
二、机器学习的应用领域和发展史
人工智能·机器学习
前端开发江鸟4 小时前
我写过 MCP Server,却一直以为 MCP 只有 Tool
人工智能
天国梦5 小时前
自习室智能化升级避坑指南:天学网AI智习室方案实测与选型建议
大数据·人工智能
阿里云云原生5 小时前
可用性从 99.9% 跃升至 99.995%:畅捷通如何用 AI 重塑运维底座?
运维·网络·人工智能