天天看點

HALCON示例程式ball電路闆焊點識别、檢測、測量程式2剖析(與上篇文章使用了不同方法)HALCON示例程式ball電路闆焊點識别、檢測、測量程式2

HALCON示例程式ball電路闆焊點識别、檢測、測量程式2

示例程式源碼(加注釋)

*這是關于顯示的函數,已經介紹過了

dev_update_off ()

*定義一個字元串變量ImageNames,ImageNames[0]的含義為’die/die_02’以此類推

ImageNames := ‘die/’ + [‘die_02’,‘die_03’,‘die_04’,‘die_07’]

*設定顯示顔色的色彩個數,及不同的連通域使用12種不同顔色表示

dev_set_colored (12)

*讀入圖檔

read_image (Bond, ImageNames[0])

*得到圖檔尺寸

get_image_size (Bond, Width, Height)

*關閉視窗

dev_close_window ()

*打開視窗

dev_open_window (0, 0, Width, Height, ‘black’, WindowHandle)

*設定顯示格式

set_display_font (WindowHandle, 16, ‘mono’, ‘true’, ‘false’)

*區域設定為邊緣顯示模式

dev_set_draw (‘margin’)

*設定線條顯示寬度為3

dev_set_line_width (3)

*這句話是HALCON的一個求字元串個數的一個語句,即ImageNames[]數組裡邊有多少個原素

NumImages := |ImageNames|

*接下來使用FOR循環對每一張圖檔進行周遊檢測

for I := 0 to NumImages - 1 by 1

*讀入圖檔

read_image (Bond, ImageNames[I])

*顯示讀入圖檔

dev_display (Bond)

*求圖檔Bond的最大灰階與最小灰階

min_max_gray (Bond, Bond, 0, Min, Max, Range)

*使用剛剛求得的灰階值最大值對圖檔進行二值化,這樣有一個好處,就是提高了程式的通用性,如果使用固定門檻值進行二值化,會導緻産品因光照不均或産品位置變化而産生的圖檔品質差異時導緻檢測出錯。

threshold (Bond, Bright, Max - 80, 255)

*這個算子在上節也介紹過了,求解外接矩形

shape_trans (Bright, Die, ‘rectangle2’)

*顯示求得矩形

dev_display (Die)

*使用求得矩形裁剪圖檔使圖檔處理區域減少,加快圖像處理速度

reduce_domain (Bond, Die, DieGrey)

*再次求解最大最小灰階值,上一次是為了選擇出電路闆,這一次是為了選擇出焊點

min_max_gray (Die, Bond, 0, Min, Max, Range)

*使用剛剛求得的灰階值最小值對圖檔進行二值化

threshold (DieGrey, Wires, 0, Min + 30)

*選擇區域面積介于1-100的進行孔洞填充

fill_up_shape (Wires, WiresFilled, ‘area’, 1, 100)

*使用圓形元素對各個區域進行開運算

opening_circle (WiresFilled, Balls, 9.5)

*把整個定義域進行分割,分割成不同的連通域

connection (Balls, SingleBalls)

*選擇最大面積的矩形

select_shape_std (SingleBalls, Rect, ‘rectangle1’, 90)

*矩形不是我們所需要的焊盤,則将選擇出來的矩形區域減去

difference (SingleBalls, Rect, IntermediateBalls)

*生成一個空的區域Forbidden

gen_empty_region (Forbidden)

*這個函數是使用矩形區域對區域進行疊代擴張,接觸到其他區域或者灰階值相差過大,則停止。或者用于分割區域與區域的重合區域。

*函數原型expand_gray(Regions, Image, ForbiddenArea : RegionExpand : Iterations, Mode, Threshold : )

*Regions:要進行操作的區域;Image:原始圖像;RegionExpand:不進行擴張的區域;Iterations:疊代次數;Mode:模式;Threshold:門檻值

expand_gray (IntermediateBalls, Bond, Forbidden, RegionExpand, 4, ‘image’, 6)

*對區域使用圓形元素進行開運算

opening_circle (RegionExpand, RoundBalls, 15.5)

*根據區域的相對位置對區域進行排序,這個在上一例子中進行了講解

sort_region (RoundBalls, FinalBalls, ‘first_point’, ‘true’, ‘column’)

*求取最小外接圓

smallest_circle (FinalBalls, Row, Column, Radius)

*接下來就是使用半徑,對焊點的直徑求取了平均值

NumBalls := |Radius|

Diameter := 2 * Radius

meanDiameter := sum(Diameter) / NumBalls

mimDiameter := min(Diameter)

dev_display (RoundBalls)

*這裡就是對檢測的圖檔個數進行一個判斷,如果所有圖檔檢測完了,那麼不再顯示繼續按鈕

if (I != NumImages)

disp_continue_message (WindowHandle, ‘black’, ‘true’)

endif

stop ()

endfor

處理思路

這個焊點檢測拿到圖檔後我們想到的他的一個特點是圓的對吧,在一個我們看一下焊盤的灰階值很低,這個例程就是使用了這個特性完成了這個檢測任務。先通過門檻值對電路闆進行了一個選取,減少非電路闆部分對檢測的幹擾。然後通過最大最小灰階門檻值選擇出焊點,因為照片噪點或者産品本身就有噪點,對封閉區域做了一個填充。之後選擇出矩形的幹擾。對選擇出的焊盤進行了擴張,這是為了使焊點半徑求取更加準确。之後使用圓形元素進行了一個開運算,搞掉焊盤的那些毛刺。之後對區域排序求解最小外接矩形。之後做了一個簡單計算,大功告成。

後記

大家有什麼問題可以向我提問哈,我看到了第一時間回複,希望在學習的路上多多結交良師益友。

繼續閱讀