1、显示逻辑
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'rm.ui'
#
# Created by: PyQt5 UI code generator 5.15.9
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(743, 609)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
self.verticalLayout.setObjectName("verticalLayout")
self.horizontalLayout_4 = QtWidgets.QHBoxLayout()
self.horizontalLayout_4.setObjectName("horizontalLayout_4")
self.label = QtWidgets.QLabel(self.centralwidget)
self.label.setObjectName("label")
self.horizontalLayout_4.addWidget(self.label)
self.label_4 = QtWidgets.QLabel(self.centralwidget)
self.label_4.setObjectName("label_4")
self.horizontalLayout_4.addWidget(self.label_4)
self.horizontalLayout_4.setStretch(0, 5)
self.horizontalLayout_4.setStretch(1, 2)
self.verticalLayout.addLayout(self.horizontalLayout_4)
self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
self.horizontalLayout_3.setObjectName("horizontalLayout_3")
self.label_7 = QtWidgets.QLabel(self.centralwidget)
self.label_7.setObjectName("label_7")
self.horizontalLayout_3.addWidget(self.label_7)
self.horizontalSlider = QtWidgets.QSlider(self.centralwidget)
self.horizontalSlider.setOrientation(QtCore.Qt.Horizontal)
self.horizontalSlider.setObjectName("horizontalSlider")
self.horizontalLayout_3.addWidget(self.horizontalSlider)
self.label_2 = QtWidgets.QLabel(self.centralwidget)
self.label_2.setObjectName("label_2")
self.horizontalLayout_3.addWidget(self.label_2)
self.horizontalSlider_3 = QtWidgets.QSlider(self.centralwidget)
self.horizontalSlider_3.setOrientation(QtCore.Qt.Horizontal)
self.horizontalSlider_3.setObjectName("horizontalSlider_3")
self.horizontalLayout_3.addWidget(self.horizontalSlider_3)
self.label_5 = QtWidgets.QLabel(self.centralwidget)
self.label_5.setObjectName("label_5")
self.horizontalLayout_3.addWidget(self.label_5)
self.horizontalSlider_5 = QtWidgets.QSlider(self.centralwidget)
self.horizontalSlider_5.setOrientation(QtCore.Qt.Horizontal)
self.horizontalSlider_5.setObjectName("horizontalSlider_5")
self.horizontalLayout_3.addWidget(self.horizontalSlider_5)
self.verticalLayout.addLayout(self.horizontalLayout_3)
self.horizontalLayout_5 = QtWidgets.QHBoxLayout()
self.horizontalLayout_5.setObjectName("horizontalLayout_5")
self.label_8 = QtWidgets.QLabel(self.centralwidget)
self.label_8.setObjectName("label_8")
self.horizontalLayout_5.addWidget(self.label_8)
self.horizontalSlider_2 = QtWidgets.QSlider(self.centralwidget)
self.horizontalSlider_2.setOrientation(QtCore.Qt.Horizontal)
self.horizontalSlider_2.setObjectName("horizontalSlider_2")
self.horizontalLayout_5.addWidget(self.horizontalSlider_2)
self.label_3 = QtWidgets.QLabel(self.centralwidget)
self.label_3.setObjectName("label_3")
self.horizontalLayout_5.addWidget(self.label_3)
self.horizontalSlider_4 = QtWidgets.QSlider(self.centralwidget)
self.horizontalSlider_4.setOrientation(QtCore.Qt.Horizontal)
self.horizontalSlider_4.setObjectName("horizontalSlider_4")
self.horizontalLayout_5.addWidget(self.horizontalSlider_4)
self.label_6 = QtWidgets.QLabel(self.centralwidget)
self.label_6.setObjectName("label_6")
self.horizontalLayout_5.addWidget(self.label_6)
self.horizontalSlider_6 = QtWidgets.QSlider(self.centralwidget)
self.horizontalSlider_6.setOrientation(QtCore.Qt.Horizontal)
self.horizontalSlider_6.setObjectName("horizontalSlider_6")
self.horizontalLayout_5.addWidget(self.horizontalSlider_6)
self.verticalLayout.addLayout(self.horizontalLayout_5)
self.horizontalLayout = QtWidgets.QHBoxLayout()
self.horizontalLayout.setObjectName("horizontalLayout")
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setObjectName("pushButton")
self.horizontalLayout.addWidget(self.pushButton)
self.pushButton_4 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_4.setObjectName("pushButton_4")
self.horizontalLayout.addWidget(self.pushButton_4)
self.pushButton_3 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_3.setObjectName("pushButton_3")
self.horizontalLayout.addWidget(self.pushButton_3)
self.pushButton_5 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_5.setObjectName("pushButton_5")
self.horizontalLayout.addWidget(self.pushButton_5)
self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_2.setObjectName("pushButton_2")
self.horizontalLayout.addWidget(self.pushButton_2)
self.verticalLayout.addLayout(self.horizontalLayout)
self.horizontalLayout_6 = QtWidgets.QHBoxLayout()
self.horizontalLayout_6.setObjectName("horizontalLayout_6")
self.label_9 = QtWidgets.QLabel(self.centralwidget)
self.label_9.setObjectName("label_9")
self.horizontalLayout_6.addWidget(self.label_9)
self.label_10 = QtWidgets.QLabel(self.centralwidget)
self.label_10.setObjectName("label_10")
self.horizontalLayout_6.addWidget(self.label_10)
self.verticalLayout.addLayout(self.horizontalLayout_6)
self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
self.horizontalLayout_2.setSpacing(6)
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
self.graphicsView = QtWidgets.QGraphicsView(self.centralwidget)
self.graphicsView.setObjectName("graphicsView")
self.horizontalLayout_2.addWidget(self.graphicsView)
self.graphicsView_2 = QtWidgets.QGraphicsView(self.centralwidget)
self.graphicsView_2.setObjectName("graphicsView_2")
self.horizontalLayout_2.addWidget(self.graphicsView_2)
self.horizontalLayout_2.setStretch(0, 1)
self.horizontalLayout_2.setStretch(1, 1)
self.verticalLayout.addLayout(self.horizontalLayout_2)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 743, 23))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.label.setText(_translate("MainWindow", "ROI设定:"))
self.label_4.setText(_translate("MainWindow", "阈值设定:"))
self.label_7.setText(_translate("MainWindow", "x:"))
self.label_2.setText(_translate("MainWindow", "宽(pixel):"))
self.label_5.setText(_translate("MainWindow", "上限:"))
self.label_8.setText(_translate("MainWindow", "y:"))
self.label_3.setText(_translate("MainWindow", "高(pixel):"))
self.label_6.setText(_translate("MainWindow", "下限:"))
self.pushButton.setText(_translate("MainWindow", "打开图片"))
self.pushButton_4.setText(_translate("MainWindow", "ROI预览"))
self.pushButton_3.setText(_translate("MainWindow", "应用设置"))
self.pushButton_5.setText(_translate("MainWindow", "计算"))
self.pushButton_2.setText(_translate("MainWindow", "另存图片"))
self.label_9.setText(_translate("MainWindow", "原始图片:"))
self.label_10.setText(_translate("MainWindow", "处理结果:"))
2、业务逻辑
import sys
import os
from PyQt5.QtWidgets import QApplication, QMainWindow, QFileDialog, QMessageBox, QGraphicsScene, \
QGraphicsPixmapItem,QGraphicsRectItem
from PyQt5.QtGui import QPixmap, QImage,QPainter, QPen
from PyQt5.QtCore import Qt,QRectF,QRect
from rm import Ui_MainWindow
import cv2
import numpy as np
'''
当前存在的问题:
1、存在两个及以上graphicsView控件时,不知道怎么把图画在指定的graphicsView控件上
2、根据设定的ROI矩形框截取图片用于统计分析,该区域截取存在问题,可以调整框的大小及位置,但是在图像处理过程存在问题
'''
class rm(QMainWindow):
def __init__(self):
super().__init__()
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
self.setWindowTitle("刃面磨损量化计算")
# self.graphicsView = QGraphicsView(self)
# self.graphicsView.setGeometry(0, 0, 710, 650)
self.width = 1200
self.height = 1200
self.img=[]
self.area=0
#set horizontalScrollBar
self.ui.horizontalSlider.setRange(400,500)
self.ui.horizontalSlider.setValue(450)
self.ui.horizontalSlider_2.setRange(400,500)
self.ui.horizontalSlider_2.setValue(450)
self.ui.horizontalSlider_3.setRange(250, 350)
self.ui.horizontalSlider_3.setValue(300)
self.ui.horizontalSlider_4.setRange(150, 250)
self.ui.horizontalSlider_4.setValue(200)
self.ui.horizontalSlider_5.setRange(12, 254)
self.ui.horizontalSlider_5.setValue(239)
self.ui.horizontalSlider_6.setRange(1, 200)
self.ui.horizontalSlider_6.setValue(120)
self.ui.horizontalSlider.valueChanged.connect(self.handle_slider_change)
self.ui.horizontalSlider_2.valueChanged.connect(self.handle_slider_change2)
self.ui.horizontalSlider_3.valueChanged.connect(self.handle_slider_change3)
self.ui.horizontalSlider_4.valueChanged.connect(self.handle_slider_change4)
self.ui.horizontalSlider_5.valueChanged.connect(self.handle_slider_change5)
self.ui.horizontalSlider_6.valueChanged.connect(self.handle_slider_change6)
self.ui.pushButton.clicked.connect(self.pushButton_clicked)
self.ui.pushButton_2.clicked.connect(self.pushButton2_clicked)
self.ui.pushButton_3.clicked.connect(self.pushButton3_clicked)
self.ui.pushButton_4.clicked.connect(self.pushButton4_clicked)
self.ui.pushButton_5.clicked.connect(self.pushButton5_clicked)
self.x=450
self.y=450
self.w=300
self.h=200
self.up=239
self.down=120
def handle_slider_change(self,value):
self.x=value
def handle_slider_change2(self, value):
self.y = value
def handle_slider_change3(self, value):
self.w = value
def handle_slider_change4(self, value):
self.h = value
def handle_slider_change5(self, value):
self.up = value
def handle_slider_change6(self, value):
self.down = value
def pushButton_clicked(self):#open tiff figure
file_name = QFileDialog.getOpenFileName(self, "Open File", "./", "tiff (*.tiff)")
image_path = file_name[0]
if (file_name[0] == ""):
QMessageBox.information(self, "提示", self.tr("没有选择图片文件!"))
print(image_path)
img = cv2.imread(image_path) # 读取图像
self.img = img
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 转换图像通道
self.width = img.shape[1] # 获取图像大小
self.height = img.shape[0]
self.zoomscale = 1 # 图片放缩尺度
frame = QImage(img, self.width, self.height, QImage.Format_RGB888)
pix = QPixmap.fromImage(frame)
self.item = QGraphicsPixmapItem(pix) # 创建像素图元
self.scene = QGraphicsScene() # 创建场景
self.scene.addItem(self.item)
self.ui.graphicsView.setScene(self.scene)
self.ui.graphicsView.show()
def pushButton2_clicked(self):#save as
pass
def pushButton3_clicked(self):#apply
# imgdst=self.img[(self.y - int(self.h / 2)):(self.y +int(self.h / 2)),(self.x - int(self.w / 2)):(self.x +int(self.w / 2))]
imgdst = self.img[200:1000,200:1000]
height = imgdst.shape[0]
width = imgdst.shape[1]
gray = cv2.cvtColor(imgdst, cv2.COLOR_BGR2GRAY)
# #超过阈值thresh,值为255,未超过为0。
# ret1, p1 = cv2.threshold(src=gray, thresh=240, maxval=255, type=cv2.THRESH_BINARY)
p1 = gray
for i in range(0, height):
for j in range(0, width):
if gray[i, j] > self.up:
p1[i, j] = 0
elif gray[i, j] > self.down:
p1[i, j] = 255
else:
p1[i, j] = 0
k = np.ones((8, 8), np.uint8)
temp = cv2.erode(p1, k)
p2 = cv2.dilate(temp, k)
contours, hierarchy = cv2.findContours(p2, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
cv_contours = []
area_lst = []
for contour in contours:
area = cv2.contourArea(contour)
if area > 10000:
cv_contours.append(contour)
area_lst.append(area)
self.area = sum(area_lst)
self.zoomscale = 1 # 图片放缩尺度
frame = QImage(p2, width, height, QImage.Format_Grayscale8)
pix = QPixmap.fromImage(frame)
self.item = QGraphicsPixmapItem(pix) # 创建像素图元
self.scene = QGraphicsScene() # 创建场景
self.scene.addItem(self.item)
self.ui.graphicsView_2.setScene(self.scene)
self.ui.graphicsView_2.show()
# cv2.drawContours(imgdst, cv_contours, -1, (0, 255, 0), 3)
def pushButton4_clicked(self):#roi
# 绘制一个红色矩形框
item1=QGraphicsRectItem(self.x - int(self.w / 2), self.y - int(self.h / 2),self.x +int(self.w / 2), self.y +int(self.h / 2))
# item1 = QGraphicsRectItem(300, 350, 600,550)
item1.setPen(Qt.red)
# item1.setBrush(Qt.red)
self.scene.addItem(item1)
def pushButton5_clicked(self):#caculation
QMessageBox.information(self, "计算结果", f"刃面面积为:{self.area} pixels",
QMessageBox.Yes) # 最后的Yes表示弹框的按钮显示为Yes,默认按钮显示为OK,不填QMessageBox.Yes即为默认
if __name__ == "__main__":
app = QApplication(sys.argv)
mainWindow = rm()
mainWindow.show()
sys.exit(app.exec_())