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
處理思路
這個焊點檢測拿到圖片后我們想到的他的一個特點是圓的對吧,在一個我們看一下焊盤的灰度值很低,這個例程就是使用了這個特性完成了這個檢測任務。先通過閾值對電路板進行了一個選取,減少非電路板部分對檢測的干擾。然后通過最大最小灰度閾值選擇出焊點,因為照片噪點或者產品本身就有噪點,對封閉區域做了一個填充。之后選擇出矩形的干擾。對選擇出的焊盤進行了擴張,這是為了使焊點半徑求取更加準確。之后使用圓形元素進行了一個開運算,搞掉焊盤的那些毛刺。之后對區域排序求解最小外接矩形。之后做了一個簡單計算,大功告成。
后記
大家有什么問題可以向我提問哈,我看到了第一時間回復,希望在學習的路上多多結交良師益友。