pyqt点击按钮调用.py文件

pyqt点击按钮如何调用.py文件中的程序


import cv2

import numpy as np


####################转灰度图和高斯滤波#######################################
def warp_corner(H, src):
    '''
    :param H: 单应矩阵
    :param src: 透视变化的图像
    :return: 透视变化后的四个角,左上角开始,逆时钟
    '''

    warp_points = []
    # 图像左上角,左下角
    src_img1_up = np.array([0, 0, 1])
    src_img1_down = np.array([0, src.shape[0], 1])

    # 图像右上角,右下角
    src_img2_up = np.array([src.shape[1], 0, 1])
    src_img2_down = np.array([src.shape[1], src.shape[0], 1])

    # 透视变化后的左上角,左下角
    warp_img1_up = H.dot(src_img1_up)
    img1_up = warp_img1_up[0:2] / warp_img1_up[2]
    warp_points.append(img1_up)
    warp_img1_down = H.dot(src_img1_down)
    img1_down = warp_img1_down[0:2] / warp_img1_down[2]
    warp_points.append(img1_down)

    # 透视变化后的右上角,右下角
    warp_img2_up = H.dot(src_img2_up)
    img2_up = warp_img2_up[0:2] / warp_img2_up[2]
    warp_points.append(img2_up)
    warp_img2_down = H.dot(src_img2_down)
    img2_down = warp_img2_down[0:2] / warp_img2_down[2]
    warp_points.append(img2_down)
    return warp_points


def optim_mask(mask, warp_point):
    min_img1_x = min(warp_point[0][0], warp_point[1][0])
    img1_margin = mask.shape[1] - min_img1_x
    points_zeros = np.where(mask == 0)
    x_indexs = points_zeros[1]
    alpha = (img1_margin - (x_indexs - min_img1_x)) / img1_margin
    mask[points_zeros] = alpha
    return mask


def Seam_Img1_Img2(img1, imagewarp, H, warp_point, with_optim_mask=False):
    global tt
    '''
    :param img1: 拼接的图像1
    :param imagewarp: 透视变化后的图像
    :param H: 单应矩阵
    :param warp_point: 透视变化后的四个顶点
    :param with_optim_mask: 是否需要对拼接后的图像进行优化
    :return:
    '''
    w = img1.shape[1]
    mask = imagewarp[:, 0:w]
    mask = cv2.cvtColor(mask, cv2.COLOR_BGR2GRAY)
    mask[mask != 0] = 1
    mask[mask == 0] = 0
    mask = 1 - mask
    mask = np.float32(mask)

    if with_optim_mask == True:
        mask = optim_mask(mask, warp_point)
    mask_rgb = np.stack([mask, mask, mask], axis=2)
    tt = np.uint8((1 - mask_rgb) * 255)
    img1 = img1 * mask_rgb + imagewarp[:, 0:w] * (1 - mask_rgb)
    imagewarp[:, 0:w] = img1
    return np.uint8(imagewarp)


#################使用FSAT画出特征点###########################################################
def surf_fun():
    fast = cv2.FastFeatureDetector_create()

    # 寻找和画出关键点
    kp1 = fast.detect(img1_gs, None)
    kp2 = fast.detect(img2_gs, None)
    img1_fast = cv2.drawKeypoints(img1_gs, kp1, None, color=(255, 0, 0))
    img2_fast = cv2.drawKeypoints(img2_gs, kp2, None, color=(255, 0, 0))
    # 提取图像的surf特征点
    surf = cv2.xfeatures2d_SURF.create()
    img1_kps, img1_dess = surf.detectAndCompute(img1_fast, None)  # 计算关键点和描述符
    img2_kps, img2_dess = surf.detectAndCompute(img2_fast, None)
 # 利用flann对图像的特征点进行匹配
    FLANN_INDEX_KDTREE = 0
    index_params = dict(algorithm=FLANN_INDEX_KDTREE, trees=5)
    search_params = dict(checks=100)
    flann = cv2.FlannBasedMatcher(index_params, search_params)

    matches = flann.knnMatch(img1_dess, img2_dess, k=2)
    good_keypoints = []
    # 挑出好的匹配点
    for m, n in matches:
        if m.distance < 0.5 * n.distance:
            good_keypoints.append(m)
    img1_points = np.zeros(shape=(len(good_keypoints), 2), dtype=np.float32)
    img2_points = np.zeros(shape=(len(good_keypoints), 2), dtype=np.float32)
    outimg = np.zeros(shape=(img2.shape[0], img2.shape[0] + img1.shape[0], 3), dtype=np.uint8)
    cv2.drawMatches(img1, img1_kps, img2, img2_kps, good_keypoints, outimg)
    # cv2.imshow('hks',outimg)
    # cv2.waitKey(0)
    for i in range(len(good_keypoints)):
        img1_points[i][0] = img1_kps[good_keypoints[i].queryIdx].pt[0]
        img1_points[i][1] = img1_kps[good_keypoints[i].queryIdx].pt[1]
        img2_points[i][0] = img2_kps[good_keypoints[i].trainIdx].pt[0]
        img2_points[i][1] = img2_kps[good_keypoints[i].trainIdx].pt[1]
    matchesMask = None

    draw_params = dict(singlePointColor=None,
                       matchesMask=matchesMask,
                       flags=2)
    img_ransac = cv2.drawMatches(img1, img1_kps, img2, img2_kps, good_keypoints, None, **draw_params)
    return img_ransac


def match_fun(img1_points,img2_points):
    # 求取单应矩阵
    H, mask = cv2.findHomography(img2_points, img1_points, cv2.RANSAC, 4.0)
    print(mask.shape)
    # 求出右图像的透视变化顶点
    warp_point = warp_corner(H, img2)
    # 求出右图像的透视变化图像
    imagewarp = cv2.warpPerspective(img2, H, (img1.shape[1] + img2.shape[1], img1.shape[0]))
  # 对左右图像进行拼接,返回最后的拼接图像
    image_seam_optim = Seam_Img1_Img2(img1, imagewarp, H, warp_point, with_optim_mask=True)
    return image_seam_optim


if __name__ == '__main__':
    # 读取两张图片
    img1 = cv2.imread("E:\\Desktop\\graduation\\graduation\\photo\\1.png")
    img1_gray = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
    img2 = cv2.imread("E:\\Desktop\\graduation\\graduation\\photo\\2.png")
    img2_gray = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
    img1_gs = cv2.GaussianBlur(img1_gray, (3, 3), 0)
    img2_gs = cv2.GaussianBlur(img2_gray, (3, 3), 0)



# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'imge.ui'
#
# Created by: PyQt5 UI code generator 5.15.4
#
# 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(800, 600)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.select1 = QtWidgets.QPushButton(self.centralwidget)
        self.select1.setGeometry(QtCore.QRect(30, 40, 93, 28))
        self.select1.setObjectName("select1")
        self.select2 = QtWidgets.QPushButton(self.centralwidget)
        self.select2.setGeometry(QtCore.QRect(30, 130, 93, 28))
        self.select2.setObjectName("select2")
        self.surf = QtWidgets.QPushButton(self.centralwidget)
        self.surf.setGeometry(QtCore.QRect(30, 230, 93, 28))
        self.surf.setObjectName("surf")
        self.match = QtWidgets.QPushButton(self.centralwidget)
        self.match.setGeometry(QtCore.QRect(30, 330, 93, 28))
        self.match.setObjectName("match")
        self.save = QtWidgets.QPushButton(self.centralwidget)
        self.save.setGeometry(QtCore.QRect(30, 430, 93, 28))
        self.save.setObjectName("save")
        self.label_img1 = QtWidgets.QLabel(self.centralwidget)
        self.label_img1.setGeometry(QtCore.QRect(180, 40, 220, 220))
        self.label_img1.setObjectName("label_img1")
        self.label_img2 = QtWidgets.QLabel(self.centralwidget)
        self.label_img2.setGeometry(QtCore.QRect(480, 40, 220, 220))
        self.label_img2.setObjectName("label_img2")
        self.label_surf = QtWidgets.QLabel(self.centralwidget)
        self.label_surf.setGeometry(QtCore.QRect(170, 240, 220, 220))
        self.label_surf.setObjectName("label_surf")
        self.label_match = QtWidgets.QLabel(self.centralwidget)
        self.label_match.setGeometry(QtCore.QRect(480, 230, 220, 220))
        self.label_match.setObjectName("label_match")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 26))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        self.select1.clicked.connect(self.select1_clicked)
        self.select2.clicked.connect(self.select2_clicked)
        self.surf.clicked.connect(self.surf_clicked)
        self.match.clicked.connect(self.match_clicked)
        self.save.clicked.connect(self.save_clicked)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.select1.setText(_translate("MainWindow", "选择图片1"))
        self.select2.setText(_translate("MainWindow", "选择图片2"))
        self.surf.setText(_translate("MainWindow", "图像匹配"))
        self.match.setText(_translate("MainWindow", "图像拼接"))
        self.save.setText(_translate("MainWindow", "保存图片"))
        self.label_img1.setText(_translate("MainWindow", "图片1"))
        self.label_img2.setText(_translate("MainWindow", "图片1"))
        self.label_surf.setText(_translate("MainWindow", "匹配"))
        self.label_match.setText(_translate("MainWindow", "拼接"))

python

from PyQt5 import QtWidgets, QtCore, QtGui
import cv2
import numpy as np
from PyQt5.QtGui import *
from PyQt5.QtWidgets import QFileDialog, QMainWindow
import photo
from Mainwindow import Ui_MainWindow
from PyQt5 import QtWidgets
import os,sys


class MainWindow(QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.cwd = os.getcwd()
        self.setupUi(self)

        self.select1.clicked.connect(self.select1_clicked)
        self.select2.clicked.connect(self.select2_clicked)
        self.surf.clicked.connect(self.surf_clicked)
        self.match.clicked.connect(self.match_clicked)
        self.save.clicked.connect(self.save_clicked)

    def select1_clicked(self):
        fname = QFileDialog.getOpenFileName(self, '打开图片', './', "Images (*.png *.jpg *.bmp)")
        if fname[0]:
            self.label_img1.setPixmap(QPixmap(fname[0]))
            self.label_img1.setWordWrap(True)
            self.label_img1.setScaledContents(True)

    def select2_clicked(self):
        fname = QFileDialog.getOpenFileName(self, '打开图片', './', "Images (*.png *.jpg *.bmp)")
        if fname[0]:
            self.label_img2.setPixmap(QPixmap(fname[0]))
            self.label_img2.setWordWrap(True)
            self.label_img2.setScaledContents(True)

    def surf_clicked(self):
        qimg = self.labelsurf.pixmap()
        src = qimage2mat(qimg)
        newsrc = photo.surf_fun(src)
        pix = matqimage(newsrc)
        self.labelsurf.setPixmap(pix)
        self.labelsurf.setWordWrap(True)
        self.labelsurf.setScaledContents(True)

    def match_clicked(self):
        qimg = self.labelkey.pixmap()
        src = qimage2mat(qimg)
        newsrc = photo.match_fun(src)
        pix = matqimage(newsrc)
        self.labelmatch.setPixmap(pix)
        self.labelmatch.setWordWrap(True)
        self.labelmatch.setScaledContents(True)

    def save_clicked(self):
        # 提取Qlabel中的图片
        img = self.label_4.pixmap().toImage()
        fpath, ftype = QFileDialog.getSaveFileName(self.centralwidget, "保存图片", "d:\\", "*.jpg;;*.png;;All Files(*)")
        img.save(fpath)


def qimage2mat(qtpixmap):  # qtpixmap转opencv
            qimg = qtpixmap.toImage()
            temp_shape = (qimg.height(), qimg.bytesPerLine() * 8 // qimg.depth())
            temp_shape += (4,)
            ptr = qimg.bits()
            ptr.setsize(qimg.byteCount())
            result = np.array(ptr, dtype=np.uint8).reshape(temp_shape)
            result = result[..., :3]
            return result


def matqimage(cvimg):  # opencv转QImage
            if cvimg.ndim == 2:  # 单通道
                height, width = cvimg.shape
                cvimg = cv2.cvtColor(cvimg, cv2.COLOR_BGR2RGB)
                cvimg = QImage(cvimg.data, width, height, QImage.Format_RGB888)
                pix = QPixmap.fromImage(cvimg)
                return pix
            else:  # 多个通道
                width = cvimg.shape[1]
                height = cvimg.shape[0]
                pixmap = QPixmap(width, height)  # 根据已知的高度和宽度新建一个空的QPixmap,
                qimg = pixmap.toImage()  # 将pximap转换为QImage类型的qimg
                for row in range(0, height):
                    for col in range(0, width):
                        b = cvimg[row, col, 0]
                        g = cvimg[row, col, 1]
                        r = cvimg[row, col, 2]
                        pix = qRgb(r, g, b)
                        qimg.setPixel(col, row, pix)
                        pix = QPixmap.fromImage(qimg)
                return pix


def matqimage_guass(cvimg):  # opencv转QImage   #guass 专用####
            if cvimg.ndim == 2:  # 单通道
                height, width = cvimg.shape
                cvimg = cv2.cvtColor(cvimg, cv2.COLOR_BGR2RGB)
                cvimg = QImage(cvimg.data, width, height, QImage.Format_RGB888)
                pix = QPixmap.fromImage(cvimg)
                return pix
            else:  # 多个通道
                width = cvimg.shape[1]  # 获取图片宽度
                height = cvimg.shape[0]  # 获取图片高度
                pixmap = QPixmap(width, height)  # 根据已知的高度和宽度新建一个空的QPixmap,
                qimg = pixmap.toImage()  # 将pximap转换为QImage类型的qimg
                for row in range(0, height):
                    for col in range(0, width):
                        b = int(cvimg[row, col, 0] * 255)  # 高斯加噪归一化了 要*255
                        g = int(cvimg[row, col, 1] * 255)
                        r = int(cvimg[row, col, 2] * 255)
                        pix = qRgb(r, g, b)
                        qimg.setPixel(col, row, pix)
                        pix = QPixmap.fromImage(qimg)
                return pix  # 转换完成,返回


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    ui = MainWindow()
    ui.show()
    sys.exit(app.exec_())


不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^