PyQt5实现钻头刃面面积计算

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_())


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值