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啦,這是一個非常非常簡單的例子,主要是處理思路慢慢學習的一個過程。
后記
大家有什么問題可以向我提問哈,我看到了第一時間回復,希望在學習的路上多多結交良師益友。