HALCON示例程序autobahn高速公路车道识别程序剖析
小哥哥小姐姐觉得有用点个赞呗!
示例程序源码(加注释)
*关闭halcon窗口的实时更新
dev_update_window (‘off’)
*关闭halcon图形窗口
dev_close_window ()
*打开图形窗口
*dev_open_window (窗口起始坐标Y, 窗口起始坐标X, 窗口宽度, 窗口高度, 背景颜色, 窗口句柄)
/这个窗口句柄就是窗口的名字,我们在一个程序或者软件中可能会打开好多个窗口(窗口1、窗口2、窗口。。。),现在我们希望在窗口5中显示一张图片,电脑怎么知道我们想显示在哪里呢?就是通过不同窗口的窗口句柄得到的。使用方法很简单,下面有显示的算子使用,用到了会说一下。/
dev_open_window (0, 0, 768, 575, ‘black’, WindowID)
*halcon的赋值语句不是直接‘=’就OK了,要在‘=’前加一个‘:’
MinSize := 30
*获取halcon系统的信息
get_system (‘init_new_image’, Information)
*设置halcon系统的信息
set_system (‘init_new_image’, ‘false’)
*gen_grid_region 创建一个由线条或像素构成的区域。
*函数原型gen_grid_region(:RegionGrid:RowSteps,ColumnSteps,Type,Width,Height ?
/算子gen_grid_region创建由线(Type =‘lines’)或像素(Type =‘points’)构成的网格。在’线’的情况下,返回连续的线,如果’点’只有线的交叉点。从像素(0,0)到像素(高度-1,宽度-1)开始,网格在行方向上的步进宽度RowSteps和列方向上的ColumnSteps构建。在“行”模式下,RowSteps,ColumnSteps分别可以设置为零。在这种情况下,仅分别创建列,行。/
gen_grid_region (Grid, MinSize, MinSize, ‘lines’, 512, 512)
*clip_region - 将区域剪切为矩形。
*clip_region(Region:RegionClipped:Row1,Column1,Row2,Column2 ?
/Region:要剪切的区域;RegionClipped:剪切完成的结果;Row1:起始Y;Column1:起始X;Row2:终止Y;Column2:终止X。/
clip_region (Grid, StreetGrid, 130, 10, 450, 502)
*设置显示线宽
dev_set_line_width (3)
**设置显示线的颜色
dev_set_color (‘green’)
*读取图片
*read_image (读入图片命名, ‘路径’)
read_image (ActualImage, ‘autobahn/scene_00’)
*在窗口显示刚刚读入的图片
dev_display (ActualImage)
*停止程序,为了方便看一下读入图片
stop ()
*显示刚刚使用clip_region剪切过后的用gen_grid_region生成的网格
dev_display (StreetGrid)
stop ()
*halcon的for循环等同于
*for(i=0;i<28;i=i+1)
*{
*}
for i := 0 to 28 by 1
read_image (ActualImage, ‘autobahn/scene_’ + (i$‘02’))
*将图片与区域求交集,减少图片处理范围的大小,可以使程序运行速度变快
*reduce_domain (图片, 区域, 求交集后的图片)
== reduce_domain (ActualImage, StreetGrid, Mask)==
*sobel_amp - 使用Sobel算子检测边缘
sobel_amp (Mask, Gradient, ‘sum_abs’, 3)
*选取边缘检测后的像素值在20-255的区域
threshold (Gradient, Points, 20, 255)
*dilation_rectangle1 - 使用矩形结构元素扩展区域。
dilation_rectangle1 (Points, RegionDilation, MinSize, MinSize)
*将拓展后的区域与读入的原图求交集
reduce_domain (ActualImage, RegionDilation, StripGray)
*选取像素值介于190-255的像素
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)
处理思路
在这个例子当中个人感觉对自己启发最大的就是使用网格与图像做交集从而进行快速的图像处理。
首先利用车的前视视角区域大致固定这一特性创建定义域。为了减少路面的干扰加快处理速度又使用网格对图像再进行一次压缩。在处理过程中采用了Sobel算子检测边缘,之后进行简单的阈值筛选得到边缘。得到边缘之后为了得到完整的白线的图像进行了对选中的边缘区域使用矩形元素进行膨胀,得到白线所在的区域。最后对区域进行简单的二值化筛选就OK啦,这是一个非常非常简单的例子,主要是处理思路慢慢学习的一个过程。
后记
大家有什么问题可以向我提问哈,我看到了第一时间回复,希望在学习的路上多多结交良师益友。