打開halcon,按下ctrl+e打開halcon自帶例程。方法->模板匹配(基於形狀)->matching_coins.hdev
下面的例程經過改動,官方例程是用本地函數,我這裏爲方便說明把本地函數全部寫在主函數中
* distinguishing of coins with the help of shape-based matching
*
dev_close_window ()
dev_open_window (0, 0, 652, 494, 'black', WindowHandle)
dev_update_window ('off')
*定義硬幣歸屬地數組變量
Names := ['german','italian','greek','spanish']
*定義一個空數組,用來存放模板ID,總共4種硬幣,有4個模板
Models := []
for i := 0 to 3 by 1
read_image (Image, 'coins/20cent_' + Names[i])
dev_display (Image)
*train_model (Image, ModelID)
*閾值化處理
threshold (Image, Region, 70, 255)
*分割圖像
connection (Region, ConnectedRegions)
*選擇最大面積區域
select_shape_std (ConnectedRegions, SelectedRegions, 'max_area', 0)
*形成凸包,把區域轉變成圓形區域
shape_trans (SelectedRegions, RegionTrans, 'convex')
*獲取區域中心座標
area_center (RegionTrans, Area, Row, Column)
*在區域中心位置處生成一個半徑120的圓形區域作爲創建模板的ROI
gen_circle (Coin, Row, Column, 120)
*創建模板的圖像閾值定義
Contrast := 20
HysteresisContrast := [Contrast / 2,Contrast + 6,10]
reduce_domain (Image, Coin, ImageReduced)
*Called during the test phase to see if Contrast is selected correctly
*inspect_shape_model (ImageReduced, ModelImages, ModelRegions, 1, HysteresisContrast)
*創建模板
create_shape_model (ImageReduced, 'auto', 0, rad(360), 'auto', 'none', 'ignore_local_polarity', HysteresisContrast, 5, ModelID)
*把模板ID添加到Models這個數組中
Models := [Models,ModelID]
endfor
for i := 1 to 13 by 1
read_image (Image, 'coins/20cent_' + i$'.2' + '.png')
*find_coin (Image, Models, Row, Column, Angle, Score, ModelIdx)
*locate_coin (Image, Coin)
threshold (Image, Region, 70, 255)
connection (Region, ConnectedRegions)
select_shape_std (ConnectedRegions, SelectedRegions, 'max_area', 0)
shape_trans (SelectedRegions, RegionTrans, 'convex')
area_center (RegionTrans, Area, Row, Column)
gen_circle (Coin, Row, Column, 120)
area_center (Coin, Area, Row, Column)
gen_circle (Circle, Row, Column, 35)
reduce_domain (Image, Circle, ImageReduced)
*
*這個函數注意與find_shape_model函數區分。這個是尋找有多個模板的函數,第二個參數是模板ID數組
*而find_shape_model是隻有一個模板,這兩個函數查找的對象數目由第六個參數定義
*這個函數最後一個輸出參數是與目標匹配的模板ID序號,從0開始
find_shape_models (ImageReduced, Models, 0, rad(360), 0.6, 1, 0, 'least_squares', 0, 0.9, Row, Column, Angle, Score, Model)
*獲取模板輪廓,第二個參數是模板ID
get_shape_model_contours (ModelContours, Models[Model], 1)
*旋轉平移變換把模板位置變換到相應查找到的目標上
vector_angle_to_rigid (0, 0, 0, Row, Column, Angle, HomMat2D)
affine_trans_contour_xld (ModelContours, ContoursAffineTrans, HomMat2D)
*顯示圖像,顯示輪廓
dev_display (Image)
dev_set_color ('green')
dev_set_line_width (2)
dev_display (ContoursAffineTrans)
set_tposition (WindowHandle, 24, 12)
*寫出對應查找到的目標的國籍信息
write_string (WindowHandle, Names[Model])
*display_model (Image, Models[ModelIdx], Row, Column, Angle, Names[ModelIdx], WindowHandle)
stop ()
endfor
創建模板圖像
查找到的圖像分類結果