31.6、幾何定位---例項一(匹配助手)
例子一:定位助手(Matching)應用
1、開啟
選單------助手-----開啟新的Matching
2、模板準備
(1)、可以載入以前儲存過模板,直接使用之前儲存過的邊緣輪廓特徵。如上圖①。
注:通過這種方法來載入的輪廓只會在影象視窗中看到它的邊緣輪廓,看不到建立建立邊緣輪廓的影象。
(2)、建立模板。可以從指定的路徑傳入影象檔案來建立模板,也可以從影象採集助手後去影象來建立模板。如
上圖②。讀入影象後,圖形視窗會顯示這張影象,這是助手中的黃色區域的引數是不可設定的。
注:下面所有過程的建立模板是使用從電腦中讀入影象建立,而不是直接從電腦中載入模板
3、繪製模板ROI。
當用滑鼠繪製完ROI後,助手會自動調整黃色區域的引數,並創建出相應的邊緣輪廓資訊,顯示到影象視窗上。
3、通過減少ROI區域來遮蔽一些輪廓特徵。
先選擇"差集"模式,在繪製第二個ROI,右鍵單擊確定後如下圖。
4、檢視金字塔級別效果.
設定這一欄引數只是起到一個觀察的作用,方便下面調建立模板時的金字塔級別(一般用預設就可以了)和查詢
模板時的級別。
5、根據前面的理論知識和實際需求來設定模板引數。
一般常用設定紅色框中引數,其他使用預設即可。
6、模板使用:
可以用電腦指定路徑中載入影象,也可以從影象採集助手中載入影象。
7、查詢模板
勾選上"總是找到"選項,則會滑鼠點選下圖滑鼠所在位置的影象時會馬上自動查詢模板,若找到模板,會在助
手最下面顯示找到模板的一些資訊如它的分數以及耗時、縮放大小等並顯示輪廓到圖形視窗中;若找不到,助手最下面也會顯示找不到模板。
注:應該手動點選每一種影象,看是否能全部找到模板,假如有一些找不到,可以相應設定一下上圖黃色區域的
引數,常用的有最小分數,匹配個數,貪心演算法,重疊度。假設對自己設定的上圖黃色區域的引數不是很滿意,可以選址執行優化,讓助手自動幫你調整相應引數。
①在執行優化前設定的引數如下圖(下圖引數設定能全部找到模板)
②執行優化後它自動調整了最小分數(變大)和貪心演算法(變大)。即在指定的識別率和匹配個數情況下(黃色區
域),自動它最小分數和貪心演算法調大,因為它們變大可以節省時間。
8、檢測
用來檢測識別率以及統計一些匹配引數的。
9、插入程式碼:
10、程式碼分析:
* 設定出邊界模式為FALSE
set_system ('border_shape_models', 'false')
* 讀入影象
read_image (Image, 'C:/ww/Capture2013-9-22 11-19-17-546.jpg')
*建立模板ROI,為了節省篇幅,刪除了gen_region_runs中的一些座標值
gen_region_runs (ModelRegion, [1060,1059,1054,1052,1042])
gen_region_runs (_TmpRegion, [1070,1068,1067,1065,1064,1062])
difference (ModelRegion, _TmpRegion, ModelRegion)
* 從原影象中剪裁模板ROI指定區域
reduce_domain (Image, ModelRegion, TemplateImage)
* 建立模板
create_scaled_shape_model (TemplateImage, 6, rad(-180), rad(360), rad(0.3511), 0.6, 1.4, 0.0061, ['point_reduction_high','no_pregeneration'], 'use_polarity', [41,49,4], 4, ModelId)
* 獲取模板輪廓
get_shape_model_contours (ModelContours, ModelId, 1)
* 查詢模板
find_scaled_shape_model (Image, ModelId, rad(-180), rad(360), 0.6, 1.4, 0.3, 1, 0.5, 'least_squares', [6,1], 1, ModelRow, ModelColumn, ModelAngle, ModelScale, ModelScore)
* 遍歷找到的個數
for MatchingObjIdx := 0 to |ModelScore| - 1 by 1
hom_mat2d_identity (HomMat)
hom_mat2d_scale (HomMat, ModelScale[MatchingObjIdx], ModelScale[MatchingObjIdx], 0, 0, HomMat)
hom_mat2d_rotate (HomMat, ModelAngle[MatchingObjIdx], 0, 0, HomMat)
hom_mat2d_translate (HomMat, ModelRow[MatchingObjIdx], ModelColumn[MatchingObjIdx], HomMat)
affine_trans_contour_xld (ModelContours, TransContours, HomMat)
dev_display (TransContours)
endfor
* 銷燬控制代碼記憶體
clear_shape_model (ModelId)
11、改進
上面程式碼中只會載入一幅影象,為了載入一個資料夾中的所有影象並檢測,可以做一下修改
* 設定出邊界模式為FALSE
set_system ('border_shape_models', 'false')
* 讀入影象
read_image (Image, 'C:/ww/Capture2013-9-22 11-19-17-546.jpg')
*建立模板ROI,為了節省篇幅,刪除了gen_region_runs中的一些座標值
gen_region_runs (ModelRegion, [1060,1059,1054,1052,1042])
gen_region_runs (_TmpRegion, [1070,1068,1067,1065,1064,1062])
difference (ModelRegion, _TmpRegion, ModelRegion)
* 從原影象中剪裁模板ROI指定區域
reduce_domain (Image, ModelRegion, TemplateImage)
* 建立模板
create_scaled_shape_model (TemplateImage, 6, rad(-180), rad(360), rad(0.3511), 0.6, 1.4, 0.0061, ['point_reduction_high','no_pregeneration'], 'use_polarity', [41,49,4], 4, ModelId)
* 獲取模板輪廓
get_shape_model_contours (ModelContours, ModelId, 1)
* 查詢模板
find_scaled_shape_model (Image, ModelId, rad(-180), rad(360), 0.6, 1.4, 0.3, 1, 0.5, 'least_squares', [6,1], 1, ModelRow, ModelColumn, ModelAngle, ModelScale, ModelScore)
* 遍歷找到的個數
for MatchingObjIdx := 0 to |ModelScore| - 1 by 1
hom_mat2d_identity (HomMat)
hom_mat2d_scale (HomMat, ModelScale[MatchingObjIdx], ModelScale[MatchingObjIdx], 0, 0, HomMat)
hom_mat2d_rotate (HomMat, ModelAngle[MatchingObjIdx], 0, 0, HomMat)
hom_mat2d_translate (HomMat, ModelRow[MatchingObjIdx], ModelColumn[MatchingObjIdx], HomMat)
affine_trans_contour_xld (ModelContours, TransContours, HomMat)
dev_display (TransContours)
endfor
***************************************************************************
list_files ('C:/ww', ['files','follow_links'], ImageFiles)
tuple_regexp_select (ImageFiles, ['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima)$','ignore_case'], ImageFiles)
for Index := 0 to |ImageFiles| - 1 by 1
read_image (Image, ImageFiles[Index])
* Do something
find_scaled_shape_model (Image, ModelId, rad(-180), rad(360), 0.6, 1.4, 0.3, 1, 0.5, 'least_squares', [6,1], 1, ModelRow, ModelColumn, ModelAngle, ModelScale, ModelScore)
* 遍歷找到的個數
for MatchingObjIdx := 0 to |ModelScore| - 1 by 1
hom_mat2d_identity (HomMat)
hom_mat2d_scale (HomMat, ModelScale[MatchingObjIdx], ModelScale[MatchingObjIdx], 0, 0, HomMat)
hom_mat2d_rotate (HomMat, ModelAngle[MatchingObjIdx], 0, 0, HomMat)
hom_mat2d_translate (HomMat, ModelRow[MatchingObjIdx], ModelColumn[MatchingObjIdx], HomMat)
affine_trans_contour_xld (ModelContours, TransContours, HomMat)
dev_display (TransContours)
endfor
endfor
*******************************************************************************
* 銷燬控制代碼記憶體
clear_shape_model (ModelId)
注:************************之間的為新增程式碼
12、總結
由插入的程式碼中可以看出,在建立模板後使用了運算元get_shape_model_contours (ModelContours, ModelId, 1)獲取建立模板的輪廓,然後在找到模板後根據find_scaled_shape_model返回的角度以及中心座標和縮放,把獲取的的模板輪廓仿射變換到找到的模板上。所以找到的所有模板的輪廓都是一樣的,都與建立模板的輪廓一樣。