在使用Halcon進行模板匹配的時候,我們使用find_shape_model、find_scaled_shape_model等算子找到模板后返回的是實例,得到的數據是模板中心的行列坐標、角度和縮放比例等數據,不是具體的區域,下面介紹怎么得到具體區域。
解決思路:
一:先獲取模板的輪廓,此時獲取的輪廓位置在(0,0)的位置;
二:求出模板到匹配實例的旋轉矩陣;
三:利用仿射變換得到匹配實例的輪廓;
四:將輪廓轉成區域;
代碼及注釋講解:
1 //獲取初始模板輪廓
2 get_shape_model_contours (ModelContours1, ModelID, 1) 3 //進行模板匹配找模板
4 find_scaled_shape_model (Image0, ModelID, -3.14, 6.29, 0.95, 1.1, 0.90, 6, 0.5, 'least_squares', 8, 0.9, RowModel3, ColumnModel3, AngleModel3, Scale, Score1) 5 if(|RowModel3|>0)//如果找到的模板數量大於0 6 //顯示找到的模板輪廓
7 dev_display_shape_matching_results (ModelID, 'red', RowModel3, ColumnModel3, AngleModel3, 1, 1, 0) 8 //循環遍歷每個找到的實例
9 for I := 0 to |Score1| - 1 by 1
10 //求出初始模板到實例中間的旋轉矩陣--注:初始模板的行列坐標和角度都是0
11 vector_angle_to_rigid (0, 0, 0, RowModel3[I], ColumnModel3[I], AngleModel3[I], HomMat2DRotate) 12 //給旋轉矩陣添加縮放信息
13 hom_mat2d_scale (HomMat2DRotate, Scale[I], Scale[I], RowModel3[I], ColumnModel3[I], HomMat2DScale) 14 //通過初始模板和旋轉矩陣運算得到模板實例的輪廓
15 affine_trans_contour_xld (ModelContours1, ModelTrans, HomMat2DScale) 16 //輪廓轉區域
17 gen_region_contour_xld (ModelTrans, Region, 'filled') 18 endif