Halcon 基於形狀的模板匹配


Halcon中基於形狀的模板匹配過程

Halcon中一個完整的模板匹配過程如下:

  1. 讀取並顯示圖像;
  2. 確定模板ROI及檢測ROI;
  3. 創建模型;
  4. 匹配模板;
  5. ROI仿射變換,得到ROI位置。

舉例

在這里插入圖片描述

如上圖所示,每一張圖上芯片的位置和角度不固定,需要定位到綠色框內的針腳進行檢測,如果以綠色框作為模板ROI,因為圖片上有很多針腳,可能會匹配到其他位置,因此,以紅色框作為模板ROI,藍色框作為檢測ROI。

以下是測試效果:
在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述
可以看到能夠准確定位到檢測ROI,圖片資源是Halcon自帶例程的圖片,路徑為:Halcon安裝路徑\images\board,Halcon完整代碼如下:

 1 dev_close_window ( )  2 
 3 list_files ('D:/zxhalcon/images/board', 'files', Files)  4 tuple_regexp_select (Files, '\\.png$', Files)  5 
 6 read_image (Image, Files[0])  7 
 8 dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)  9 dev_display (Image) 10 
11 dev_set_color ('red') 12 gen_rectangle1 (Rectangle, 164.5, 126.5, 323, 476.5) 13 
14 dev_set_color ('green') 15 gen_rectangle1 (Rectangle1, 117.5, 138.5, 164.5, 166.5) 16 
17 reduce_domain (Image, Rectangle, ImageReduced) 18 
19 create_shape_model (ImageReduced, 4, rad(0), rad(360), 'auto', 'auto', 'use_polarity', 30, 10, ModelID) 20 
21 area_center (Rectangle, Area, Row, Column) 22 
23 set_shape_model_origin (ModelID, -Row, -Column) 24 
25 get_shape_model_contours (ModelContours, ModelID, 1) 26 
27 dev_set_color ('red') 28 dev_set_draw ('margin') 29 dev_display (ModelContours) 30 
31 for Index := 0 to |Files|-1 by 1
32  read_image (Image, Files[Index]) 33     find_shape_model (Image, ModelID, 0, rad(360), 0.4, 1, 0.5, 'least_squares', 0, 0.7, Row3, Column3, Angle, Score) 34 
35     vector_angle_to_rigid (0, 0, 0, Row3, Column3, Angle, HomMat2D) 36  affine_trans_contour_xld (ModelContours, ContoursAffinTrans, HomMat2D) 37     affine_trans_region (Rectangle1, RegionAffineTrans, HomMat2D, 'false') 38     
39     dev_set_color ('red') 40  dev_display (ContoursAffinTrans) 41     
42     dev_set_color ('green') 43  dev_display (RegionAffineTrans) 44 endfor 45 
46 clear_shape_model (ModelID)

坐標轉換原理解析

上述例程中涉及到坐標的算子主要有:

  • create_shape_model
  • set_shape_model_origin
  • find_shape_model
  • vector_angle_to_rigid
  • affine_trans_contour_xld
  • affine_trans_region

 

第一步:創建模板

create_shape_model (ImageReduced, 4, rad(0), rad(360), 'auto', 'auto', 'ignore_local_polarity', 30, 10, ModelID)

算子原型:create_shape_model(Template : : NumLevels, AngleStart, AngleExtent, AngleStep, Optimization, Metric, Contrast, MinContrast : ModelID)

–Template :用於創建模板的圖像,是原圖的模板ROI區域;

–NumLevels:金字塔層的最大層數;

–AngleStart:模板的最小旋轉角度,以弧度為單位;

–AngleExtent:旋轉角度范圍,必須≥0,以弧度為單位;如果超出角度范圍,則模型搜索不到

–AngleStep:角度步長,以弧度為單位;

–Optimization:生成模型的優化方法;

–Metric:模板匹配的條件,在模板與圖像亮暗發生反轉時可使用;

–Contrast:創建模型時,模型點的對比度;

–MinContrast :在搜索的圖像中,搜索對象的最小對比度,必須<Contrast;

–ModelID:模型的句柄。

 

算子使用時可能出現的錯誤:
在這里插入圖片描述

在這里插入圖片描述

通過幫助文檔看到是模板的點數太少,當繪制的模板ROI區域太小,或模板ROI區域內特征不明顯時會出現,可以擴大模板ROI區域。

 

第二步:設置原點

1 area_center (Rectangle, Area, Row, Column) 2 set_shape_model_origin (ModelID, -Row, -Column)

在算子get_shape_model_contours和set_shape_model_origin的幫助文檔中有說明:默認情況下,模板輪廓的原點位於模型區域的重心,即通過area_center獲取的模板ROI的坐標,如下圖所示的坐標系O 模 X 模 Y 模 O_模X_模Y_模OXY是模板輪廓的原始坐標系。

在這里插入圖片描述

首先使用area_center (Rectangle, Area, Row, Column)獲取O 模 O_模OO 圖 O_圖O中的坐標;
然后使用set_shape_model_origin (ModelID, -Row, -Column)O 模 X 模 Y 模 O_模X_模Y_模OXY移動至與O 圖 X 圖 Y 圖 O_圖X_圖Y_圖OXY重合,

 

第三步:匹配模板

find_shape_model (Image, ModelID, 0, rad(60), 0.4, 1, 0.5, 'least_squares', 0, 0.7, Row3, Column3, Angle, Score)

算子原型:find_shape_model(Image : : ModelID, AngleStart, AngleExtent, MinScore, NumMatches, MaxOverlap, SubPixel, NumLevels, Greediness : Row, Column, Angle, Score)

– Image :輸入圖像;

–ModelID:模型的句柄;

–AngleStart:模板的最小旋轉角度,以弧度為單位;

–AngleExtent:旋轉角度范圍,必須≥0,以弧度為單位;如果超出角度范圍,則模型搜索不到

–MinScore:要搜索到的模型實例的最小得分,如果低於此分數,則搜索不到;

–NumMatches:要搜索到的模型實例的個數;

–MaxOverlap:要找到的模型實例的最大重疊;

–SubPixel:確定找到的目標是否使用亞像素精度提取;

–NumLevels:搜索過程中使用的金字塔級別的數量 ;

–Greediness :搜索啟發式的“貪婪度”,(0:安全但緩慢;1:快,但可能匹配不到)

–Row:找到的模型實例的行坐標,坐標值是找到模板的原點在圖像坐標系中的行坐標;

–Column:找到的模型實例的列坐標,坐標值是找到模板的原點在圖像坐標系中的列坐標;

–Angle:找到的模型實例的角度;

–Score: 找到的模型實例的分數。

 

第四步:坐標轉換,得到模板ROI和檢測ROI

1 vector_angle_to_rigid (0, 0, 0, Row3, Column3, Angle, HomMat2D) 2 affine_trans_contour_xld (ModelContours, ContoursAffinTrans, HomMat2D) 3 affine_trans_region (Rectangle1, RegionAffineTrans, HomMat2D, 'false')

計算變換矩陣
算子原型:vector_angle_to_rigid( : : Row1, Column1, Angle1, Row2, Column2, Angle2 : HomMat2D)

–Row1:原始點的行坐標;

–Column1:原始點的列坐標;

–Angle1:原始點的角度;

–Row2:變換點的行坐標;

–Column2:變換點的列坐標;

–Angle2:變換點的角度;

–HomMat2D:輸出的變換矩陣。

ROI坐標轉換
使用算子:affine_trans_contour_xld和affine_trans_region


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM