基于Opencv和Python的车道线检测系统(带UI界面)
在自动驾驶中,让汽车保持在车道线内是非常重要的,所以这次我们来说说车道线的检测。我们主要用到的是openCV, numpy, matplotlib几个库。主要包括下面这么几个步骤:
1. 图像加载;
2. 图像预处理:图片灰度化,高斯滤波;
3. Cany边缘检测;
4. 感兴趣区域检测;
5. 霍夫直线检测 ;
6. .直线拟合;
7. 车道线叠加;
8. 图片和视频测试;
9. 可视化界面pyqt5
项目背景
车道线检测对于自动驾驶车辆至关重要,因为它能够帮助车辆识别当前行驶的车道,并据此做出转向或其他驾驶决策。传统的手动驾驶中,驾驶员通过视觉来判断车道线的位置,而在自动驾驶系统中,这一功能则由计算机视觉技术实现。
项目目标
本项目旨在开发一个基于OpenCV和Python的车道线检测系统,并通过PyQt5实现一个用户界面,使得非专业人员也能直观地看到车道线检测的结果,并且能够轻松地测试和调试系统。
关键技术
- OpenCV:用于图像处理的核心库。
- NumPy:用于数值计算。
- Matplotlib:用于绘制图像和结果。
- PyQt5:用于构建图形用户界面。
实现步骤
- 图像加载:从文件或视频流中读取图像。
- 图像预处理:将彩色图像转化为灰度图,并应用高斯滤波减少噪声。
- Canny边缘检测:使用Canny算法检测图像中的边缘。
- 感兴趣区域检测:通过对图像的特定区域进行掩膜处理,只保留感兴趣的区域。
- 霍夫直线检测:在边缘图像中找到直线,并提取车道线。
- 直线拟合:对检测到的直线进行拟合,得到车道线的具体参数。
- 车道线叠加:将检测到的车道线绘制到原图上。
- 图片和视频测试:测试系统在静态图片和动态视频上的表现。
- 可视化界面:使用PyQt5构建用户界面,让用户能够交互式地操作和查看结果。
关键代码示例
下面是一个简化的车道线检测系统的Python代码示例:
1import cv2
2import numpy as np
3import matplotlib.pyplot as plt
4
5def load_image(image_path):
6 return cv2.imread(image_path)
7
8def grayscale(image):
9 return cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
10
11def gaussian_blur(image, kernel_size=5):
12 return cv2.GaussianBlur(image, (kernel_size, kernel_size), 0)
13
14def canny(image, low_threshold=50, high_threshold=150):
15 return cv2.Canny(image, low_threshold, high_threshold)
16
17def region_of_interest(image, vertices):
18 mask = np.zeros_like(image)
19 match_mask_color = 255
20 cv2.fillPoly(mask, vertices, match_mask_color)
21 masked_image = cv2.bitwise_and(image, mask)
22 return masked_image
23
24def draw_lines(image, lines, color=[255, 0, 0], thickness=2):
25 for line in lines:
26 for x1, y1, x2, y2 in line:
27 cv2.line(image, (x1, y1), (x2, y2), color, thickness)
28
29def hough_lines(image, rho, theta, threshold, min_line_len, max_line_gap):
30 lines = cv2.HoughLinesP(image, rho, theta, threshold, np.array([]), minLineLength=min_line_len, maxLineGap=max_line_gap)
31 return lines
32
33def process_image(image):
34 gray = grayscale(image)
35 blur_gray = gaussian_blur(gray)
36 edges = canny(blur_gray)
37 imshape = image.shape
38 vertices = np.array([[(0,imshape[0]),(450, 350), (500, 350), (imshape[1],imshape[0])]], dtype=np.int32)
39 masked_edges = region_of_interest(edges, vertices)
40 lines = hough_lines(masked_edges, 1, np.pi/180, 20, 10, 10)
41 line_image = np.copy(image)*0
42 draw_lines(line_image, lines)
43 result = cv2.addWeighted(image, 0.8, line_image, 1, 0)
44 return result
45
46# 加载图像
47image = load_image('lane_image.jpg')
48result = process_image(image)
49
50# 显示结果
51plt.imshow(cv2.cvtColor(result, cv2.COLOR_BGR2RGB))
52plt.show()
PyQt5 GUI 界面设计
使用PyQt5构建GUI界面可以让用户更方便地与系统交互。下面是一个简单的GUI示例,用于加载图像、处理图像并显示结果:
python
深色版本
1import sys
2from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QLabel, QVBoxLayout, QWidget, QFileDialog
3from PyQt5.QtGui import QPixmap
4
5class LaneDetectionApp(QMainWindow):
6 def __init__(self):
7 super().__init__()
8 self.initUI()
9
10 def initUI(self):
11 self.setWindowTitle('Lane Detection System')
12 self.setGeometry(100, 100, 800, 600)
13
14 central_widget = QWidget(self)
15 self.setCentralWidget(central_widget)
16
17 layout = QVBoxLayout()
18 central_widget.setLayout(layout)
19
20 self.image_label = QLabel(self)
21 layout.addWidget(self.image_label)
22
23 button = QPushButton('Load Image', self)
24 button.clicked.connect(self.loadImage)
25 layout.addWidget(button)
26
27 def loadImage(self):
28 options = QFileDialog.Options()
29 file_name, _ = QFileDialog.getOpenFileName(self, "QFileDialog.getOpenFileName()", "", "Images (*.png *.jpg)", options=options)
30 if file_name:
31 pixmap = QPixmap(file_name)
32 self.image_label.setPixmap(pixmap)
33 # 在这里调用process_image函数处理图像,并更新显示
34 processed_image = process_image(cv2.imread(file_name))
35 processed_pixmap = QPixmap.fromImage(cv2.cvtColor(processed_image, cv2.COLOR_BGR2RGB))
36 self.image_label.setPixmap(processed_pixmap)
37
38if __name__ == '__main__':
39 app = QApplication(sys.argv)
40 ex = LaneDetectionApp()
41 ex.show()
42 sys.exit(app.exec_())
结论
通过上述步骤,你可以构建一个基本的车道线检测系统,并通过PyQt5提供一个友好的用户界面。这样的系统不仅有助于自动驾驶技术的研发,还可以作为教学工具,帮助学生理解计算机视觉的基本概念和技术。通过不断优化算法和界面设计,可以进一步提高系统的准确性和用户体验。