Halcon模版匹配算子解析

create_shape_model(
Template : : //reduce_domain後的模板圖像
NumLevels,//金字塔的層數,可設爲“auto”或0—10的整數

AngleStart,//模板旋轉的起始角度

AngleExtent,//模板旋轉角度範圍, >=0

AngleStep,//旋轉角度的步長, >=0 and <=pi/16

Optimization,//設置模板優化和模板創建方法

Metric, //匹配方法設置

Contrast,//設置對比度

MinContrast ://設置最小對比度

ModelID ) //輸出模板句柄

 

1. NumLevels越大,找到匹配使用的時間就越小。另外必須保證最高層的圖像具有足夠的信息(至少四個點)。可以通過inspect_shape_model函數查看設置的結果。如果最高層金字塔的消息太少,算法內部會自動減少金字塔層數,如果最底層金字塔的信息太少,函數就會報錯。如果設爲auto,算法會自動計算金字塔的層數,我們可以通過get_shape_model_params函數查看金字塔的層數。如果金字塔的層數太大,模板不容易識別出來,這是需要將find_shape_model函數中MinScore和Greediness參數設置的低一些。如果金字塔層數太少找到模板的時間會增加。可以先使用inspect_shape_model函數的輸出結果來選擇一個較好的金字塔層數。

 

2. 參數AngleStart、AngleExtent定義了模板可能發生旋轉的範圍。注意模板在find_shape_model函數中只能找到這個範圍內的匹配。參數AngleStep定義了旋轉角度範圍內的步長。如果在find_shape_model函數中沒有指定亞像素精度,這個參數指定的精度是可以實現find_shape_mode函數中的角度的。參數AngleStep的選擇是基於目標的大小的,如果模板圖像太小不能產生許多不同離散角度的圖像,因此對於較小的模板圖像AngleStep應該設置的比較大。如果AngleExtent不是AngleStep的整數倍, 將會相應的修改AngleStep。

    如果選擇 complete pregeneration ,不同角度的模板圖像將會產生並保存在內存中。用來存儲模板的內存與旋轉角度的數目和模板圖像的的點數是成正比的。因此,如果AngleStep太小或是AngleExtent太大, 將會出現該模型不再適合(虛擬)內存的情況。在任何情況下,模型是完全適合主存儲器的,因爲這避免了操作系統的內存分頁,使得尋找匹配模板的時間變短。由於find_shape_model函數中的角度可以使用亞像素精度,一個直徑小於200像素的模板可以選擇AngleStep>= 1. 如果選擇AngleStep='auto' (or 0 向後兼容),create_shape_model將會基於模板的大小自動定義一個合適的角度步長. 自動計算出來的AngleStep可以使用get_shape_model_params函數查看。

    如果沒有選擇complete pregeneration, 該模型會在每一層金字塔上建立在一個參考的位置。這樣在find_shape_model函數運行時,該模型必須轉化爲不同的角度和尺度在運行時在。正因爲如此,匹配該模型可能需要更多的時間。

 

3. 對於特別大的模板圖像,將參數Optimization設置爲不同於'none'的其他數值是非常有用的。如果Optimization= 'none', 所有的模型點將要存儲。在其他情況下, 按照Optimization的數值會將模型的點數減少. 如果模型點數變少了,必須在find_shape_model函數中將參數Greediness設爲一個比較小的值, 比如:0.7、0.8。對於比較小的模型, 減少模型點數並不能提高搜索速度,因爲這種情況下通常顯着更多的潛在情況的模型必須進行檢查。如果Optimization設置爲'auto', create_shape_model自動確定模型的點數。

Optimization的第二個值定義了模型是否進行預處理(pregenerated completely),是通過選擇'pregeneration'或者'no_pregeneration'來設置的。如果不使用第二個值(例如:僅僅設置了第一個值), 默認的是系統中的設置,是通過set_system('pregenerate _shape_models',...)來設置的,對於默認值是 ('pregenerate_shape_models' = 'false'), 模型沒有進行預處理. 模型的預處理設置通常會導致比較低的運行時間,因爲模型不需要在運行時間時轉換。然而在這種情況下,內存的要求和創建模板所需要的時間是比較高的。還應該指出,不能指望這兩個模式返回完全相同的結果,因爲在運行時變換一定會導致變換模型和預處理變換模型之間不同的內部數據。比如,如果模型沒有 completely pregenerated,在find_shape_model函數中通常返回一個較低的scores,這可能需要將MinScore設置成一個較低的值。此外,在兩個模型中插值法獲得的位置可能略有不同。如果希望是最高精確度,應該使用最小二乘調整得到模型位置。

 

4. 參數Contras決定着模型點的對比度。對比度是用來測量目標與背景之間和目標不同部分之間局部的灰度值差異。Contrast的選擇應該確保模板中的主要特徵用於模型中。Contrast也可以是兩個數值,這時模板使用近似edges_image函數中滯後閾值的算法進行分割。這裏第一個數值是比較低的閾值,第二個數值是比較高的閾值。Contrast也可以包含第三個,這個數值是在基於組件尺寸選擇重要模型組件時所設置的閾值,比如,比指定的最小尺寸的點數還少的組件將被抑制。這個最小尺寸的閾值會在每相鄰的金字塔層之間除以2。如果一個小的模型組件被抑制,但是不使用滯後閾值,然而在Contrast中必須指定三個數值,在這種情況下前兩個數值設置成相同的數值。這個參數的設置可以在inspect_shape_model函數中查看效果。如果Contrast設置爲'auto',create_shape_model將會自動確定三個上面描述的數值。或者僅僅自動設置對比度('auto_contrast'),滯後閾值('auto_contrast_hyst')或是最小尺寸('auto_min_size')中一個。其他沒有自動設置的數值可以按照上面的格式再進行設置。可以允許各種組合,例如:如果設置 ['auto_contrast','auto_min_size'],對比度和最小尺寸自動確定;如果設置 ['auto_min_size',20,30],最小尺寸會自動設定,而滯後閾值被設爲20和30。有時候可能對比度閾值自動設置的結果是不滿意的,例如,由於一些具體應用的原因當某一個模型組件是被包含或是被抑制時,或是目標包含幾種不同的對比度時,手動設置這些參數效果會更好。因此對比度閾值可以使用determine_shape_model_params函數自動確定,也可以在調用create_shape_model之前使用inspect_shape_mode函數檢查效果。

 

5. 參數Metric定義了在圖像中匹配模板的條件。如果Metric= 'use_polarity',圖像中的目標必須和模型具有一樣的對比度。例如,如果模型是一個亮的目標在一個暗的背景上,那麼僅僅那些比背景亮的目標可以找到。如果Metric= 'ignore_global_polarity',在兩者對比度完全相反時也能找到目標。在上面的例子中,如果目標是比背景暗的也能將目標找到。find_shape_model函數的運行時間在這種情況下將會略微增加。如果Metric= 'ignore_local_polarity', 即使局部對比度改變也能找到模型。例如,當目標包含一部分中等灰度,並且其中部分比較亮部分比較暗時,這種模式是非常有用的。由於這種模式下find_shape_model函數的運行時間顯著增加,最好的方法是使用create_shape_model創建幾個反映目標可能的對比度變化的模型,同時使用find_shape_models去匹配他們。上面三個metrics僅僅適用於單通道圖像。如果是多通道圖像作爲模板圖像或搜索圖像,僅僅第一個通道被使用。如果Metric='ignore_color_polarity', 即使顏色對比度局部變化也能找到模型。例如,當目標的部分區域顏色發生變化(e.g.從紅到綠)的情況。如果不能提前知道目標在哪一個通道是可見的這種模式是非常有用的。在這種情況下find_shape_model函數的運行時間也會急劇增加。'ignore_color_polarity'可以使用於具有任意通道數目的圖像中。如果使用於單通道圖像,他的效果和'ignore_loc al_polarity'是完全相同的。

 

6. create_shape_model創建的模板通道數目和find_shape_model中的圖像通道數目可以是不同的。例如,可以使用綜合生成的單通道圖像創建模型。另外,這些通道不需要是經過光譜細分(像RGB圖像)的。這些通道還可以包括具有在不同方向照亮同一個目標所獲得的圖像。

 

7. 模型圖像Template的domain區域的重心是模板的初始位置,可以在set_shape_model_origin函數中設置不同的初始位置。

 

 

find_shape_model(

Image : : //搜索圖像

ModelID, //模板句柄

AngleStart, // 搜索時的起始角度

AngleExtent, //搜索時的角度範圍,必須與創建模板時的有交集

MinScore, //最小匹配值,輸出的匹配的得分Score 大於該值

NumMatches, //定義要輸出的匹配的最大個數

MaxOverlap, //當找到的目標存在重疊時,且重疊大於該值時選擇一個好的輸出

SubPixel, //計算精度的設置,五種模式,多選2,3

NumLevels, //搜索時金字塔的層數

Greediness : //貪婪度,搜索啓發式,一般都設爲0.9,越高速度快,容易出現找不到的情況

Row, Column, Angle, Score) //輸出匹配位置的行和列座標、角度、得分。

 


注意:

1. Row、Column的座標並不是模板在搜索圖像中的精確位置,因此不能直接使用他們。這些數值是爲了創建變換矩陣被優化後的,你可以用這個矩陣的匹配結果完成各種任務,比如調整後續步驟的ROI。

 

2. Score是一個0到1之間的數,是模板在搜索圖像中可見比例的近似測量。如果模板的一半被遮擋,該值就不能超過0.5。

 

3. Image的domain定義了模型參考點的搜索區域,模型參考點是在create_shape_model中用來創建模型的圖像的domain區域的重心。不考慮使用函數set_shape_model_origin設置不同的初始位置。在圖像domain區域的這些點內搜索模型,其中模型完全屬於這幅圖像。這意味着如果模型超出圖像邊界,即使獲得的質量係數(score)大於MinScore也不能找到模型。這種性能可以通過set_system('border_shape_models','true')改變,這樣那些超出圖像邊界,質量係數大於MinScore的模型也能找到。這時那些在圖像外面的點看作是被遮擋了,可以降低質量係數。在這種模式下搜索的時間將要增加。

 

4. 參數AngleStart和AngleExtent確定了模型搜索的旋轉角度,如果有必要,旋轉的範圍會被截取成爲create_shape_model函數中給定的旋轉範圍。這意味着創建模型和搜索時的角度範圍必須真正的重疊。在搜索時的角度範圍不會改變爲模2*pi的。爲了簡化介紹,在該段落剩下的部分所有角度都用度來表示,而在find_shape_model函數中使用弧度來設置的。因此,如果創建模板時,AngleStart=-20°、AngleExtent=40°,在搜索模板函數find_shape_model中設置AngleStart=350°、AngleExtent=20°,儘管角度模360後是重疊的,還是會找不到模板的。爲了找到模板,在這個例子中必須將AngleStart=350°改爲AngleStart=-10°。

 

5. 參數MinScore定義模板匹配時至少有個什麼樣的質量係數纔算是在圖像中找到模板。MinScore設置的越大,搜索的就越快。如果模板在圖像中沒有被遮擋,MinScore可以設置爲0.8這麼高甚至0.9。

 

6. NumMatches定義了在圖像上找到模板的最大的個數。如果匹配時的質量係數大於MinScore的目標個數多於NumMatches,僅僅返回質量係數最好的NumMatches個目標位置。如果找的匹配目標不足NumMatches,那麼就只返回找到的這幾個。參數MinScore優於NumMatches。

 

7. 如果模型具有對稱性,會在搜索圖像的同一位置和不同角度上找到多個與目標匹配的區域。參數MaxOverlap是0到1之間的,定義了找到的兩個目標區域最多重疊的係數,以便於把他們作爲兩個不同的目標區域分別返回。如果找到的兩個目標區域彼此重疊並且大於MaxOverlap,僅僅返回效果最好的一個。重疊的計算方法是基於找到的目標區域的任意方向的最小外接矩形(看smallest_rectangle2)。如果MaxOverlap=0, 找到的目標區域不能存在重疊, 如果MaxOverla p=1,所有找到的目標區域都要返回。

 

8. SubPixel確定找到的目標是否使用亞像素精度提取。如果SubPixel設置爲'none'(或者'false' 背景兼容),模型的位置僅僅是一個像素精度和在create_shape_model中定義的角度分辨率。如果SubPixel設置爲'interpo lation'(或'true'),位置和角度都是亞像素精度的。在這種模式下模型的位置是在質量係數函數中插入的,這種模式幾乎不花費計算時間,並且能達到足夠高的精度,被廣泛使用。然而在一些精度要求極高的應用中,模板的位置應該通過最小二乘調整決定,比如通過最小化模板點到相關圖像點的距離。與 'interpolation'相比,這種模式需要額外的計算時間。對於最小二乘調整的模式有:'least_squares', 'least_squares_high', 和'least_squares_very_high'。他們可用來定義被搜索的最小距離的精度,選擇的精度越高,亞像素提取的時間越長。然而,通常SubPixel設置爲'interpolation'。如果希望設置最小二乘就選擇'least_squares',因爲這樣才能確保運行時間和精度的權衡。

 

9. NumLevels是在搜索時使用的金字塔層數,如有必要,層數截成創建模型時的範圍。如果NumLevels=0,使用創建模板時金字塔的層數。另外NumLevels還可以包含第二個參數,這個參數定義了找到匹配模板的最低金字塔層數。NumLevels=[4,2]表示匹配在第四層金字塔開始,在第二層金字塔找到匹配(最低的設爲1)。可以使用這種方法降低匹配的運行時間,但是這種模式下位置精度是比正常模式下低的,所謂正常模式是在金字塔最底層匹配。因此如果需要較高的精度,應該設置SubPixel至少爲'least_squares'。如果金字塔最底層設置的過大,可能不會達到期望的精度,或者找到一個不正確的匹配區域。這是因爲在較高層的金字塔上模板是不夠具體的,不足以找到可靠的模板最佳匹配。在這種情況下最低金字塔層數應設爲最小值。

 

10. 參數Greediness確定在搜索時的“貪婪程度”。如果Greediness=0,使用一個安全的搜索啓發式,只要模板在圖像中存在就一定能找到模板,然而這種方式下搜索是相對浪費時間的。如果Greediness=1,使用不安全的搜索啓發式,這樣即使模板存在於圖像中,也有可能找不到模板,但只是少數情況。如果設置Greediness=0.9,在幾乎所有的情況下,總能找到模型的匹配。

 

 

    前面主要介紹了匹配的2個主要的算子,對這兩個算子瞭解後,我們就可以做匹配了。下面是轉自一位前輩的經驗總結,對我們很有幫助。

    到這裏匹配就結束了,但是我們僅僅完成了初步的工作,後面我們還要對其做一定的變換,完成實際項目的具體應用。

 

(轉自基於HALCON的模板匹配方法總結--藍雲楊的機器視覺之路)

 

Shape-Based matching的基本流程

 

    HALCON提供的基於形狀匹配的算法主要是針對感興趣的小區域來建立模板,對整個圖像建立模板也可以,但這樣除非是對象在整個圖像中所佔比例很大,比如像視頻會議中人體上半身這樣的圖像,我在後面的視頻對象跟蹤實驗中就是針對整個圖像的,這往往也是要犧牲匹配速度的,這個後面再講。基本流程是這樣的,如下所示:


1. 首先確定出ROI的矩形區域,這裏只需要確定矩形的左上點和右下點的座標即可,gen_rectangle1()這個函數就會幫助你生成一個矩形,利用area_center()找到這個矩形的中心;


2. 然後需要從圖像中獲取這個矩形區域的圖像,reduce_domain()會得到這個ROI;這之後就可以對這個矩形建立模板,而在建立模板之前,可以先對這個區域進行一些處理,方便以後的建模,比如閾值分割,數學形態學的一些處理等等;

 

3. 接下來就可以利用create_shape_model()來創建模板了,這個函數有許多參數,其中金字塔的級數由Numlevels指定,值越大則找到物體的時間越少,AngleStart和AngleExtent決定可能的旋轉範圍,AngleStep指定角度範圍搜索的步長;這裏需要提醒的是,在任何情況下,模板應適合主內存,搜索時間會縮短。對特別大的模板,用Optimization來減少模板點的數量是很有用的;MinConstrast將模板從圖像的噪聲中分離出來,如果灰度值的波動範圍是10,則MinConstrast應當設爲10;Metric參數決定模板識別的條件,如果設爲’use_polarity’,則圖像中的物體和模板必須有相同的對比度;創建好模板後,這時還需要監視模板,用inspect_shape_model()來完成,它檢查參數的適用性,還能幫助找到合適的參數;另外,還需要獲得這個模板的輪廓,用於後面的匹配,get_shape_model_contours()則會很容易的幫我們找到模板的輪廓;


4. 創建好模板後,就可以打開另一幅圖像,來進行模板匹配了。這個過程也就是在新圖像中尋找與模板匹配的圖像部分,這部分的工作就由函數find_shape_model()來承擔了,它也擁有許多的參數,這些參數都影響着尋找模板的速度和精度。這個的功能就是在一幅圖中找出最佳匹配的模板,返回一個模板實例的長、寬和旋轉角度。其中參數SubPixel決定是否精確到亞像素級,設爲’interpolation’,則會精確到,這個模式不會佔用太多時間,若需要更精確,則可設爲’least_square’,’lease_square_high’,但這樣會增加額外的時間,因此,這需要在時間和精度上作個折中,需要和實際聯繫起來。比較重要的兩個參數是MinSocre和Greediness,前一個用來分析模板的旋轉對稱和它們之間的相似度,值越大,則越相似,後一個是搜索貪婪度,這個值在很大程度上影響着搜索速度,若爲0,則爲啓發式搜索,很耗時,若爲1,則爲不安全搜索,但最快。在大多數情況下,在能夠匹配的情況下,儘可能的增大其值。


5. 找到之後,還需要對其進行轉化,使之能夠顯示,這兩個函數vector_angle_to_rigid()和affine_trans_contour_xld()在這裏就起這個作用。前一個是從一個點和角度計算一個剛體仿射變換,這個函數從匹配函數的結果中對構造一個剛體仿射變換很有用,把參考圖像變爲當前圖像。

 


基於形狀匹配的參數關係與優化

 

    在HALCON的說明資料裏講到了這些參數的作用以及關係,在上面提到的文章中也作了介紹,這裏主要是重複說明一下這些參數的作用,再強調一下它們影響匹配速度的程度;


在爲了提高速度而設置參數之前,有必要找出那些在所有測試圖像中匹配成功的設置,這時需考慮以下情況:
① 必須保證物體在圖像邊緣處截斷,也就是保證輪廓的清晰,這些可以通過形態學的一些方法來處理;
② 如果Greediness值設的太高,就找不到其中一些可見物體,這時最後將其設爲0來執行完全搜索;
③ 物體是否有封閉區域,如果要求物體在任何狀態下都能被識別,則應減小MinScore值;
④ 判斷在金字塔最高級上的匹配是否失敗,可以通過find_shape_model()減小NumLevels值來測試;
⑤ 物體是否具有較低的對比度,如果要求物體在任何狀態下都能被識別,則應減小MinContrast值;
⑥ 判斷是否全局地或者局部地轉化對比度極性,如果需要在任何狀態下都能被識別,則應給參數Metric設置一個合適的值;
⑦ 物體是否與物體的其他實例重疊,如果需要在任何狀態下都能識別物體,則應增加MaxOverlap值;
⑧ 判斷是否在相同物體上找到多個匹配值,如果物體幾乎是對稱的,則需要控制旋轉範圍;


如何加快搜索匹配,需要在這些參數中進行合理的搭配,有以下方法可以參考:
① 只要匹配成功,則儘可能增加參數MinScore的值;
② 增加Greediness值直到匹配失敗,同時在需要時減小MinScore值;
③ 如果有可能,在創建模板時使用一個大的NumLevels,即將圖像多分幾個金字塔級;
④ 限定允許的旋轉範圍和大小範圍,在調用find_shape_model()時調整相應的參數;
⑤ 儘量限定搜索ROI的區域;
除上面介紹的以外,在保證能夠匹配的情況下,儘可能的增大Greediness的值,因爲在後面的實驗中,用模板匹配進行視頻對象跟蹤的過程中,這個值在很大程度上影響到匹配的速度。
當然這些方法都需要跟實際聯繫起來,不同圖像在匹配過程中也會有不同的匹配效果,在具體到某些應用,不同的硬件設施也會對這個匹配算法提出新的要求,所以需要不斷地去嘗試。

 

原文地址:http://blog.sina.com.cn/59f93a690100an3g

發佈了36 篇原創文章 · 獲贊 17 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章