使用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())

本阶段运行截图:

持续更新,直至完成。

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

相关推荐
xuehaishijue4 分钟前
红外画面空中目标检测系统源码分享
人工智能·目标检测·计算机视觉
羊小猪~~4 分钟前
机器学习/数据分析--用通俗语言讲解时间序列自回归(AR)模型,并用其预测天气,拟合度98%+
人工智能·python·机器学习·数据挖掘·数据分析·回归·时序数据库
浊酒南街12 分钟前
吴恩达深度学习笔记:卷积神经网络(Foundations of Convolutional Neural Networks)2.7-2.8
人工智能·深度学习·神经网络
DuoRuaiMiFa1 小时前
ChatGPT全新功能Canvas上线:开启智能编程与写作新篇章
人工智能·chatgpt
DisonTangor1 小时前
Windows 11将新增基于AI的搜索、生成式填充和其它AI功能
人工智能
soso19681 小时前
【AI自然语言处理应用】通过API调用通义晓蜜CCAI-对话分析AIO应用
人工智能·自然语言·ccai
网安-搬运工1 小时前
RAG再总结之如何使大模型更好使用外部数据:四个不同层级及查询-文档对齐策略
人工智能·自然语言处理·大模型·llm·大语言模型·ai大模型·rag
大模型八哥1 小时前
大模型扫盲系列——大模型实用技术介绍(上)
人工智能·程序人生·ai·大模型·llm·llama·ai大模型
被制作时长两年半的个人练习生1 小时前
【pytorch】权重为0的情况
人工智能·pytorch·深度学习