1. 程式人生 > 其它 >模板匹配 - 引數詳解

模板匹配 - 引數詳解

下面幾篇部落格記錄,來自https://libaineu2004.blog.csdn.net/article/details/102829030部落格摘抄,首先感謝這位博主經驗之談,感覺很有用,並後續記錄下來。

1. Shape-Based matching的基本流程

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

  • 首先確定出ROI的矩形區域,這裡只需要確定矩形的左上點和右下點的座標即可,gen_rectangle1()這個函式就會幫助你生成一個矩形,利用area_center()找到這個矩形的中心;
  • 然後需要從影象中獲取這個矩形區域的影象,reduce_domain()會得到這個ROI;這之後就可以對這個矩形建立模板,而在建立模板之前,可以先對這個區域進行一些處理,方便以後的建模,比如閾值分割,數學形態學的一些處理等等;
  •  
  • 接下來就可以利用create_shape_model()來建立模板了,這個函式有許多引數,其中金字塔的級數由Numlevels指定,值越大則找到物體的時間越少,AngleStart角度起始值和AngleExtent是角度的旋轉範圍,AngleStep指定角度範圍搜尋的步長;這裡需要提醒的是,在任何情況下,模板應適合主記憶體,搜尋時間會縮短。對特別大的模板,用Optimization來減少模板點的數量是很有用的;MinConstrast將模板從影象的噪聲中分離出來,如果灰度值的波動範圍是10,則MinConstrast應當設為10;Metric引數決定模板識別的條件,如果設為’use_polarity’,則影象中的物體和模板必須有相同的對比度;建立好模板後,這時還需要監視模板,用inspect_shape_model()來完成,它檢查引數的適用性,還能幫助找到合適的引數;另外,還需要獲得這個模板的輪廓,用於後面的匹配,get_shape_model_contours()則會很容易的幫我們找到模板的輪廓;
  • 建立好模板後,就可以開啟另一幅影象,來進行模板匹配了。這個過程也就是在新影象中尋找與模板匹配的影象部分,這部分的工作就由函式find_shape_model()來承擔了,它也擁有許多的引數,這些引數都影響著尋找模板的速度和精度。這個的功能就是在一幅圖中找出最佳匹配的模板,返回一個模板例項的長、寬和旋轉角度。其中引數SubPixel決定是否精確到亞畫素級,設為’interpolation’,則會精確到,這個模式不會佔用太多時間,若需要更精確,則可設為’least_square’,’lease_square_high’,但這樣會增加額外的時間,因此,這需要在時間和精度上作個折中,需要和實際聯絡起來。比較重要的兩個引數是MinSocre和Greediness,前一個用來分析模板的旋轉對稱和它們之間的相似度,值越大,則越相似,後一個是搜尋貪婪度,這個值在很大程度上影響著搜尋速度,若為0,則為啟發式搜尋,很耗時,若為1,則為不安全搜尋,但最快。在大多數情況下,在能夠匹配的情況下,儘可能的增大其值。
  • 找到之後,還需要對其進行轉化,使之能夠顯示,這兩個函式vector_angle_to_rigid()和affine_trans_contour_xld()在這裡就起這個作用。前一個是從一個點和角度計算一個剛體仿射變換,這個函式從匹配函式的結果中對構造一個剛體仿射變換很有用,把參考影象變為當前影象。
  • Optimization(優化):定義模板定位時使用的特徵點的數量,在模板資料量大時有必要降低資料量(point_reduction_high),以提高定位速度,預設為auto;
  • Metric:匹配極性引數,ignore_globle_polarity可以為目標與模板極性完全相反(globle的);ignore_local_polarity為允許部分極性相反;ignore_color_polarity用在單通道影象上效果與ignore_local_polarity效果相同,use_polarity與ignore_globle_polarity僅能用在亞畫素精度上;ignore_part_polarity允許不同極性部分之間的變化,極性相同的部分內部不得改變,應是包含ignore_globle_polarity;If Metric = 'use_polarity', the object in the image and the model must have the same contrast. 如果使用use_polarity,影象中的物件和模型必須具有相同的對比度。
  • ParamName與ParamValue:設定引數名稱與值,預設為空;part_size為目標所組成輪廓的大小,參考可能為目標整體的大小與細節的複雜度,一般不需要使用;
  • Greediness:啟發式搜尋啟用等級,0最高但速度慢,1最快但可能會錯漏;
  • ResultType:顯示結果圖形,image_rectified為校正後圖形,rector_field為網格線顯示,deformed_contours為變形輪廓。

2. 基於形狀匹配的引數關係與優化

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

       在為了提高速度而設定引數之前,有必要找出那些在所有測試影象中匹配成功的設定,這時需考慮以下情況:

  •  必須保證物體在影象邊緣處截斷,也就是保證輪廓的清晰,這些可以通過形態學的一些方法來處理;
  •  如果Greediness值設的太高,就找不到其中一些可見物體,這時最後將其設為0來執行完全搜尋;
  • 物體是否有封閉區域,如果要求物體在任何狀態下都能被識別,則應減小MinScore值;
  •  判斷在金字塔最高階上的匹配是否失敗,可以通過find_shape_model()減小NumLevels值來測試;
  •  物體是否具有較低的對比度,如果要求物體在任何狀態下都能被識別,則應減小MinContrast值;
  •  判斷是否全域性地或者區域性地轉化對比度極性,如果需要在任何狀態下都能被識別,則應給引數Metric設定一個合適的值;
  •  物體是否與物體的其他例項重疊,如果需要在任何狀態下都能識別物體,則應增加MaxOverlap值;
  • 判斷是否在相同物體上找到多個匹配值,如果物體幾乎是對稱的,則需要控制旋轉範圍;

       如何加快搜索匹配,需要在這些引數中進行合理的搭配,有以下方法可以參考:

① 只要匹配成功,則儘可能增加引數MinScore的值;

② 增加Greediness值直到匹配失敗,同時在需要時減小MinScore值;

③ 如果有可能,在建立模板時使用一個大的NumLevels,即將影象多分幾個金字塔級;

④ 限定允許的旋轉範圍和大小範圍,在呼叫find_shape_model()時調整相應的引數;

⑤ 儘量限定搜尋ROI的區域;

除上面介紹的以外,在保證能夠匹配的情況下,儘可能的增大Greediness的值,因為在後面的實驗中,用模板匹配進行視訊物件跟蹤的過程中,這個值在很大程度上影響到匹配的速度。

當然這些方法都需要跟實際聯絡起來,不同影象在匹配過程中也會有不同的匹配效果,在具體到某些應用,不同的硬體設施也會對這個匹配演算法提出新的要求,所以需要不斷地去嘗試。在接下來我會結合自己做的具體的實驗來如何利用HALCON來進行實驗,主要是在視訊物件分割和視訊物件的跟蹤方面。

進一步分析:

  • NumLevels越大,找到匹配使用的時間就越小。另外必須保證最高層的影象具有足夠的資訊(至少四個點)。可以通過inspect_shape_model函式檢視設定的結果。如果最高層金字塔的資訊太少,演算法內部會自動減少金字塔層數,如果最底層金字塔的資訊太少,函式就會報錯。如果設為auto,演算法會自動計算金字塔的層數,我們可以通過get_shape_model_params函式檢視金字塔的層數。如果金字塔的層數太大,模板不容易識別出來,這時需要將find_shape_model函式中MinScore和Greediness引數設定的低一些。如果金字塔層數太少找到模板的時間會增加。可以先使用inspect_shape_model函式的輸出結果來選擇一個較好的金字塔層數。
  • 引數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函式執行時,該模型必須轉化為不同的角度和尺度在執行時在。正因為如此,匹配該模型可能需要更多的時間。
  • 對於特別大的模板影象,將引數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設定成一個較低的 值(相似度)。此外,在兩個模型中插值法獲得的位置可能略有不同。如果希望是最高精確度,應該使用最小二乘調整得到模型位置。
  • 引數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函式檢查效果。
  • MinContrast用來確定在執行find_shape_model函式進行識別時模型的哪一個對比度必須存在,也就是說,這個引數將模型從噪聲影象中分離出來。因此一個好的選擇應該是在影象中噪聲所引起的灰度變化範圍。例如,如果灰度浮動在10個灰度級內,MinContrast應該設定成10。如果模板和搜尋影象是多通道影象,Metric引數設定成'ignore_color_polarity',在一個通道中的噪聲必須乘以通道個數的平方根再去設定MinContrast。例如,如果灰度值在一個通道的浮動範圍是10個灰度級,影象是三通道的,那麼MinContrast應該設定為17。很顯然,MinContrast 必須小於Contrast。如果要在對比度較低的影象中識別模板,MinContrast必須設定為一個相對較小的數值。如果要是模板即使嚴重遮擋(occluded)也能識別出來,MinContrast應該設定成一個比噪聲引起的灰度浮動範圍略大的數值,這樣才能確保在find_shape_model函式中提取出模板準確的位置和旋轉角度。如果MinContrast設定為'auto',最小對比度會基於模板影象中的噪聲自動定義。因此自動設定僅僅在搜尋影象和模板影象噪聲近似時才可以使用。此外,在某些情況下為了遮擋的魯棒性,採用自動設定數值是比較好的。使用get_shape_model_params函式可以查詢自動計算的最小對比度。
  • 引數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'是完全相同的。
  • 當Metric='ignore_color_polarity' 時,create_shape_model建立的模板通道數目和find_shape_model中的影象通道數目可以是不同的。例如,可以使用綜合生成的單通道影象建立模型。另外,這些通道不需要是經過光譜細分(像RGB影象)的。這些通道還可以包括具有在不同方向照亮同一個目標所獲得的影象。
  • 模型影象Template的domain區域的重心是模板的初始位置,可以在set_shape_model_origin函式中設定不同的初始位置。
  • 首先確定出ROI的矩形區域,這裡只需要確定矩形的左上點和右下點的座標即可,gen_rectangle1()這個函式就會幫助你生成一個矩形,利用area_center()找到這個矩形的中心。