基于Opencv和Python的车道线检测系统(带UI界面)自动驾驶中-车道线检测——主要用到的是openCV, numpy, matplotlib库

基于Opencv和Python的车道线检测系统(带UI界面)


在自动驾驶中,让汽车保持在车道线内是非常重要的,所以这次我们来说说车道线的检测。我们主要用到的是openCV, numpy, matplotlib几个库。主要包括下面这么几个步骤:
1. 图像加载;
2. 图像预处理:图片灰度化,高斯滤波;
3. Cany边缘检测;
4. 感兴趣区域检测;
5. 霍夫直线检测 ;
6. .直线拟合;
7. 车道线叠加;
8. 图片和视频测试;
9. 可视化界面pyqt5

项目背景

车道线检测对于自动驾驶车辆至关重要,因为它能够帮助车辆识别当前行驶的车道,并据此做出转向或其他驾驶决策。传统的手动驾驶中,驾驶员通过视觉来判断车道线的位置,而在自动驾驶系统中,这一功能则由计算机视觉技术实现。

项目目标

本项目旨在开发一个基于OpenCV和Python的车道线检测系统,并通过PyQt5实现一个用户界面,使得非专业人员也能直观地看到车道线检测的结果,并且能够轻松地测试和调试系统。

关键技术

  1. OpenCV:用于图像处理的核心库。
  2. NumPy:用于数值计算。
  3. Matplotlib:用于绘制图像和结果。
  4. PyQt5:用于构建图形用户界面。

实现步骤

  1. 图像加载:从文件或视频流中读取图像。
  2. 图像预处理:将彩色图像转化为灰度图,并应用高斯滤波减少噪声。
  3. Canny边缘检测:使用Canny算法检测图像中的边缘。
  4. 感兴趣区域检测:通过对图像的特定区域进行掩膜处理,只保留感兴趣的区域。
  5. 霍夫直线检测:在边缘图像中找到直线,并提取车道线。
  6. 直线拟合:对检测到的直线进行拟合,得到车道线的具体参数。
  7. 车道线叠加:将检测到的车道线绘制到原图上。
  8. 图片和视频测试:测试系统在静态图片和动态视频上的表现。
  9. 可视化界面:使用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提供一个友好的用户界面。这样的系统不仅有助于自动驾驶技术的研发,还可以作为教学工具,帮助学生理解计算机视觉的基本概念和技术。通过不断优化算法和界面设计,可以进一步提高系统的准确性和用户体验。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于这个问题,我们可以分为两个部分来讲解:行人轨迹跟踪和交互界面制作。 一、行人轨迹跟踪 实现行人轨迹跟踪的主要步骤如下: 1. 使用 OpenCV 的人体检测算法来提取出行人的位置信息。 2. 对于每个检测出来的行人,使用 OpenCV 的光流算法来计算其在下一帧的位置。 3. 根据光流算法得到的位置信息来更新行人的轨迹。 4. 在每一帧可视化出行人的轨迹。 具体的实现代码可以参考以下示例: ``` import cv2 import numpy as np # 读取视频 cap = cv2.VideoCapture('test.mp4') # 创建光流跟踪器 lk_params = dict(winSize=(15, 15), maxLevel=2, criteria=(cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 0.03)) # 创建随机颜色 color = np.random.randint(0, 255, (100, 3)) # 创建跟踪点 prev_points = None track_points = [] while True: # 读取视频帧 ret, frame = cap.read() if not ret: break # 将帧转换为灰度图像 gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 如果没有跟踪点,则使用人体检测算法来提取出行人的位置信息 if prev_points is None: hog = cv2.HOGDescriptor() hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector()) rects, weights = hog.detectMultiScale(gray, winStride=(8, 8), padding=(32, 32), scale=1.05) prev_points = np.array([[x + w // 2, y + h // 2] for x, y, w, h in rects], dtype=np.float32) # 使用光流算法来计算跟踪点的位置 next_points, status, _ = cv2.calcOpticalFlowPyrLK(gray, frame, prev_points, None, **lk_params) # 选取跟踪点并更新轨迹 track_points = [(p1, p2) for p1, p2, s in zip(prev_points, next_points, status) if s == 1] prev_points = next_points.reshape(-1, 1, 2) # 可视化轨迹 for i, (p1, p2) in enumerate(track_points): cv2.line(frame, tuple(p1), tuple(p2), color[i % 100].tolist(), 2) # 显示视频 cv2.imshow('frame', frame) if cv2.waitKey(1) == ord('q'): break # 释放资源 cap.release() cv2.destroyAllWindows() ``` 二、使用 Qt 制作交互界面 使用 Qt 制作交互界面的主要步骤如下: 1. 使用 Qt Designer 设计界面。 2. 在代码加载界面并进行界面与功能的绑定。 3. 运行程序并测试。 具体的实现代码可以参考以下示例: ``` from PyQt5 import QtWidgets, uic import cv2 import numpy as np class MainWindow(QtWidgets.QMainWindow): def __init__(self): super(MainWindow, self).__init__() # 加载界面 uic.loadUi('mainwindow.ui', self) # 创建光流跟踪器 self.lk_params = dict(winSize=(15, 15), maxLevel=2, criteria=(cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 0.03)) # 创建随机颜色 self.color = np.random.randint(0, 255, (100, 3)) # 创建跟踪点 self.prev_points = None self.track_points = [] # 绑定按钮点击事件 self.pushButton.clicked.connect(self.start_tracking) def start_tracking(self): # 打开视频 cap = cv2.VideoCapture('test.mp4') while True: # 读取视频帧 ret, frame = cap.read() if not ret: break # 将帧转换为灰度图像 gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 如果没有跟踪点,则使用人体检测算法来提取出行人的位置信息 if self.prev_points is None: hog = cv2.HOGDescriptor() hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector()) rects, weights = hog.detectMultiScale(gray, winStride=(8, 8), padding=(32, 32), scale=1.05) self.prev_points = np.array([[x + w // 2, y + h // 2] for x, y, w, h in rects], dtype=np.float32) # 使用光流算法来计算跟踪点的位置 next_points, status, _ = cv2.calcOpticalFlowPyrLK(gray, frame, self.prev_points, None, **self.lk_params) # 选取跟踪点并更新轨迹 self.track_points = [(p1, p2) for p1, p2, s in zip(self.prev_points, next_points, status) if s == 1] self.prev_points = next_points.reshape(-1, 1, 2) # 可视化轨迹 for i, (p1, p2) in enumerate(self.track_points): cv2.line(frame, tuple(p1), tuple(p2), self.color[i % 100].tolist(), 2) # 在界面上显示视频 img = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) h, w, c = img.shape qimg = QtGui.QImage(img.data, w, h, w * c, QtGui.QImage.Format_RGB888) pixmap = QtGui.QPixmap.fromImage(qimg) self.label.setPixmap(pixmap) QtWidgets.QApplication.processEvents() # 释放资源 cap.release() if __name__ == '__main__': app = QtWidgets.QApplication([]) window = MainWindow() window.show() app.exec_() ``` 以上就是如何使用 PythonOpenCV 实现行人轨迹跟踪,并使用 Qt 制作交互界面的方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值