Python OpenCV Canny 边缘检测 UI 工具:PyQt5 实现图片和视频边缘检测
这是一个基于 Python OpenCV 和 PyQt5 的图像集合 Canny 边缘检测代码,包含了一个 UI 界面,可以实现图片和视频的 Canny 边缘检测,并提供阈值上下限的控制。
import sys
import cv2
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QImage, QPixmap
from PyQt5.QtWidgets import QApplication, QLabel, QMainWindow, QSlider, QVBoxLayout, QWidget
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
# 创建UI界面
self.central_widget = QWidget()
self.setCentralWidget(self.central_widget)
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_low.setTickPosition(QSlider.TicksBelow)
self.slider_low.setTickInterval(10)
self.slider_high = QSlider(Qt.Horizontal)
self.slider_high.setMinimum(0)
self.slider_high.setMaximum(255)
self.slider_high.setValue(150)
self.slider_high.setTickPosition(QSlider.TicksBelow)
self.slider_high.setTickInterval(10)
vbox = QVBoxLayout(self.central_widget)
vbox.addWidget(self.image_label)
vbox.addWidget(self.slider_low)
vbox.addWidget(self.slider_high)
# 绑定事件
self.slider_low.valueChanged.connect(self.update_image)
self.slider_high.valueChanged.connect(self.update_image)
# 加载图像集合
self.images = []
self.images.append(cv2.imread('image1.jpg'))
self.images.append(cv2.imread('image2.jpg'))
self.images.append(cv2.imread('image3.jpg'))
self.current_index = 0
self.update_image()
def update_image(self):
# 获取当前阈值
low_threshold = self.slider_low.value()
high_threshold = self.slider_high.value()
# 对当前图像进行Canny边缘检测
image = self.images[self.current_index]
edges = cv2.Canny(image, low_threshold, high_threshold)
# 将检测结果转换为QImage格式并显示
height, width, channel = edges.shape
bytes_per_line = channel * width
q_image = QImage(edges.data, width, height, bytes_per_line, QImage.Format_Grayscale8)
pixmap = QPixmap.fromImage(q_image)
self.image_label.setPixmap(pixmap)
def keyPressEvent(self, event):
# 处理左右方向键切换图像
if event.key() == Qt.Key_Left:
self.current_index = max(0, self.current_index - 1)
self.update_image()
elif event.key() == Qt.Key_Right:
self.current_index = min(len(self.images) - 1, self.current_index + 1)
self.update_image()
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())
在这个代码中,我们首先创建了一个QMainWindow类,作为 UI 界面的主要容器。然后我们在其中添加了一个QLabel控件来显示图像,以及两个QSlider控件来控制 Canny 算法的阈值。我们将这些控件使用QVBoxLayout布局进行排列,并绑定了valueChanged事件来实时更新图像。
在update_image函数中,我们首先获取当前的阈值,并对当前图像进行 Canny 边缘检测。然后我们将检测结果转换为QImage格式,并通过QPixmap将其渲染到QLabel上。
最后,在keyPressEvent函数中,我们处理了左右方向键来切换图像,以便用户可以在图像集合中进行浏览。
需要注意的是,本代码仅提供了一个简单的 UI 界面和 Canny 算法的实现,如果需要更加复杂的功能和更高的性能,需要进一步优化和改进。
原文地址: https://www.cveoy.top/t/topic/ntAW 著作权归作者所有。请勿转载和采集!