1. 程式人生 > 其它 >31.6、幾何定位---例項一(匹配助手)

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返回的角度以及中心座標和縮放,把獲取的的模板輪廓仿射變換到找到的模板上。所以找到的所有模板的輪廓都是一樣的,都與建立模板的輪廓一樣。