我們都知道,HDevelop中,在菜單欄“助手”中,可以通過“Matching”助手輔助模板匹配的建模等操作。

“基于形狀”的模板匹配, 主要有三種類型:find_shape_model、find_scaled_shape_model、find_aniso_shape_model。
那么這三種類型有什么區(qū)別呢?我用一張圖來說明。

說明:find_shape_model指的是行列方向均無縮放的模板匹配,find_scaled_shape_model指的是行列等比例縮放的模板匹配,find_aniso_shape_model指的是行列不等比例縮放(各向異性縮放)的模板匹配。
上面三個(gè)算子一般如何根據(jù)實(shí)際情況選擇呢?
① 在實(shí)際的視覺項(xiàng)目中,一般工件的大小是基本相同的。如果只有一個(gè)相機(jī),那么可以直接用find_shape_model來做模板匹配;
② 如果有多個(gè)工站、多個(gè)相機(jī),并且用的還是同款相機(jī)、同款遠(yuǎn)心鏡頭的話,由于遠(yuǎn)心鏡頭只有一個(gè)固定的對(duì)焦距離,因此兩個(gè)工位中的工件在圖中的大小是一樣大的。此時(shí)還是可以用find_shape_model來做模板匹配;
③ 如果有多個(gè)工站、多個(gè)相機(jī),但是用的是普通鏡頭的話,由于普通鏡頭的對(duì)焦距離是不固定的,因此視野的放大倍率也不固定,此時(shí)兩個(gè)工位中的工件在圖中的大小是不一樣的。此時(shí)適合用find_scaled_shape_model來做模板匹配;
④ find_aniso_shape_model的應(yīng)用場(chǎng)景較少,很少用于精細(xì)的模板匹配定位檢測(cè)。在運(yùn)動(dòng)速度不固定的線掃項(xiàng)目中,可能會(huì)用到這個(gè)算子。因?yàn)榫€掃平臺(tái)速度變化時(shí),待測(cè)工件圖像的長(zhǎng)寬比經(jīng)常會(huì)發(fā)生變化,此時(shí)用find_aniso_shape_model就比較合適。一般來說,這個(gè)算子的執(zhí)行時(shí)間是三個(gè)里面最長(zhǎng)的,因?yàn)樗凶畲蟮牟淮_定性。
find_aniso_shape_model的應(yīng)用場(chǎng)景有限,因此我不討論它。從上面的分析可以看出:find_scaled_shape_model是完全可以涵蓋find_shape_model的功能的,因此下文以find_scaled_shape_model算子來展開分析。
以下圖為例:

測(cè)試的軟硬件環(huán)境為:Windows 10、Intel Xeon E5-2630 v3 2.40GHz、Halcon 17.12。
該圖的建模區(qū)域,以及初始參數(shù)設(shè)置如下圖所示:

另外,最小分?jǐn)?shù)為0.3,匹配的最大數(shù)為1。除此之外的所有參數(shù)均使用默認(rèn)值。
一鍵生成的代碼精簡(jiǎn)后如下:
1 set_system ('border_shape_models', 'false')
2 read_image (Image, 'C:/Users/02/Desktop/形狀模板匹配/接口.png')
3 gen_rectangle1 (ModelRegion, 92, 80, 339, 731)
4 reduce_domain (Image, ModelRegion, TemplateImage)
5 *
6 create_scaled_shape_model (TemplateImage, 4, rad(0), rad(360), rad(0.3386), 0.97, 1.03, 0.0059, ['point_reduction_high','no_pregeneration'], 'use_polarity', [60,80,10], 5, ModelID)
7 *
8 get_shape_model_contours (ModelContours, ModelID, 1)
9 *
10 * Matching 02: Get the reference position
11 area_center (ModelRegion, ModelRegionArea, RefRow, RefColumn)
12 vector_angle_to_rigid (0, 0, 0, RefRow, RefColumn, 0, HomMat2D)
13 affine_trans_contour_xld (ModelContours, TransContours, HomMat2D)
14 *
15 * Matching 02: Display the model contours
16 dev_display (Image)
17 dev_set_color ('green')
18 dev_set_draw ('margin')
19 dev_display (ModelRegion)
20 dev_display (TransContours)
21
22 *開始匹配(這里簡(jiǎn)單起見,匹配的就是建模圖像本身)
23 find_scaled_shape_model (Image, ModelID, rad(0), rad(360), 0.97, 1.03, 0.3, 1, 0.5, 'least_squares', [4,1], 0.75, Row, Column, Angle, Scale, Score)
24
25 dev_display (Image)
26 for I := 0 to |Score| - 1 by 1
27 hom_mat2d_identity (HomMat2D)
28 hom_mat2d_scale (HomMat2D, Scale[I], Scale[I], 0, 0, HomMat2D)
29 hom_mat2d_rotate (HomMat2D, Angle[I], 0, 0, HomMat2D)
30 hom_mat2d_translate (HomMat2D, Row[I], Column[I], HomMat2D)
31 affine_trans_contour_xld (ModelContours, TransContours, HomMat2D)
32 dev_set_color ('green')
33 dev_display (TransContours)
34 endfor
35
36 clear_shape_model (ModelID)
一般來說,我們不太在意建模算子create_scaled_shape_model的速度,因?yàn)槟P臀募话闶翘崆皽?zhǔn)備好保存在本地的。建模快一點(diǎn)慢一點(diǎn),問題不大。但是建模中,也有幾個(gè)參數(shù)對(duì)查找模板的速度有較大影響的,它們是:

設(shè)置合適的對(duì)比度,設(shè)置較大的“最小組件尺寸”,可以確保模板輪廓XLD不會(huì)過于復(fù)雜。過于復(fù)雜的XLD是會(huì)影響后面的模板查找速度的。
find_scaled_shape_model語句中,對(duì)查找速度有明顯影響的算子,我已經(jīng)標(biāo)紅了,如下:
find_scaled_shape_model (Image, ModelID, rad(0), rad(360), 0.97, 1.03, 0.3, 1, 0.5, 'least_squares', [4,1], 0.75, Row, Column, Angle, Scale, Score)
上面6個(gè)參數(shù)的參數(shù)名和含義如下:
AngleStart(rad(0)): 搜索時(shí)的起始角度。
AngleExtent(rad(360)):搜索時(shí)的角度范圍。
ScaleMin(0.97):行列的最小縮放比例。
ScaleMax(1.03):行列的最大縮放比例。
NumLevels(4):搜索時(shí)金字塔的層數(shù)。
Greediness(0.75):貪婪系數(shù),啟發(fā)式搜索,默認(rèn)值0.75,越高速度越快,但容易出現(xiàn)找不到的情況。這個(gè)值我們一般不改它。
① 在我電腦上,上面find_scaled_shape_model 算子的查找時(shí)間為:25毫秒。
② find_scaled_shape_model (Image, ModelID, rad(0), rad(360), 0.97, 1.03, 0.3, 1, 0.5, 'least_squares', [3,1], 0.75, Row, Column, Angle, Scale, Score)
將金字塔層級(jí)由“4”改成“3”,查找時(shí)間為:83毫秒。(金字塔層級(jí)一般不會(huì)設(shè)置為“1”或者“2”,因?yàn)榇藭r(shí)查找會(huì)特別慢,經(jīng)常超過1秒鐘。如果圖像較大,該值一般最小設(shè)置為“4”)
將金字塔層級(jí)由“4”改成“7”,查找時(shí)間為:25毫秒。(主要是這張圖比較小,當(dāng)金字塔層級(jí)大于4以后,再增加,并不能顯著減少查找時(shí)間)
值得說明的是:使用較小的金字塔層級(jí),模板匹配的成功率會(huì)大大增加。(但是時(shí)間會(huì)增加)
另外,NumLevels可以包含第二個(gè)值,該值確定跟蹤找到的匹配項(xiàng)的最低金字塔級(jí)別。因此,NumLevels值[4,2]表示匹配從第4個(gè)金字塔級(jí)別開始,并跟蹤匹配到第2個(gè)金字塔級(jí)別(最低的金字塔級(jí)別由值1表示)。該機(jī)制可用于減少匹配的運(yùn)行時(shí)間。
然而,應(yīng)當(dāng)注意,一般在該模式下提取的姿態(tài)參數(shù)的精度低于在正常模式中的精度,在正常模式中,匹配被跟蹤到最低金字塔級(jí)別(本人注:即級(jí)別1)。因此,如果需要高精度,則子像素應(yīng)至少設(shè)置為“l(fā)east_squares”。
如果要使用的最低金字塔級(jí)別選擇得太大,則可能會(huì)發(fā)生無法實(shí)現(xiàn)所需精度的情況,或者由于模型在較高金字塔級(jí)別上不夠具體而可能會(huì)找到錯(cuò)誤的模型實(shí)例。在這種情況下,要使用的最低金字塔級(jí)別(我自己的理解:這里指的應(yīng)該是NumLevels的第二個(gè)值)必須設(shè)置為較小的值。 (上面三段話翻譯自find_scaled_shape_model 的幫助文檔)
可以得出結(jié)論,一般來說,NumLevels := [4, 2],查找速度應(yīng)該會(huì)略快于NumLevels := [4, 1]和NumLevels := [4]。
NumLevels 的第二個(gè)值還可以為負(fù)數(shù)(通常針對(duì)邊緣模糊的圖像的匹配定位),具體參考find_scaled_shape_model 的幫助文檔或find_shape_mode參數(shù)詳解及時(shí)長(zhǎng)優(yōu)化。
③ find_scaled_shape_model (Image, ModelID, rad(0), rad(360), 1.0, 1.0, 0.3, 1, 0.5, 'least_squares', [4,1], 0.75, Row, Column, Angle, Scale, Score)
將行列最小、最大縮放比例均改為1.0,此時(shí)等效于使用find_shape_model算子(查找時(shí)間也幾乎一樣)。此時(shí)查找時(shí)間為:14毫秒。
實(shí)測(cè)可以發(fā)現(xiàn),ScaleMin、ScaleMax這兩個(gè)參數(shù)越接近1,查找所需的時(shí)間越短。其實(shí)也很好理解,當(dāng)縮放比例變化范圍較大時(shí),準(zhǔn)確的模板匹配需要進(jìn)行更多的嘗試,自然會(huì)需要更長(zhǎng)的計(jì)算時(shí)間。
④ find_scaled_shape_model (Image, ModelID, rad(-10), rad(20), 0.97, 1.03, 0.3, 1, 0.5, 'least_squares', [4,1], 0.75, Row, Column, Angle, Scale, Score)
將搜索的起始角度設(shè)置為rad(-10), 角度范圍設(shè)置為rad(20),即 [rad(-10), rad(10)] ,此時(shí)查找時(shí)間為:6毫秒!
可見選擇合適的搜索起始角度和角度范圍,可以大幅度提高查找速度。
實(shí)驗(yàn)總結(jié):如果想減少模板查找時(shí)間,需要?jiǎng)?chuàng)建輪廓XLD不那么復(fù)雜的模板,需要設(shè)置較小的角度范圍,需要設(shè)置盡可能小的行列縮放比例,需要設(shè)置盡可能大的金字塔層級(jí)。
但是,金字塔層級(jí)不宜設(shè)置過大,金字塔層級(jí)太大時(shí),很容易查找模板失敗。
另外,還有兩篇文章對(duì)模板匹配有一些經(jīng)驗(yàn)總結(jié),我貼過來:
http://www.rzrgm.cn/bile/p/8528843.html
https://blog.csdn.net/ABC13222880223/article/details/94437545
基于形狀匹配的參數(shù)關(guān)系與優(yōu)化
這里主要是重復(fù)說明一下這些參數(shù)的作用,再強(qiáng)調(diào)一下它們影響匹配速度的程度;在為了提高速度而設(shè)置參數(shù)之前,有必要找出那些在所有測(cè)試圖像中匹配成功的設(shè)置,這時(shí)需考慮以下情況:
① 必須保證物體在圖像邊緣處截?cái)啵簿褪潜WC輪廓的清晰,這些可以通過形態(tài)學(xué)的一些方法來處理;
② 如果Greediness值設(shè)的太高,就找不到其中一些可見物體,這時(shí)最后將其設(shè)為0來執(zhí)行完全搜索;
③ 物體是否有封閉區(qū)域,如果要求物體在任何狀態(tài)下都能被識(shí)別,則應(yīng)減小MinScore值;
④ 判斷在金字塔最高級(jí)上的匹配是否失敗,可以通過find_shape_model()減小NumLevels值來測(cè)試;
⑤ 物體是否具有較低的對(duì)比度,如果要求物體在任何狀態(tài)下都能被識(shí)別,則應(yīng)減小MinContrast值;
⑥ 判斷是否全局地或者局部地轉(zhuǎn)化對(duì)比度極性,如果需要在任何狀態(tài)下都能被識(shí)別,則應(yīng)給參數(shù)Metric設(shè)置一個(gè)合適的值;
⑦ 物體是否與物體的其他實(shí)例重疊,如果需要在任何狀態(tài)下都能識(shí)別物體,則應(yīng)增加MaxOverlap值;
⑧ 判斷是否在相同物體上找到多個(gè)匹配值,如果物體幾乎是對(duì)稱的,則需要控制旋轉(zhuǎn)范圍。
如何加快搜索匹配,需要在這些參數(shù)中進(jìn)行合理的搭配,有以下方法可以參考:
① 只要匹配成功,則盡可能增加參數(shù)MinScore的值;
② 增加Greediness值直到匹配失敗,同時(shí)在需要時(shí)減小MinScore值;
③ 如果有可能,在創(chuàng)建模板時(shí)使用一個(gè)大的NumLevels,即將圖像多分幾個(gè)金字塔級(jí);
④ 限定允許的旋轉(zhuǎn)范圍和大小范圍,在調(diào)用find_shape_model()時(shí)調(diào)整相應(yīng)的參數(shù);
⑤ 盡量限定搜索ROI的區(qū)域。
除上面介紹的以外,在保證能夠匹配的情況下,盡可能的增大Greediness的值,因?yàn)樵诤竺娴膶?shí)驗(yàn)中,用模板匹配進(jìn)行視頻對(duì)象跟蹤的過程中,這個(gè)值在很大程度上影響到匹配的速度。
當(dāng)然這些方法都需要跟實(shí)際聯(lián)系起來,不同圖像在匹配過程中也會(huì)有不同的匹配效果,在具體到某些應(yīng)用,不同的硬件設(shè)施也會(huì)對(duì)這個(gè)匹配算法提出新的要求,所以需要不斷地去嘗試。
--------------------------------------------
本文系原創(chuàng),轉(zhuǎn)載請(qǐng)注明出處。
如果文章對(duì)您有幫助,可以點(diǎn)擊下方的【好文要頂】或【關(guān)注我】;如果您想進(jìn)一步表示感謝,可通過網(wǎng)頁右側(cè)的【打賞】功能進(jìn)行打賞。
感謝您的支持,我會(huì)繼續(xù)寫出更多的相關(guān)文章!文章有不理解的地方歡迎跟帖交流,博主經(jīng)常在線!^_^
浙公網(wǎng)安備 33010602011771號(hào)