在自动驾驶中,让汽车保持在车道线内是非常重要的,因此本文介绍如何搭建一个基于 OpenCV 和 Python 的车道线检测系统,并附带 UI 界面。
主要使用 OpenCV、NumPy、Matplotlib 等库。实现过程主要包括以下步骤:图像加载、图像预处理(灰度化、高斯滤波)、Canny 边缘检测、感兴趣区域检测、霍夫直线检测、直线拟合、车道线叠加、图片和视频测试、可视化界面(PyQt5)。
1. 图像加载
首先加载图像。在 Python 中使用 OpenCV 加载图像非常方便:
import cv2
image = cv2.imread('test_image.jpg')
通过 cv2.imread 函数读取名为 test_image.jpg 的图像并存储在 image 变量中。需注意路径和格式是否正确。
2. 图像预处理:图片灰度化,高斯滤波
加载的图像通常是彩色的,为了后续处理方便,需将其灰度化。同时使用高斯滤波平滑噪声。
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (5, 5), 0)
cv2.cvtColor 将彩色图像从 BGR 格式转为灰度图。cv2.GaussianBlur 对灰度图进行高斯滤波,(5, 5) 为核大小,0 表示自动计算标准差。
3. Canny 边缘检测
经过预处理后,使用 Canny 算法查找图像边缘。
edges = cv2.Canny(blurred, 50, 150)
cv2.Canny 接收三个参数:输入图像、低阈值(50)和高阈值(150)。低于低阈值的边缘被丢弃,高于高阈值的保留,介于两者之间的仅在与高阈值边缘相连时保留。
4. 感兴趣区域检测
图像中可能存在许多边缘,但只关心车道线所在区域,可通过定义多边形区域来提取。
import numpy as np
height, width = edges.shape
roi_vertices = np.array([[(0, height), (width / 2, height / 2), (width, height)]], dtype=np.int32)
def region_of_interest(image, vertices):
mask = np.zeros_like(image)
match_mask_color = 255
cv2.fillPoly(mask, vertices, match_mask_color)
masked_image = cv2.bitwise_and(image, mask)
return masked_image
cropped_edges = region_of_interest(edges, roi_vertices)
创建掩码并将多边形区域填充为白色,最后通过位与操作保留指定区域内的部分。
5. 霍夫直线检测
在感兴趣区域的边缘上使用霍夫变换查找直线。



