OpenCV 提供了丰富的图像处理和计算机视觉功能,可以实现各种复杂的图像处理任务,如目标检测、人脸识别、图像分割等。
PyQt(或PySide)是一个创建GUI应用程序的工具包,它是Python编程语言和Qt库的成功融合。Qt库是最强大的GUI库之一。Qt的快速界面编辑工具Qt Designer提供了直观的可视化界面设计环境,通过拖拽和放置控件来设计界面,简化了界面设计的过程。PyQt提供了丰富的控件库,同时支持多种媒体文件的展示。尤其是PyQt的信号与槽的刷新机制提供了高效和可靠的信号响应机制。
下面以一个实际的项目搭建过程为demo,尝试联合使用以上两个库,力争各尽所长。原则上,前端的界面显示和操作交给PySide,后台的图像处理交给OpenCV。
这是一个显微拍照画面内的轮廓识别和尺寸测量、数量统计项目。
一、框架搭建
1、主界面
主界面利用Qt Designer 制作。
主按钮站:
应该达到的运行效果:
2、主界面的按钮
按钮有两种:
第一种是“点动”式的,图标为双状态,例如“新建项目”按钮。其样式表为:
第二种是“翻转“式的,每点击一次状态反转,即:可以反转”checked“状态。按钮图标为三个状态,例如“局部放大”按钮。其样式表为:
这种按钮,自定义了一个特性:activated来取代系统自带的checked,当这个特性activated="true"时,改变按钮的背景色。当然也可以使用系统自带的checked特性来实现同样的功能,这里的目的主要是练习一下 按钮的自定义特性的应用。
使用系统自带的checked特性:
两种方法在显示上的微妙差别如下:左边是自定义特性的,右边是使用系统自带的checked特性来实现的。区别在于系统自带的checked特性显示的边框是pressed,即按下时的边框特性。
3、阶梯渐变的色条
主界面的颜色样例条,自定义脚本,命名为GradientLabel.py:
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 将颜色样例条”提升为“该自定义脚本。
持续更新,直至完成