快速车道标记检测算法【附数据集与注释代码】
来源:深圳市凯茉锐电子科技有限公司2025-06-23
在自动驾驶和智能交通系统中,车道标记识别是关键的计算机视觉任务之一。本文将介绍一个基于Halcon的车道标记检测算法,该算法通过图像处理技术快速识别车道标记。
1. 系统初始化和窗口设置
在算法的开始,我们首先需要进行一些系统的初始化操作并设置显示窗口。这些步骤为后续的图像处理和结果展示奠定了基础。
dev_update_window ('off')
* 关闭窗口更新
dev_close_window ()
* 关闭窗口
dev_open_window (0, 0, 768, 575, 'black', WindowID)
* 打开一个新的黑色背景窗口,大小为768x575
MinSize := 30
* 最小区域大小设定为30
get_system ('init_new_image', Information)
* 获取系统参数,初始化新图像信息
set_system ('init_new_image', 'false')
* 设置系统参数,禁止初始化新图像
在上述代码中,我们通过dev_open_window打开了一个新的窗口,用于展示后续的图像处理结果。窗口背景为黑色,尺寸为768x575。然后,我们设置了一个最小的区域大小MinSize,并获取了系统的图像初始化参数。
2. 创建网格区域并裁剪图像
为了有效识别车道标记,我们首先需要创建一个网格区域,这样可以在大范围内搜索车道标记。
gen_grid_region (Grid, MinSize, MinSize, 'lines', 512, 512)
* 生成一个512x512的网格区域,用于车道检测
clip_region (Grid, StreetGrid, 130, 10, 450, 502)
* 从生成的网格区域中裁剪出指定区域(130, 10, 450, 502),得到街道网格区域
在这一步中,gen_grid_region函数生成了一个512x512的网格区域,网格间距为MinSize。然后,我们用clip_region函数从网格中裁剪出了一个感兴趣的区域(街道网格区域),为后续处理提供了一个明确的目标区域。
3. 车道标记检测算法核心步骤
接下来,我们进入车道检测的核心部分。通过Sobel算子提取图像的梯度信息,并结合阈值化技术来提取车道标记。
for i := 0 to 28 by 1
* 对于每张图像进行循环,遍历场景0到28
read_image (ActualImage, 'autobahn/scene_' + (i$'02'))
* 读取场景图像(场景编号为i)
reduce_domain (ActualImage, StreetGrid, Mask)
* 使用街道网格区域对图像进行约束,得到图像的感兴趣区域(Mask)
sobel_amp (Mask, Gradient, 'sum_abs', 3)
* 对感兴趣区域应用Sobel算子,计算梯度幅值,使用绝对值和方法,窗口大小为3
threshold (Gradient, Points, 20, 255)
* 对梯度幅值进行阈值化处理,保留值在20到255之间的区域,得到车道边缘点
dilation_rectangle1 (Points, RegionDilation, MinSize, MinSize)
* 对车道边缘点进行矩形膨胀,膨胀的大小为MinSize x MinSize
reduce_domain (ActualImage, RegionDilation, StripGray)
* 使用膨胀后的区域对图像进行约束,得到一个新的图像区域(StripGray)
threshold (StripGray, Strip, 190, 255)
* 对处理后的图像区域应用阈值化操作,保留值在190到255之间的部分
fill_up (Strip, RegionFillUp)
* 对二值图像进行填充操作,填充车道区域
dev_display (ActualImage)
* 显示当前图像
dev_display (RegionFillUp)
* 显示车道填充区域
endfor
这部分代码完成了车道标记检测的主要任务。具体步骤如下:
读取图像并约束区域:通过read_image读取不同的图像数据,然后利用reduce_domain函数将处理范围限制在感兴趣区域StreetGrid内。
梯度计算和阈值化:使用sobel_amp计算图像的梯度幅值,之后通过threshold进行阈值化,提取出车道边缘的像素点。
膨胀操作:通过dilation_rectangle1对提取的车道边缘点进行膨胀,扩大检测区域,确保车道标记的完整性。
再次阈值化和填充:对膨胀后的图像进行再次阈值化,并用fill_up函数填充车道区域,确保标记完整。
4. 显示结果与更新窗口
最后,通过dev_display函数显示处理后的图像和车道区域。
dev_set_line_width (1)
* 将线宽设置回1
dev_update_window ('on')
* 恢复窗口更新
set_system ('init_new_image', Information)
* 恢复图像初始化的系统参数
这些代码段完成了显示和更新图像窗口的操作,确保用户能够实时看到车道检测的结果。
5. 算法效果图
以下是该车道标记检测算法在处理过程中的效果图示例:
原始图像:
检测到的车道标记:
通过这些效果图,可以看到算法如何在复杂的道路环境中成功提取车道标记。
相关资讯
- 2025-06-23
- 2025-06-23
- 2025-06-20
- 2025-06-19
- 2025-06-18
- 2025-06-17