OpenCV中的轮廓(2)
来源:互联网 发布:买域名是啥 编辑:程序博客网 时间:2024/05/29 18:10
即上次说了OpenCV中的轮廓的理论知识,接下来做个小工具去实现这些功能,包含之前的轮廓检测以及图像金字塔。由于时间有限拉普拉斯金字塔没有实现,还有轮廓的性质没有获取显示出来,这里讲给出源码,有兴趣的可以自行添加。 本人运行的环境是:python3.6 PyQt5.9 Matplotlib openCV3 等
效果如图所示:
mian.py
# -*- coding:utf-8 -*-# import sysfrom PyQt5.QtWidgets import QApplication , QMainWindowfrom mainfun import *if __name__ == '__main__': app = QApplication(sys.argv) mainW = QMainWindow() ui = myWindows(mainW) mainW.show() sys.exit(app.exec_())
界面文件mainwindow3.py
# -*- coding: utf-8 -*-# Form implementation generated from reading ui file 'main3.ui'## Created by: PyQt5 UI code generator 5.9.1## WARNING! All changes made in this file will be lost!from PyQt5 import QtCore, QtGui, QtWidgetsimport matplotlib.pyplot as plt from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvasclass Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(1131, 761) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.gridLayout = QtWidgets.QGridLayout(self.centralwidget) self.gridLayout.setObjectName("gridLayout") self.tabWidget = QtWidgets.QTabWidget(self.centralwidget) self.tabWidget.setObjectName("tabWidget") self.tab = QtWidgets.QWidget() self.tab.setObjectName("tab") self.gridLayout_2 = QtWidgets.QGridLayout(self.tab) self.gridLayout_2.setObjectName("gridLayout_2") self.frame = QtWidgets.QFrame(self.tab) self.frame.setMinimumSize(QtCore.QSize(151, 0)) self.frame.setMaximumSize(QtCore.QSize(151, 16777215)) self.frame.setFrameShape(QtWidgets.QFrame.Box) self.frame.setFrameShadow(QtWidgets.QFrame.Raised) self.frame.setObjectName("frame") self.canny_L2gradient_checkBox = QtWidgets.QCheckBox(self.frame) self.canny_L2gradient_checkBox.setGeometry(QtCore.QRect(60, 100, 81, 21)) self.canny_L2gradient_checkBox.setObjectName("canny_L2gradient_checkBox") self.canny_open_pushButton = QtWidgets.QPushButton(self.frame) self.canny_open_pushButton.setGeometry(QtCore.QRect(60, 140, 75, 23)) self.canny_open_pushButton.setObjectName("canny_open_pushButton") self.widget = QtWidgets.QWidget(self.frame) self.widget.setGeometry(QtCore.QRect(10, 30, 122, 56)) self.widget.setObjectName("widget") self.verticalLayout = QtWidgets.QVBoxLayout(self.widget) self.verticalLayout.setContentsMargins(0, 0, 0, 0) self.verticalLayout.setObjectName("verticalLayout") self.horizontalLayout = QtWidgets.QHBoxLayout() self.horizontalLayout.setObjectName("horizontalLayout") self.label = QtWidgets.QLabel(self.widget) self.label.setMinimumSize(QtCore.QSize(41, 22)) self.label.setMaximumSize(QtCore.QSize(41, 22)) self.label.setObjectName("label") self.horizontalLayout.addWidget(self.label) self.canny_min_spinBox = QtWidgets.QSpinBox(self.widget) self.canny_min_spinBox.setMinimumSize(QtCore.QSize(71, 22)) self.canny_min_spinBox.setMaximumSize(QtCore.QSize(71, 22)) self.canny_min_spinBox.setMaximum(999999999) self.canny_min_spinBox.setProperty("value", 200) self.canny_min_spinBox.setObjectName("canny_min_spinBox") self.horizontalLayout.addWidget(self.canny_min_spinBox) self.verticalLayout.addLayout(self.horizontalLayout) self.horizontalLayout_2 = QtWidgets.QHBoxLayout() self.horizontalLayout_2.setObjectName("horizontalLayout_2") self.label_2 = QtWidgets.QLabel(self.widget) self.label_2.setMinimumSize(QtCore.QSize(41, 22)) self.label_2.setMaximumSize(QtCore.QSize(41, 22)) self.label_2.setObjectName("label_2") self.horizontalLayout_2.addWidget(self.label_2) self.canny_max_spinBox = QtWidgets.QSpinBox(self.widget) self.canny_max_spinBox.setMinimumSize(QtCore.QSize(71, 22)) self.canny_max_spinBox.setMaximumSize(QtCore.QSize(71, 22)) self.canny_max_spinBox.setMaximum(999999999) self.canny_max_spinBox.setProperty("value", 300) self.canny_max_spinBox.setObjectName("canny_max_spinBox") self.horizontalLayout_2.addWidget(self.canny_max_spinBox) self.verticalLayout.addLayout(self.horizontalLayout_2) self.gridLayout_2.addWidget(self.frame, 0, 0, 1, 1) self.frame_2 = QtWidgets.QFrame(self.tab) self.frame_2.setFrameShape(QtWidgets.QFrame.Box) self.frame_2.setFrameShadow(QtWidgets.QFrame.Raised) self.frame_2.setObjectName("frame_2") self.gridLayout_3 = QtWidgets.QGridLayout(self.frame_2) self.gridLayout_3.setObjectName("gridLayout_3") self.widget1 = QtWidgets.QWidget(self.frame_2) self.widget1.setObjectName("widget1") self.gridLayout_8 = QtWidgets.QGridLayout(self.widget1) self.gridLayout_8.setObjectName("gridLayout_8") self.canny_figure, self.canny_figaxes = plt.subplots() self.canny_canvas = FigureCanvas(self.canny_figure) # self.widget_4 = QtWidgets.QWidget(self.widget1) # self.widget_4.setObjectName("widget_4") self.gridLayout_8.addWidget(self.canny_canvas, 0, 0, 1, 1) self.gridLayout_3.addWidget(self.widget1, 0, 0, 1, 1) self.gridLayout_2.addWidget(self.frame_2, 0, 1, 1, 1) self.tabWidget.addTab(self.tab, "") self.tab_2 = QtWidgets.QWidget() self.tab_2.setObjectName("tab_2") self.gridLayout_4 = QtWidgets.QGridLayout(self.tab_2) self.gridLayout_4.setObjectName("gridLayout_4") self.frame_3 = QtWidgets.QFrame(self.tab_2) self.frame_3.setMinimumSize(QtCore.QSize(91, 0)) self.frame_3.setMaximumSize(QtCore.QSize(91, 16777215)) self.frame_3.setFrameShape(QtWidgets.QFrame.Box) self.frame_3.setFrameShadow(QtWidgets.QFrame.Raised) self.frame_3.setObjectName("frame_3") self.widget2 = QtWidgets.QWidget(self.frame_3) self.widget2.setGeometry(QtCore.QRect(10, 20, 77, 112)) self.widget2.setObjectName("widget2") self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.widget2) self.verticalLayout_2.setContentsMargins(0, 0, 0, 0) self.verticalLayout_2.setObjectName("verticalLayout_2") self.jzt_open_pushButton = QtWidgets.QPushButton(self.widget2) self.jzt_open_pushButton.setObjectName("jzt_open_pushButton") self.verticalLayout_2.addWidget(self.jzt_open_pushButton) self.jzt_down_pushButton = QtWidgets.QPushButton(self.widget2) self.jzt_down_pushButton.setObjectName("jzt_down_pushButton") self.verticalLayout_2.addWidget(self.jzt_down_pushButton) self.jzt_up_pushButton = QtWidgets.QPushButton(self.widget2) self.jzt_up_pushButton.setObjectName("jzt_up_pushButton") self.verticalLayout_2.addWidget(self.jzt_up_pushButton) self.jzt_lapulasi_pushButton = QtWidgets.QPushButton(self.widget2) self.jzt_lapulasi_pushButton.setObjectName("jzt_lapulasi_pushButton") self.verticalLayout_2.addWidget(self.jzt_lapulasi_pushButton) self.gridLayout_4.addWidget(self.frame_3, 0, 0, 1, 1) self.frame_4 = QtWidgets.QFrame(self.tab_2) self.frame_4.setFrameShape(QtWidgets.QFrame.Box) self.frame_4.setFrameShadow(QtWidgets.QFrame.Raised) self.frame_4.setObjectName("frame_4") self.gridLayout_5 = QtWidgets.QGridLayout(self.frame_4) self.gridLayout_5.setObjectName("gridLayout_5") self.jzt_figure, self.jzt_figaxes = plt.subplots() self.jzt_canvas = FigureCanvas(self.jzt_figure) # self.widget_2 = QtWidgets.QWidget(self.frame_4) # self.widget_2.setObjectName("widget_2") self.gridLayout_5.addWidget(self.jzt_canvas, 0, 0, 1, 1) self.gridLayout_4.addWidget(self.frame_4, 0, 1, 1, 1) self.tabWidget.addTab(self.tab_2, "") self.tab_3 = QtWidgets.QWidget() self.tab_3.setObjectName("tab_3") self.gridLayout_6 = QtWidgets.QGridLayout(self.tab_3) self.gridLayout_6.setObjectName("gridLayout_6") self.frame_5 = QtWidgets.QFrame(self.tab_3) self.frame_5.setMinimumSize(QtCore.QSize(261, 0)) self.frame_5.setMaximumSize(QtCore.QSize(261, 16777215)) self.frame_5.setFrameShape(QtWidgets.QFrame.Box) self.frame_5.setFrameShadow(QtWidgets.QFrame.Raised) self.frame_5.setObjectName("frame_5") self.lk_open_pushButton = QtWidgets.QPushButton(self.frame_5) self.lk_open_pushButton.setGeometry(QtCore.QRect(170, 40, 75, 23)) self.lk_open_pushButton.setObjectName("lk_open_pushButton") self.lk_getinfo_pushButton = QtWidgets.QPushButton(self.frame_5) self.lk_getinfo_pushButton.setGeometry(QtCore.QRect(170, 100, 75, 23)) self.lk_getinfo_pushButton.setObjectName("lk_getinfo_pushButton") self.frame_6 = QtWidgets.QFrame(self.frame_5) self.frame_6.setGeometry(QtCore.QRect(10, 130, 241, 261)) self.frame_6.setFrameShape(QtWidgets.QFrame.Box) self.frame_6.setFrameShadow(QtWidgets.QFrame.Raised) self.frame_6.setObjectName("frame_6") self.label_6 = QtWidgets.QLabel(self.frame_6) self.label_6.setGeometry(QtCore.QRect(10, 10, 54, 16)) self.label_6.setFrameShape(QtWidgets.QFrame.NoFrame) self.label_6.setObjectName("label_6") self.lk_bianjie_comboBox = QtWidgets.QComboBox(self.frame_6) self.lk_bianjie_comboBox.setGeometry(QtCore.QRect(20, 230, 91, 22)) self.lk_bianjie_comboBox.setObjectName("lk_bianjie_comboBox") self.lk_bianjie_comboBox.addItem("") self.lk_bianjie_comboBox.addItem("") self.lk_bianjie_comboBox.addItem("") self.lk_bianjie_comboBox.addItem("") self.lk_bianjie_comboBox.addItem("") self.lk_OK_pushButton = QtWidgets.QPushButton(self.frame_6) self.lk_OK_pushButton.setGeometry(QtCore.QRect(130, 230, 75, 23)) self.lk_OK_pushButton.setObjectName("lk_OK_pushButton") self.widget3 = QtWidgets.QWidget(self.frame_6) self.widget3.setGeometry(QtCore.QRect(20, 30, 217, 189)) self.widget3.setObjectName("widget3") self.verticalLayout_6 = QtWidgets.QVBoxLayout(self.widget3) self.verticalLayout_6.setContentsMargins(0, 0, 0, 0) self.verticalLayout_6.setObjectName("verticalLayout_6") self.verticalLayout_4 = QtWidgets.QVBoxLayout() self.verticalLayout_4.setObjectName("verticalLayout_4") self.horizontalLayout_6 = QtWidgets.QHBoxLayout() self.horizontalLayout_6.setObjectName("horizontalLayout_6") self.label_7 = QtWidgets.QLabel(self.widget3) self.label_7.setMinimumSize(QtCore.QSize(54, 20)) self.label_7.setMaximumSize(QtCore.QSize(54, 20)) self.label_7.setFrameShape(QtWidgets.QFrame.NoFrame) self.label_7.setObjectName("label_7") self.horizontalLayout_6.addWidget(self.label_7) self.lk_ju_lineEdit = QtWidgets.QLineEdit(self.widget3) self.lk_ju_lineEdit.setMinimumSize(QtCore.QSize(151, 20)) self.lk_ju_lineEdit.setMaximumSize(QtCore.QSize(151, 20)) self.lk_ju_lineEdit.setObjectName("lk_ju_lineEdit") self.horizontalLayout_6.addWidget(self.lk_ju_lineEdit) self.verticalLayout_4.addLayout(self.horizontalLayout_6) self.horizontalLayout_7 = QtWidgets.QHBoxLayout() self.horizontalLayout_7.setObjectName("horizontalLayout_7") self.label_8 = QtWidgets.QLabel(self.widget3) self.label_8.setMinimumSize(QtCore.QSize(54, 20)) self.label_8.setMaximumSize(QtCore.QSize(54, 20)) self.label_8.setFrameShape(QtWidgets.QFrame.NoFrame) self.label_8.setObjectName("label_8") self.horizontalLayout_7.addWidget(self.label_8) self.lk_zhongxin_lineEdit = QtWidgets.QLineEdit(self.widget3) self.lk_zhongxin_lineEdit.setMinimumSize(QtCore.QSize(151, 20)) self.lk_zhongxin_lineEdit.setMaximumSize(QtCore.QSize(151, 20)) self.lk_zhongxin_lineEdit.setObjectName("lk_zhongxin_lineEdit") self.horizontalLayout_7.addWidget(self.lk_zhongxin_lineEdit) self.verticalLayout_4.addLayout(self.horizontalLayout_7) self.horizontalLayout_8 = QtWidgets.QHBoxLayout() self.horizontalLayout_8.setObjectName("horizontalLayout_8") self.label_9 = QtWidgets.QLabel(self.widget3) self.label_9.setMinimumSize(QtCore.QSize(54, 20)) self.label_9.setMaximumSize(QtCore.QSize(54, 20)) self.label_9.setFrameShape(QtWidgets.QFrame.NoFrame) self.label_9.setObjectName("label_9") self.horizontalLayout_8.addWidget(self.label_9) self.lk_area_lineEdit = QtWidgets.QLineEdit(self.widget3) self.lk_area_lineEdit.setMinimumSize(QtCore.QSize(151, 20)) self.lk_area_lineEdit.setMaximumSize(QtCore.QSize(151, 20)) self.lk_area_lineEdit.setObjectName("lk_area_lineEdit") self.horizontalLayout_8.addWidget(self.lk_area_lineEdit) self.verticalLayout_4.addLayout(self.horizontalLayout_8) self.horizontalLayout_9 = QtWidgets.QHBoxLayout() self.horizontalLayout_9.setObjectName("horizontalLayout_9") self.label_10 = QtWidgets.QLabel(self.widget3) self.label_10.setMinimumSize(QtCore.QSize(54, 20)) self.label_10.setMaximumSize(QtCore.QSize(54, 20)) self.label_10.setFrameShape(QtWidgets.QFrame.NoFrame) self.label_10.setObjectName("label_10") self.horizontalLayout_9.addWidget(self.label_10) self.lk_long_lineEdit = QtWidgets.QLineEdit(self.widget3) self.lk_long_lineEdit.setMinimumSize(QtCore.QSize(151, 20)) self.lk_long_lineEdit.setMaximumSize(QtCore.QSize(151, 20)) self.lk_long_lineEdit.setObjectName("lk_long_lineEdit") self.horizontalLayout_9.addWidget(self.lk_long_lineEdit) self.verticalLayout_4.addLayout(self.horizontalLayout_9) self.verticalLayout_6.addLayout(self.verticalLayout_4) self.horizontalLayout_10 = QtWidgets.QHBoxLayout() self.horizontalLayout_10.setObjectName("horizontalLayout_10") self.verticalLayout_5 = QtWidgets.QVBoxLayout() self.verticalLayout_5.setObjectName("verticalLayout_5") self.lk_tuxing_radioButton = QtWidgets.QRadioButton(self.widget3) self.lk_tuxing_radioButton.setMinimumSize(QtCore.QSize(54, 21)) self.lk_tuxing_radioButton.setMaximumSize(QtCore.QSize(54, 21)) self.lk_tuxing_radioButton.setObjectName("lk_tuxing_radioButton") self.verticalLayout_5.addWidget(self.lk_tuxing_radioButton) self.label_11 = QtWidgets.QLabel(self.widget3) self.label_11.setMinimumSize(QtCore.QSize(54, 20)) self.label_11.setMaximumSize(QtCore.QSize(54, 20)) self.label_11.setFrameShape(QtWidgets.QFrame.NoFrame) self.label_11.setObjectName("label_11") self.verticalLayout_5.addWidget(self.label_11) self.horizontalLayout_10.addLayout(self.verticalLayout_5) self.lk_tubao_textEdit = QtWidgets.QTextEdit(self.widget3) self.lk_tubao_textEdit.setMinimumSize(QtCore.QSize(151, 71)) self.lk_tubao_textEdit.setMaximumSize(QtCore.QSize(151, 71)) self.lk_tubao_textEdit.setObjectName("lk_tubao_textEdit") self.horizontalLayout_10.addWidget(self.lk_tubao_textEdit) self.verticalLayout_6.addLayout(self.horizontalLayout_10) self.frame_7 = QtWidgets.QFrame(self.frame_5) self.frame_7.setGeometry(QtCore.QRect(10, 400, 241, 251)) self.frame_7.setFrameShape(QtWidgets.QFrame.Box) self.frame_7.setFrameShadow(QtWidgets.QFrame.Raised) self.frame_7.setObjectName("frame_7") self.label_12 = QtWidgets.QLabel(self.frame_7) self.label_12.setGeometry(QtCore.QRect(10, 10, 54, 16)) self.label_12.setFrameShape(QtWidgets.QFrame.NoFrame) self.label_12.setObjectName("label_12") self.lk_xingzhi_textEdit = QtWidgets.QTextEdit(self.frame_7) self.lk_xingzhi_textEdit.setGeometry(QtCore.QRect(10, 30, 221, 211)) self.lk_xingzhi_textEdit.setObjectName("lk_xingzhi_textEdit") self.widget4 = QtWidgets.QWidget(self.frame_5) self.widget4.setGeometry(QtCore.QRect(10, 10, 145, 52)) self.widget4.setObjectName("widget4") self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.widget4) self.verticalLayout_3.setContentsMargins(0, 0, 0, 0) self.verticalLayout_3.setObjectName("verticalLayout_3") self.horizontalLayout_3 = QtWidgets.QHBoxLayout() self.horizontalLayout_3.setObjectName("horizontalLayout_3") self.label_3 = QtWidgets.QLabel(self.widget4) self.label_3.setObjectName("label_3") self.horizontalLayout_3.addWidget(self.label_3) self.lk_mode_comboBox = QtWidgets.QComboBox(self.widget4) self.lk_mode_comboBox.setMinimumSize(QtCore.QSize(75, 20)) self.lk_mode_comboBox.setObjectName("lk_mode_comboBox") self.lk_mode_comboBox.addItem("") self.lk_mode_comboBox.addItem("") self.lk_mode_comboBox.addItem("") self.lk_mode_comboBox.addItem("") self.horizontalLayout_3.addWidget(self.lk_mode_comboBox) self.verticalLayout_3.addLayout(self.horizontalLayout_3) self.horizontalLayout_4 = QtWidgets.QHBoxLayout() self.horizontalLayout_4.setObjectName("horizontalLayout_4") self.label_4 = QtWidgets.QLabel(self.widget4) self.label_4.setObjectName("label_4") self.horizontalLayout_4.addWidget(self.label_4) self.lk_fangf_comboBox = QtWidgets.QComboBox(self.widget4) self.lk_fangf_comboBox.setMinimumSize(QtCore.QSize(75, 20)) self.lk_fangf_comboBox.setObjectName("lk_fangf_comboBox") self.lk_fangf_comboBox.addItem("") self.lk_fangf_comboBox.addItem("") self.horizontalLayout_4.addWidget(self.lk_fangf_comboBox) self.verticalLayout_3.addLayout(self.horizontalLayout_4) self.widget5 = QtWidgets.QWidget(self.frame_5) self.widget5.setGeometry(QtCore.QRect(10, 100, 143, 22)) self.widget5.setObjectName("widget5") self.horizontalLayout_5 = QtWidgets.QHBoxLayout(self.widget5) self.horizontalLayout_5.setContentsMargins(0, 0, 0, 0) self.horizontalLayout_5.setObjectName("horizontalLayout_5") self.label_5 = QtWidgets.QLabel(self.widget5) self.label_5.setObjectName("label_5") self.horizontalLayout_5.addWidget(self.label_5) self.lk_list_comboBox = QtWidgets.QComboBox(self.widget5) self.lk_list_comboBox.setMinimumSize(QtCore.QSize(75, 20)) self.lk_list_comboBox.setObjectName("lk_list_comboBox") # self.lk_list_comboBox.addItem("") # self.lk_list_comboBox.addItem("") self.horizontalLayout_5.addWidget(self.lk_list_comboBox) self.gridLayout_6.addWidget(self.frame_5, 0, 0, 1, 1) self.frame_8 = QtWidgets.QFrame(self.tab_3) self.frame_8.setFrameShape(QtWidgets.QFrame.Box) self.frame_8.setFrameShadow(QtWidgets.QFrame.Raised) self.frame_8.setObjectName("frame_8") self.gridLayout_7 = QtWidgets.QGridLayout(self.frame_8) self.gridLayout_7.setObjectName("gridLayout_7") self.lk_figure, self.lk_figaxes = plt.subplots() self.lk_canvas = FigureCanvas(self.lk_figure) # self.widget_3 = QtWidgets.QWidget(self.frame_8) # self.widget_3.setObjectName("widget_3") self.gridLayout_7.addWidget(self.lk_canvas, 0, 0, 1, 1) self.gridLayout_6.addWidget(self.frame_8, 0, 1, 1, 1) self.tabWidget.addTab(self.tab_3, "") self.gridLayout.addWidget(self.tabWidget, 0, 0, 1, 1) MainWindow.setCentralWidget(self.centralwidget) self.retranslateUi(MainWindow) self.tabWidget.setCurrentIndex(0) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) self.canny_L2gradient_checkBox.setText(_translate("MainWindow", "L2gradient")) self.canny_open_pushButton.setText(_translate("MainWindow", "打开文件")) self.label.setText(_translate("MainWindow", "<html><head/><body><p align=\"right\">minVal:</p></body></html>")) self.label_2.setText(_translate("MainWindow", "<html><head/><body><p align=\"right\">maxVal:</p></body></html>")) self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate("MainWindow", "边缘检测")) self.jzt_open_pushButton.setText(_translate("MainWindow", "打开文件")) self.jzt_down_pushButton.setText(_translate("MainWindow", "pyrDown")) self.jzt_up_pushButton.setText(_translate("MainWindow", "pyrUp")) self.jzt_lapulasi_pushButton.setText(_translate("MainWindow", "拉普拉斯")) self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _translate("MainWindow", "图像金字塔")) self.lk_open_pushButton.setText(_translate("MainWindow", "打开图像")) self.lk_getinfo_pushButton.setText(_translate("MainWindow", "获取信息")) self.label_6.setText(_translate("MainWindow", "<html><head/><body><p>轮廓特征</p></body></html>")) self.lk_bianjie_comboBox.setItemText(0, _translate("MainWindow", "直边界矩形")) self.lk_bianjie_comboBox.setItemText(1, _translate("MainWindow", "最小边界矩形")) self.lk_bianjie_comboBox.setItemText(2, _translate("MainWindow", "外接圆")) self.lk_bianjie_comboBox.setItemText(3, _translate("MainWindow", "椭圆拟合")) self.lk_bianjie_comboBox.setItemText(4, _translate("MainWindow", "直线拟合")) self.lk_OK_pushButton.setText(_translate("MainWindow", "确定")) self.label_7.setText(_translate("MainWindow", "<html><head/><body><p align=\"right\">矩:</p></body></html>")) self.label_8.setText(_translate("MainWindow", "<html><head/><body><p align=\"right\">重心:</p></body></html>")) self.label_9.setText(_translate("MainWindow", "<html><head/><body><p align=\"right\">轮廓面积:</p></body></html>")) self.label_10.setText(_translate("MainWindow", "<html><head/><body><p align=\"right\">轮廓周长:</p></body></html>")) self.lk_tuxing_radioButton.setText(_translate("MainWindow", "凸性")) self.label_11.setText(_translate("MainWindow", "<html><head/><body><p align=\"right\">凸包:</p></body></html>")) self.label_12.setText(_translate("MainWindow", "<html><head/><body><p>轮廓性质</p></body></html>")) self.label_3.setText(_translate("MainWindow", "检索模式:")) self.lk_mode_comboBox.setItemText(0, _translate("MainWindow", "LIST")) self.lk_mode_comboBox.setItemText(1, _translate("MainWindow", "EXTERNAL")) self.lk_mode_comboBox.setItemText(2, _translate("MainWindow", "CCOMP")) self.lk_mode_comboBox.setItemText(3, _translate("MainWindow", "TREE")) self.label_4.setText(_translate("MainWindow", "近似方法:")) self.lk_fangf_comboBox.setItemText(0, _translate("MainWindow", "NONE")) self.lk_fangf_comboBox.setItemText(1, _translate("MainWindow", "SIMPLE")) self.label_5.setText(_translate("MainWindow", "轮廓列表:")) # self.lk_list_comboBox.setItemText(0, _translate("MainWindow", "1")) # self.lk_list_comboBox.setItemText(1, _translate("MainWindow", "2")) self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_3), _translate("MainWindow", "图像轮廓"))
逻辑实现代码mainfun.py
from mainwindow3 import Ui_MainWindowfrom PyQt5 import QtWidgetsimport cv2import numpy as npclass myWindows(Ui_MainWindow): """docstring for myWindows""" def __init__(self, MainWindow): super(myWindows, self).__init__() self.window = Ui_MainWindow() self.window.setupUi(MainWindow) self.btn_clicked_connect_fun() # self.window.Tools_txmode_comboBox.currentTextChanged.connect(self.tools_fun) # self.tools_fun() def btn_clicked_connect_fun(self): self.window.canny_open_pushButton.clicked.connect(self.opencv_canny_fun) self.window.jzt_up_pushButton.clicked.connect(self.jzt_up_fun) self.window.jzt_open_pushButton.clicked.connect(self.jzt_open_fun) self.window.jzt_lapulasi_pushButton.clicked.connect(self.jzt_lapulasi_fun) self.window.jzt_down_pushButton.clicked.connect(self.jzt_down_fun) self.window.lk_open_pushButton.clicked.connect(self.lk_open_fun) self.window.lk_getinfo_pushButton.clicked.connect(self.lk_getinfo_fun) self.window.lk_OK_pushButton.clicked.connect(self.lk_Ok_fun) def test(self): print('-------test--------') def opencv_canny_fun(self): fileName = self.open_image_file() if fileName: img = cv2.imread(fileName, 0) minVal = self.window.canny_min_spinBox.value() maxVal = self.window.canny_max_spinBox.value() flag_L2gradient = self.window.canny_L2gradient_checkBox.isChecked() if flag_L2gradient: ret = cv2.Canny(img, minVal, maxVal, L2gradient=flag_L2gradient) else: ret = cv2.Canny(img, minVal, maxVal) if hasattr(self, "cannyimg"): self.bhshowopenimg.remove() del self.bhshowopenimg self.cannyimg = self.window.canny_figaxes.imshow(ret, cmap="gray") self.window.canny_figaxes.autoscale_view() self.window.canny_figure.canvas.draw() def jzt_open_fun(self): fileName = self.open_image_file() if fileName: self.jzt_img = cv2.imread(fileName) b, g, r = cv2.split(self.jzt_img) imgret = cv2.merge([r,g,b]) if hasattr(self, "jztopenimg"): self.jztopenimg.remove() del self.jztopenimg self.jztopenimg = self.window.jzt_figaxes.imshow(imgret) self.window.jzt_figaxes.autoscale_view() self.window.jzt_figure.canvas.draw() def jzt_down_fun(self): self.jzt_img = cv2.pyrDown(self.jzt_img) b, g, r = cv2.split(self.jzt_img) imgret = cv2.merge([r,g,b]) if hasattr(self, "jztopenimg"): self.jztopenimg.remove() del self.jztopenimg self.jztopenimg = self.window.jzt_figaxes.imshow(imgret) self.window.jzt_figaxes.autoscale_view() self.window.jzt_figure.canvas.draw() def jzt_up_fun(self): self.jzt_img = cv2.pyrUp(self.jzt_img) b, g, r = cv2.split(self.jzt_img) imgret = cv2.merge([r,g,b]) if hasattr(self, "jztopenimg"): self.jztopenimg.remove() del self.jztopenimg self.jztopenimg = self.window.jzt_figaxes.imshow(imgret) self.window.jzt_figaxes.autoscale_view() self.window.jzt_figure.canvas.draw() def jzt_lapulasi_fun(self): print("sorry not this fun") # G = self.jzt_img.copy() # gpA = [G] # for i in range(6): # G = cv2.pyrDown(G) # gpA.append(G) # lpA = [gpA[5]] # for i in range(5, 0, -1): # GE = cv2.pyrUp(gpA[i]) # L = cv2.subtract(gpA[i-1], GE) # lpA.append(L) # # G1 = cv2.pyrDown(self.jzt_img) # # G2 = cv2.pyrDown(G1) # # G2 = cv2.pyrUp(G2) # # L1 = cv2.subtract(G2, G1) # if hasattr(self, "jztopenimg"): # self.jztopenimg.remove() # del self.jztopenimg # self.jztopenimg = self.window.jzt_figaxes.imshow(lpA[0]) # self.window.jzt_figaxes.autoscale_view() # self.window.jzt_figure.canvas.draw() def lk_open_fun(self): fileName = self.open_image_file() if fileName: self.ik_img = cv2.imread(fileName) imgray = cv2.cvtColor(self.ik_img, cv2.COLOR_BGR2GRAY) ret, thresh = cv2.threshold(imgray, 127, 255,0) tmp_mode = self.window.lk_mode_comboBox.currentText() if tmp_mode == "LIST": cv2_mode = cv2.RETR_LIST elif tmp_mode == "EXTERNAL": cv2_mode = cv2.RETR_EXTERNAL elif tmp_mode == "CCOMP": cv2_mode = cv2.RETR_CCOMP else: cv2_mode = cv2.RETR_TREE tmp_fangf = self.window.lk_fangf_comboBox.currentText() if tmp_fangf == "SIMPLE": cv2_fangf = cv2.CHAIN_APPROX_SIMPLE else: cv2_fangf = cv2.CHAIN_APPROX_NONE image, contours,hierarchy = cv2.findContours(thresh, cv2_mode, cv2_fangf) self.ik_img = cv2.drawContours(self.ik_img, contours, -1, (255,0,0), 2) b, g, r = cv2.split(self.ik_img) imgret = cv2.merge([r,g,b]) if hasattr(self, "jztopenimg"): self.jztopenimg.remove() del self.jztopenimg self.jztopenimg = self.window.lk_figaxes.imshow(imgret) self.window.lk_figaxes.autoscale_view() self.window.lk_figure.canvas.draw() list_item = [] self.mycontours = contours for i in range(len(contours)): list_item.append(str(i)) self.window.lk_list_comboBox.addItems(list_item) def lk_getinfo_fun(self): if hasattr(self, "mycontours"): cnt_num = int(self.window.lk_list_comboBox.currentText()) cnts = self.mycontours[cnt_num] M = cv2.moments(cnts) # print(M) self.window.lk_ju_lineEdit.setText(str(M)) Cx = int(M['m10'] / M['m00']) Cy = int(M['m01'] / M['m00']) # print(Cx,Cy) self.window.lk_zhongxin_lineEdit.setText("Cx:%d,Cy:%d" % (Cx, Cy)) area = cv2.contourArea(cnts) # print(area) self.window.lk_area_lineEdit.setText(str(area)) perimeter = cv2.arcLength(cnts, True) # print(perimeter) self.window.lk_long_lineEdit.setText(str(perimeter)) hull = cv2.convexHull(cnts) self.window.lk_tubao_textEdit.setText(str(hull)) K = cv2.isContourConvex(cnts) self.window.lk_tuxing_radioButton.setChecked(K) print(K) # print(hull) # def lk_Ok_fun(self): if hasattr(self, "mycontours"): cnt_num = int(self.window.lk_list_comboBox.currentText()) cnts = self.mycontours[cnt_num] tmp_tux = self.window.lk_bianjie_comboBox.currentText() if tmp_tux == "直边界矩形": x,y,w,h = cv2.boundingRect(cnts) self.ik_img = cv2.rectangle(self.ik_img, (x,y), (x+w,y+h), (0,0,255), 2) elif tmp_tux == "最小边界矩形": rect = cv2.minAreaRect(cnts) box = cv2.boxPoints(rect) box = np.int0(box) self.ik_img = cv2.drawContours(self.ik_img, [box], 0, (0,127,255), 2) elif tmp_tux == "外接圆": (x, y), radius = cv2.minEnclosingCircle(cnts) cennt = (int(x), int(y)) radius = int(radius) self.ik_img = cv2.circle(self.ik_img, cennt, radius, (9,211,55), 2) elif tmp_tux == "椭圆拟合": ellipse = cv2.fitEllipse(cnts) self.ik_img = cv2.ellipse(self.ik_img, ellipse, (0,157,157), 2) else: pass b, g, r = cv2.split(self.ik_img) imgret = cv2.merge([r,g,b]) if hasattr(self, "jztopenimg"): self.jztopenimg.remove() del self.jztopenimg self.jztopenimg = self.window.lk_figaxes.imshow(imgret) self.window.lk_figaxes.autoscale_view() self.window.lk_figure.canvas.draw() def open_image_file(self): '''打开一个图像文件''' fileName, filetype= QtWidgets.QFileDialog.getOpenFileName(self.window.centralwidget, "open file", '.', "jpg Files (*.jpg);;png Files (*.png);;All Files (*)") return fileName
如有疑问请联系,1171119770@qq.com
详细的文档说明: http://download.csdn.net/download/eric_lmy/10135602
打包好的exe文件: http://pan.baidu.com/s/1i4QG11N
阅读全文
1 0
- OpenCV中的轮廓(2)
- opencv-OpenCV中的图像处理 [2]-OpenCV中的轮廓
- OpenCV中的轮廓
- opencv(十一)--OpenCV 中的轮廓
- Opencv(Python) 教程-轮廓(2)轮廓特征求取
- opencv--轮廓特征2
- OpenCV基础08(轮廓+轮廓特性)
- opencv寻找轮廓2--drawContours
- OpenCV轮廓查找(一)
- OpenCV轮廓特性(二)
- OpenCV与EmguCV中的图像轮廓提取
- openCV轮廓
- OPENCV轮廓
- OpenCV 轮廓
- opencv:轮廓
- OpenCV-轮廓
- Opencv(Python) 教程-轮廓(3)轮廓的性质
- OpenCv轮廓高级应用(轮廓匹配,几何直方图)
- TCP三次握手和四次挥手
- linux下的PCB-task_struct
- (转)android使用高德地图SDK获取定位信息
- 解决Win10运行记录不显示
- 1002. A+B for Polynomials
- OpenCV中的轮廓(2)
- java使用ajax导出Excel
- cpp遍历数组的几种方式
- 集合框架
- radioGroup+fragment
- Linux 互斥锁
- Int里-128到127的学问
- mybatis cache 设置
- 垃圾回收之finalize()