halcon例程解析:快速检测车道线——autobahn. hdev
1. 效果展示
在如下图中快速检测出车道线
原图
结果
2. 思路分析
本例程中为快速检测车道线,使用网格确定感兴趣区域进行分割
2.1 建立网格
gen_grid_region (Grid, MinSize, MinSize, 'lines', 512, 512)
clip_region (Grid, StreetGrid, 130, 10, 450, 502)
- 生成网格,其中512*512为原图大小
- 截取网格区域
2.2 以网格线区域为感兴趣区域提取车道线
2.2.1 以网格线为感兴趣区域在原图中分割,生成Mask
reduce_domain (ActualImage, StreetGrid, Mask)
2.2.2 使用Sobel算子检测边缘(振幅)
sobel_amp (Mask, Gradient, 'sum_abs', 3)
2.2.3 做阈值分割,提取有效区域
threshold (Gradient, Points, 20, 255)
2.2.4 做一次大尺寸膨胀
dilation_rectangle1 (Points, RegionDilation, MinSize, MinSize)
2.2.5 以上得到有效区域,在原图中分割
reduce_domain (ActualImage, RegionDilation, StripGray)
2.2.6 做阈值分割
threshold (StripGray, Strip, 190, 255)
2.2.7 填充空洞
fill_up (Strip, RegionFillUp)
至此得到结果,在原图中标出车道线
3. 原始代码
* autobahn.hdev: Fast detection of lane markers
*
dev_update_window ('off')
dev_close_window ()
dev_open_window (0, 0, 768, 575, 'black', WindowID)
MinSize := 30
get_system ('init_new_image', Information)
set_system ('init_new_image', 'false')
gen_grid_region (Grid, MinSize, MinSize, 'lines', 512, 512)
clip_region (Grid, StreetGrid, 130, 10, 450, 502)
dev_set_line_width (3)
dev_set_color ('green')
read_image (ActualImage, 'autobahn/scene_00')
dev_display (ActualImage)
stop ()
dev_display (StreetGrid)
stop ()
for i := 0 to 28 by 1
read_image (ActualImage, 'autobahn/scene_' + (i$'02'))
reduce_domain (ActualImage, StreetGrid, Mask)
sobel_amp (Mask, Gradient, 'sum_abs', 3)
threshold (Gradient, Points, 20, 255)
dilation_rectangle1 (Points, RegionDilation, MinSize, MinSize)
reduce_domain (ActualImage, RegionDilation, StripGray)
threshold (StripGray, Strip, 190, 255)
fill_up (Strip, RegionFillUp)
dev_display (ActualImage)
dev_display (RegionFillUp)
endfor
dev_set_line_width (1)
dev_update_window ('on')
set_system ('init_new_image', Information)