深圳市凯茉锐电子科技有限公司深圳市凯茉锐电子科技有限公司

新闻中心

News

快速车道标记检测算法【附数据集与注释代码】

来源:深圳市凯茉锐电子科技有限公司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. 算法效果图

以下是该车道标记检测算法在处理过程中的效果图示例:

 

原始图像:

640.webp.png

 

检测到的车道标记:

640.webp (1).png

 

通过这些效果图,可以看到算法如何在复杂的道路环境中成功提取车道标记。


相关资讯

专业工程师

24小时在线服务提交需求快速为您定制解决方案

13798538021