帮我写一段代码基于python opencv的对图像集合做canny边缘检测需要一个ui界面用pyqt5实现希望ui界面好看一点实现功能多一点
以下是基于Python OpenCV的代码,实现了对图像集合进行Canny边缘检测,并使用PyQt5创建了一个UI界面。该界面包括文件选择、Canny参数调整、图像显示和保存等功能,旨在使用户能够更方便地进行边缘检测操作。
import cv2
import numpy as np
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QPixmap
from PyQt5.QtWidgets import QApplication, QMainWindow, QFileDialog, QLabel, QSlider, QVBoxLayout, QHBoxLayout, \
QPushButton, QWidget
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle('Canny边缘检测')
self.setGeometry(100, 100, 800, 600)
self.image_label = QLabel()
self.image_label.setAlignment(Qt.AlignCenter)
self.slider_low = QSlider(Qt.Horizontal)
self.slider_low.setMinimum(0)
self.slider_low.setMaximum(255)
self.slider_low.setValue(50)
self.slider_high = QSlider(Qt.Horizontal)
self.slider_high.setMinimum(0)
self.slider_high.setMaximum(255)
self.slider_high.setValue(150)
self.slider_low.valueChanged.connect(self.update_image)
self.slider_high.valueChanged.connect(self.update_image)
self.button_select = QPushButton('选择图片')
self.button_select.clicked.connect(self.select_images)
self.button_save = QPushButton('保存结果')
self.button_save.clicked.connect(self.save_result)
slider_layout = QVBoxLayout()
slider_layout.addWidget(QLabel('阈值下限'))
slider_layout.addWidget(self.slider_low)
slider_layout.addWidget(QLabel('阈值上限'))
slider_layout.addWidget(self.slider_high)
button_layout = QHBoxLayout()
button_layout.addWidget(self.button_select)
button_layout.addWidget(self.button_save)
main_layout = QVBoxLayout()
main_layout.addWidget(self.image_label)
main_layout.addLayout(slider_layout)
main_layout.addLayout(button_layout)
main_widget = QWidget()
main_widget.setLayout(main_layout)
self.setCentralWidget(main_widget)
self.images = []
self.result = None
self.current_index = 0
def select_images(self):
file_dialog = QFileDialog(self)
file_dialog.setFileMode(QFileDialog.ExistingFiles)
file_dialog.setNameFilter('Images (*.png *.jpg *.bmp)')
if file_dialog.exec_():
file_names = file_dialog.selectedFiles()
self.images = [cv2.imread(file_name) for file_name in file_names]
self.current_index = 0
self.update_image()
def save_result(self):
if self.result is not None:
file_dialog = QFileDialog(self)
file_dialog.setAcceptMode(QFileDialog.AcceptSave)
file_dialog.setDefaultSuffix('png')
file_dialog.setNameFilter('Images (*.png *.jpg *.bmp)')
if file_dialog.exec_():
file_name = file_dialog.selectedFiles()[0]
cv2.imwrite(file_name, self.result)
def update_image(self):
if self.images and 0 <= self.current_index < len(self.images):
image = self.images[self.current_index]
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, self.slider_low.value(), self.slider_high.value())
self.result = cv2.cvtColor(edges, cv2.COLOR_GRAY2BGR)
self.show_image(self.result)
def show_image(self, image):
height, width, channels = image.shape
bytes_per_line = width * channels
q_image = QImage(image.data, width, height, bytes_per_line, QImage.Format_RGB888)
pixmap = QPixmap.fromImage(q_image).scaled(self.image_label.width(), self.image_label.height(),
Qt.KeepAspectRatio)
self.image_label.setPixmap(pixmap)
def keyPressEvent(self, event):
if event.key() == Qt.Key_Left and self.current_index > 0:
self.current_index -= 1
self.update_image()
elif event.key() == Qt.Key_Right and self.current_index < len(self.images) - 1:
self.current_index += 1
self.update_image()
if __name__ == '__main__':
app = QApplication([])
window = MainWindow()
window.show()
app.exec_()
``
原文地址: https://www.cveoy.top/t/topic/ckwx 著作权归作者所有。请勿转载和采集!