Halcon開發筆記001 尺寸測量實例分析

課題需要對圖像中的缺陷進行尺寸評價,開發環境是Halcon。
選擇使用最小外接矩形方法,原因主要是

可獲得的評價參數多:長度,寬度,角度,長寬比,面積
通過長寬比參數可以判定缺陷形狀

獲取最小外接矩形的過程:

這裏是做測試的原圖

圖像分割
選取合適的閾值比較困難。考慮到是工廠環境,採光可能不均勻,也爲了測試方便(主要使用手機拍照,光源是環境光和手機閃光燈),   採用動態閾值分割法,Halcon提供了一個函數:


dyn_threshold(OrigImage, ThresholdImage : RegionDynThresh : Offset,
LightDark : )

其中第一個參數是原始圖片,第二個參數是包含本地閾值的圖片(用來獲取灰度參考值),第三個參數是分割後得到的區域輸出,第四個參數是閾值偏移量,第五個參數是問你需要暗的區域還是亮的區域。
這裏有個問題,什麼是包含本地閾值的圖片?這裏可以使用一個函數,先獲取一張經過平均閾值處理的圖片。

mean_image(Image : ImageMean : MaskWidth, MaskHeight : )

大概思路是使用高斯濾波,將每幾個點的灰度值聯繫起來,取其平均值,比如在下圖中,中間位置的灰度值取決於相鄰八個點的灰度值,這樣對圖像中每個點進行處理,最終可以得到一張經過平滑處理的圖像。
這裏是經過均值濾波之後的圖像


現在我們可以感性理解一下dyn_threshold這個函數:通過對比原圖和局部臨域之間的灰度值差,對每個局部小塊獲取一個局部的閾值,這樣下來,對於局部灰度差異值大的圖像來說可以很好地完成分割。

這裏是經過動態閾值分割之後的圖像

獲取最小外接矩形
其實Halcon已經將這種非常常用的處理算法打包,直接調用函數:


smallest_rectangle2(Regions : : : Row, Column, Phi, Length1, Length2)

紅框就是我們生成的最小外接矩形了

如果獲得了多個最小外接矩形怎麼辦?
在我本次的例子中雖然很順利的生成了唯一的最小外接矩形,但是在大多數閾值分割不夠完善的圖像中,很容易生成多個最小外接矩形。這個時候就要考慮重新選擇閾值分割的參數。
我們獲取到的尺寸是物體的實際尺寸嗎?
很遺憾,到了這一步我們並沒有得到物體的實際尺寸,因爲在圖像中沒有任何一個已知尺寸的條件下,我們無法得到真實尺寸。這裏得到的數值實際上是圖像中的像素值,像素值可以通過dpi換算成尺寸,但是這個尺寸僅僅指的是圖片在1:1打印後的尺寸,我們需要在圖片中畫下一個標尺,通過換算得到實際尺寸。
在我的課題中,有一部分是測量系統的硬件設計,鏡頭到物體的距離將是一個固定值,所以我可以在硬件確定後通過測試得到一個轉換公式,以此獲得實際尺寸。

dev_close_window() 

dpi:=72
*這裏做出說明,dpi是根據相機變化的參數,需要自行調整
read_image (image, 'D:/畢業設計/image/40x40.jpg') 
get_image_size(image, Width, Height)
dev_open_window(0, 0, Width/4, Height/4, 'black', WindowHandle) 
mean_image (image, ImageMean, 101, 101) 
dyn_threshold (image, ImageMean, Region, 1, 'dark') 
*使用動態閾值分割圖像

connection(Region, ConnectedRegions)
*合併像素相連區成爲一個Element

select_shape (ConnectedRegions, SelectedRegions, 'height', 'or', 1000, 100000)
*SelectedRegions:=Region
*選擇具有特定特徵的區域

smallest_rectangle2(SelectedRegions, Row, Column, Phi, Length1, Length2) 

tuple_max(Length1,MaxLength1)

for Index := 0 to |Length1|-1 by 1
    if(Length1[Index]==MaxLength1) 
        MaxLength2:=Length2[Index]
        MaxRow:=Row[Index]
        MaxColumn:=Column[Index]
        MaxPhi:=Phi[Index]
    endif
endfor
//將最大的最小外接矩形提取出來


dev_set_color('pink')
dev_set_line_width(5)

dev_set_draw('margin')
dev_set_color('red')
gen_rectangle2(Rectangle, MaxRow, MaxColumn, MaxPhi, MaxLength1, MaxLength2) 
disp_message(WindowHandle,'寬度爲:'+MaxLength2/dpi*25.4, 'window',0,0, 'black', 'true') 
disp_message(WindowHandle,'長度爲:'+MaxLength1/dpi*25.4, 'window', 0,100, 'black', 'true')
disp_message(WindowHandle,'角度爲:'+MaxPhi, 'window',0,200, 'black', 'true') 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章