详解车道线检测算法之传统图像处理
透视变换
透视变换是将成像投影到一个新的视平面(鸟瞰图)。车载相机拍摄到的图像中,由于受相机角度和高度的影响往往会将平行的车道线拍成梯形,这样的图像会给后续检测带来较大难度,所以需要我们对原图进行透视变换,从而得到一张鸟瞰图。
具体思路是,先读取两组坐标(例如原图像的四点坐标和目标图像的四点坐标),计算变换矩阵;然后根据变换矩阵对图像进行透视变换,并输出到目标图像。
相机标定
由于一般相机都多少存在畸变,而自动驾驶需要准确的车道曲率以执行正确的方向控制,因此需要对相机进行校正。首先读取两个坐标数组,计算变换矩阵;然后根据变换矩阵对原图进行透视变换,并输出到目标画布。
确定相机内参和畸变参数的过程就叫做相机标定。一般只需要一幅图像(国际象棋棋盘图像较为常用)就可以进行相机标定。标定时只需要从不同角度拍摄棋盘图案,通过检测棋盘图案中的角点,得到角点像素,并且我们已知真实世界中的对象角点坐标 ,便可进行相机校正。若要进行精确的标定,通常从不同角度对同一棋盘拍摄多张照片(10-20张)。
直方图滤波
简单来说,就是沿着X轴统计每列像素的数值,并用直方图表示。其中峰值位置的x坐标则对应左右两侧的车道线。通过这种方式,来获取车道线位置信息。

图片来自Udacity无人驾驶课程

初级车道线检测算法--直线
颜色阈值处理
读取图片,对颜色RGB分别设置阈值,将高于所设阈值的像素(较亮的白色部分)分离出来。# 读取图片image = mpimg.imread('test.jpg')ysize = image.shape[0]xsize = image.shape[1]color_select = np.copy(image)
# 对RGB通道分别设置阈值red_threshold = 200 #Tuninggreen_threshold = 200 #Tuningblue_threshold = 200 #Tuning
# 将所设阈值以下的任何像素都设置为0rgb_threshold = [red_threshold, green_threshold, blue_threshold]thresholds = (image[:,:,0] < rgb_threshold[0]) | (image[:,:,1] < rgb_threshold[1]) | (image[:,:,2] < rgb_threshold[2])
color_select[thresholds] = [0,0,0]
提取ROIPython# 首先定义一个空图像mask = np.zeros_like(image)
# 设置ROI区域坐标(任意多边形)vertices = np.array([[image.shape[1]*.12, image.shape[0]], [image.shape[1]*.25,(image.shape[0]+image.shape[0]*.65)/2], [image.shape[1]*.42, image.shape[0]*.63], [image.shape[1]*.6,image.shape[0]*.63], [image.shape[1]*.8,(image.shape[0]+image.shape[0]*.65)/2], [image.shape[1]*.95,image.shape[0]]]) #Tuning
# 设置颜色通道,并填充ROIif len(image.shape) > 2: channel_count = image.shape[2] # i.e. 3 or 4 depending on your image ignore_mask_color = (255,) * channel_countelse: ignore_mask_color = 255
cv2.fillPoly(mask, vertices, ignore_mask_color)
# 合并得到ROI,其余部分为零masked_image = cv2.bitwise_and(image, mask)

Canny边缘检测
# 将图像转换为灰度图gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
# 进行高斯模糊,去除噪声kernel_size = 3 #Tuningblur_gray = cv2.GaussianBlur(gray,(kernel_size, kernel_size), 0) # 参数kernel_size可以是任何奇数
# 计算梯度(Canny边缘检测)low_threshold = 50 #Tuninghigh_threshold = 150 #Tuningedges = cv2.Canny(gray,low_threshold,higy_threshold) # 参数:灰度图,低阈值,高阈值。输出为边缘图。

霍夫变换
rho = 2 theta = np.pi/180 threshold = 15 min_line_length = 50 max_line_gap = 20
# rho和theta是霍夫空间的距离和夹角# threshold是通过同一交点的曲线个数最小值# min_line_length是直线的最小像素长度# max_line_gap是线与线之间的最大像素长度。输出为多条直线
lines = cv2.HoughLinesP(masked_edges, rho, theta, threshold, np.array([]), min_line_length, max_line_gap)

图片新闻
最新活动更多
-
5月13日立即预约>>> 【线下会议】恩智浦创新技术峰会·深圳
-
精彩回顾立即查看>> 【在线直播】可视化神器!VisionSym 赋能汽车光学原型开发
-
精彩回顾立即查看>> 12月16-17日 AMD 嵌入式峰会
-
精彩回顾立即查看>> 恩智浦创新技术峰会
-
精彩回顾立即查看>> 【工程师系列】汽车电子技术在线大会
-
精彩回顾立即查看>> Works With 开发者大会深圳站
推荐专题
- 1 改写出行格局!充换电基建的五年蝶变
- 2 纯视觉遭调查 特斯拉自动驾驶遇生死考验
- 3 北京在全国首推“智驾险”,各车企智驾水平要“露底”?
- 4 VLA 与世界模型之争:谁才是辅助驾驶的正确方向?
- 5 卖芯片还是卖平台?地平线与黑芝麻智能悄然走出分水岭
- 6 2026 百人会论坛:地平线|推舱驾融合的“智能体芯片”
- 7 「武汉萝卜快跑」事件背后:有时停下是为了更快的奔跑
- 8 为啥有人认为自动驾驶纯视觉方案比激光雷达方案好?
- 9 中国自动驾驶Robotaxi围攻中东【附投票】:曹操出行、文远知行、小马智行、萝卜快跑四路诸侯,谁才是真正的“沙漠之狐”?
- 10 2026百人会论坛:卓驭科技|从智驾到物理AI,沈劭劼说这是生存判断不是战略判断


分享











发表评论
登录
手机
验证码
手机/邮箱/用户名
密码
立即登录即可访问所有OFweek服务
还不是会员?免费注册
忘记密码其他方式
请输入评论内容...
请输入评论/评论长度6~500个字
暂无评论
暂无评论