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_())
不知道你这个问题是否已经解决, 如果还没有解决的话:QFileDialog
类可以用来选择文件或者目录,如下图所示