本文要完成的任務(wù)是將下圖中焊點(diǎn)提取出來,對應(yīng)于halcon例程Blob分析中的ball.hdev。

image.png
dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
read_image (Image, 'die_03.png')
disp_continue_message (WindowHandle, 'black', 'true')
stop()
*形狀轉(zhuǎn)換,最小外接矩形并填充
threshold (Image, Regions, 91, 242)
shape_trans (Regions, RegionTrans, 'rectangle2')
*摳圖
reduce_domain (Image, RegionTrans, ImageReduced)
threshold (ImageReduced, Regions1, 0, 50)
*區(qū)域填充,fill_up是將所有的區(qū)域填充,fill_up_shape是將面積在1到100的填充
fill_up_shape (Regions1, RegionFillUp, 'area', 1, 100)
disp_continue_message (WindowHandle, 'black', 'true')
stop()
*用一個(gè)圓形的結(jié)構(gòu)元素做開運(yùn)算
opening_circle (RegionFillUp, RegionOpening, 13.5)
*打斷區(qū)域做特征選擇(這里用圓度特征)
connection (RegionOpening, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'roundness', 'and', 0.88349, 1)
*排序
sort_region (SelectedRegions, SortedRegions, 'first_point', 'true', 'column')
*計(jì)算連通域的個(gè)數(shù)
count_obj (SortedRegions, Number)
disp_continue_message (WindowHandle, 'black', 'true')
stop()
*計(jì)算最小外接圓并畫出
dev_display (Image)
smallest_circle (SortedRegions, Row, Column, Radius)
disp_circle (WindowHandle, Row, Column, Radius)
Diameter:= 2*Radius
*顯示直徑
for i:=0 to |Radius|-1 by 1
if(fmod(i,2)==1)
disp_message (WindowHandle, 'D: ' + Diameter[i], 'image', Row[i]-Diameter[i] , max([Column[i] - 60,0]), 'white', 'false')
else
disp_message (WindowHandle, 'D: ' + Diameter[i], 'image', Row[i]+Diameter[i], max([Column[i] - 60,0]), 'white', 'false')
endif
endfor
運(yùn)行結(jié)果如下:

image.png