HALCON示例程序board.hdev檢測電路板焊錫有無程序剖析
示例程序源碼(加注釋)
*這是關于系統設置的函數,剪輯區域,設置剪輯區域設置為使能。為clip_region做的設置,后文會介紹
get_system (‘clip_region’, Information)
set_system (‘clip_region’, ‘true’)
*關閉窗口更新
dev_update_window (‘off’)
*關閉窗口
dev_close_window ()
*開啟窗口,這個函數之前介紹過了
dev_open_window (0, 0, 512, 512, ‘black’, WindowID)
*讀入圖片,注意,這里讀入了4張圖片,都存在images變量當中
read_image (Images, [‘ic0’,‘ic1’,‘ic2’,‘ic3’])
將多個單通道圖像轉化為多通道圖像,這樣操作的話這就屬于一個變量了,上邊讀入的時候,四張圖像是一個數組并不是一張圖像。
channels_to_image (Images, Ic)
*select_obj - 從對象數組中選擇對象。現在我們就發現這個images是個圖像數組。
*這個算子非常好理解,第一個參數:就是圖像數組,也就是我們需要的圖片在哪個數組里邊;第二個參數:*我們取出的圖像叫什么,我們要給他重新命名;第三個參數:你想取出這個圖像數組中的哪個圖片。
select_obj (Images, Input1, 1)
*顯示剛剛取出的圖片
dev_display (Input1)
*這個是顯示F5繼續的那個按鈕,之前講解的歷程已經說過了。
set_display_font (WindowID, 14, ‘mono’, ‘false’, ‘false’)
disp_continue_message (WindowID, ‘black’, ‘true’)
*停止一下,讓我們能直觀的看到我們剛剛取出的圖片。
stop ()
*和上邊取出第一張圖片一樣,取出第二張圖片并顯示。
select_obj (Images, Input2, 2)
dev_display (Input2)
disp_continue_message (WindowID, ‘black’, ‘true’)
stop ()
*和上邊取出第二張圖片一樣,取出第三張圖片并顯示。
select_obj (Images, Input3, 3)
dev_display (Input3)
disp_continue_message (WindowID, ‘black’, ‘true’)
stop ()
*和上邊取出第三張圖片一樣,取出第四張圖片并顯示。
select_obj (Images, Input4, 4)
dev_display (Input4)
disp_continue_message (WindowID, ‘black’, ‘true’)
stop ()
*多個通道的平均灰度值。這個算子是這樣計算的,先把這個多通道圖片的灰度值按照坐標一個一個的相加,*之后除以這個圖片的通道數。IC:多通道圖片;ImageMean:經過多通道均值計算的圖片。
mean_n (Ic, ImageMean)
*顯示多通道均值后的圖片
dev_display (ImageMean)
*對圖像數組Images里邊的圖片進行閾值分割,選取灰度值在0-40的區域。注意:images里邊有4個圖片,
*進行閾值分割后也會生成4個區域。
threshold (Images, Darks, 0, 40)
*將將篩選出的區域取并集命名為Dark。
union1 (Darks, Dark)
*對篩選出的區域的空洞進行填充
fill_up (Dark, DarkFilled)
*設置顯示顏色為綠色
dev_set_color (‘green’)
*顯示剛剛篩選出的區域,現在我們驚奇的發現,竟然把電路板上的電路線全部選取出來了。
dev_display (DarkFilled)
disp_continue_message (WindowID, ‘black’, ‘true’)
stop ()
對圖像數組Images里邊的圖片進行閾值分割,選取灰度值在100-255的區域。注意:images里邊有4個圖
*片,進行閾值分割后也會生成4個區域。
threshold (Images, Lights, 100, 255)
*將將篩選出的區域取并集命名為Light。
union1 (Lights, Light)
*intersection 算子是取交集,前兩個參數是輸入區域,也就是你想把哪兩個區域取交集;第三個參數是輸出
*區域,兩個輸入區域的交集。
intersection (DarkFilled, Light, Intersection)
*顯示ImageMean
dev_display (ImageMean)
*顯示Intersection
dev_display (Intersection)
disp_continue_message (WindowID, ‘black’, ‘true’)
*現在是不是又驚奇的發現電路板上電路中有焊錫的部分被篩選出來了。
stop ()
*complement 求取區域的補,怎么理解這個補字呢,就是說這個圖片區域內除了你選取區域以外的全部區
*域。第一個參數是要進行取補的區域;第二個參數是輸入區域的補。
*特別注意:如果系統標志’clip_region’為’true’(默認值),則返回到目前為止處理的最大圖像和輸入區域的
差異。如果系統標志’clip_region’為’false’,則resluting區域將無限大。為避免這種情況,通過將Region的補碼標志設置為TRUE來實現補碼。
complement (DarkFilled, Back)
*顯示Back
dev_set_color (‘red’)
dev_display (Back)
disp_continue_message (WindowID, ‘black’, ‘true’)
stop ()
*expand_region - 填充區域之間的間隙或分割重疊區域。我們這里用到了填充
*函數原型:expand_region(Regions,ForbiddenArea:RegionExpanded:Iterations,Mode ?
*Regions:要進行填充的區域;ForbiddenArea:填充的邊界;ForbiddenArea:填充或者分割之后的區域;Iterations:迭代次數;Mode :模式,填充還是分割。
expand_region (Intersection, Back, RegionExpanded, 10, ‘image’)
*對填充過后的區域進行空洞填充
fill_up (RegionExpanded, Good)
顯示;我們現在驚奇的發現電路板上有焊錫的區域被提取的很完整,接下來是不是就好辦了,把電路和有焊錫區域做減法不就OK了嗎。
dev_display (ImageMean)
dev_set_color (‘green’)
dev_display (Good)
disp_continue_message (WindowID, ‘black’, ‘true’)
stop ()
*difference 求取兩個區域的不同。前兩個參數輸入區域,要進行求取差異的區域;第三個參數是差異區域。
difference (DarkFilled, Good, Rest)
*顯示
dev_set_color (‘red’)
dev_display (Rest)
disp_continue_message (WindowID, ‘black’, ‘true’)
stop ()
*expand_gray - 填充區域之間的間隙,這個算子之前也介紹過了
expand_gray (Rest, Ic, Good, Bad, 6, ‘image’, 5)
*顯示
dev_display (Bad)
disp_continue_message (WindowID, ‘black’, ‘true’)
stop ()
*對篩選出的Bad區域進行區域分割
connection (Bad, ConnectedBad)
*使用select_shape 選取面積值在150- 99999的區域,目的是為了消除雜點。
select_shape (ConnectedBad, BigBad, ‘area’, ‘and’, 150, 99999)
*area_center 對區域進行一個面積與位置統計
area_center (BigBad, AreaBad, Row, Column)
*count_obj 對漏焊數量進行計數
count_obj (BigBad, NumMissingSolder)
AreaMissingSolder := sum(AreaBad)
*顯示
dev_display (Images)
dev_set_color (‘green’)
dev_set_draw (‘margin’)
dev_set_line_width (3)
dev_display (Good)
dev_set_color (‘red’)
dev_display (BigBad)
dev_set_draw (‘fill’)
dev_set_line_width (1)
dev_update_window (‘on’)
set_system (‘clip_region’, Information)
處理思路
這個電路焊錫檢測是一個非常寶貴的例程,因為焊錫表面反光非常強,所以電路板從上下左右四個方向分別進行打光分析,利用了焊錫反光這一特性。把人們最討厭的反光,通過精巧的思路轉化為檢測焊錫的利器。
后記
大家有什么問題可以向我提問哈,我看到了第一時間回復,希望在學習的路上多多結交良師益友。