halcon的源码分析
主要是halocn的边缘检测,检测车道标记。
流程如下:
1:创建一个由行列线条组成的区域,然后将区域裁剪成我们要检测的区域,设置线宽为3,颜色为绿色。
2:加载图片,将区域和图片相交,得到线条上有灰度变化的行列线条M1。
3:边缘检测M1,然后提取灰度在20-255的小线条。
4:将小线条用30*30的矩形扩充,膨胀,得到大的区域M2。
5:在原图上提取和M2重合的区域M3。
6:然后在M3上提取灰度在190-255的区域M4。将M4区域的空洞填满。M4就是检测到的车道(白线)。
7:然后显示原图和M4区域。
8:在每一帧图片里处理,就成视频了。
* 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'))
*将图片和线宽为3的小的行列线条相交,得到Mask 也是行列线条
reduce_domain (ActualImage, StreetGrid, Mask)
*边缘检测 Mask,得到Gradient
sobel_amp (Mask, Gradient, 'sum_abs', 3)
*提取Gradient中灰度在20-255的线条,得到Points
threshold (Gradient, Points, 20, 255)
*将区域Points扩充,按照矩形(30*30)扩充得到区域 RegionDilation
dilation_rectangle1 (Points, RegionDilation, MinSize, MinSize)
*将原来加载的图片按照扩充后的区域RegionDilation扣出来相重合的区域,得到StripGray
reduce_domain (ActualImage, RegionDilation, StripGray)
*在扣出来的区域StripGray中得到灰度在199-255之间的区域 Strip
threshold (StripGray, Strip, 190, 255)
*将区域Strip中的空洞填满,得到更好的区域,这就是检测出来的马路上的白线。
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)