halcon學習之模板匹配

基於HALCON的模板匹配方法總結
 
   德國MVTec公司開發的HALCON機器視覺開發軟件,提供了許多的功能,在這裏我主要學習和研究了其中的形狀匹配的算法和流程。HDevelop開發環境中提供的匹配的方法主要有三種,即Component-Based、Gray-Value-Based、Shape-Based,分 別是基於組件(或成分、元素)的匹配,基於灰度值的匹配和基於形狀的匹配。這三種匹配的方法各具特點,分別適用於不同的圖像特徵,但都有創建模板和尋找模 板的相同過程。這三種方法裏面,我主要就第三種-基於形狀的匹配,做了許多的實驗,因此也做了基於形狀匹配的物體識別,基於形狀匹配的視頻對象分割和基於 形狀匹配的視頻對象跟蹤這些研究,從中取得較好的效果,簡化了用其他工具,比如VC++來開發的過程。在VC下往往針對不同的圖像格式,就會弄的很頭疼,更不用說編寫圖像特徵提取、模板建立和搜尋模板的代碼呢,我想其中間過程會很複雜,效果也不一定會顯著。下面我就具體地談談基於HALCON的形狀匹配算法的研究和心得總結。
   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()在這裏就起這個作用。前一個是從一個點和角度計算一個剛體仿射變換,這個函數從匹配函數的結果中對構造一個剛體仿射變換很有用,把參考圖像變爲當前圖像。
其詳細的流程圖和中間參數,如下圖所示:(無法上傳)
   2.基於形狀匹配的參數關係與優化
     在HALCON的說明資料裏講到了這些參數的作用以及關係,在上面提到的文章中也作了介紹,這裏主要是重複說明一下這些參數的作用,再強調一下它們影響匹配速度的程度;
在爲了提高速度而設置參數之前,有必要找出那些在所有測試圖像中匹配成功的設置,這時需考慮以下情況:
   ①必須保證物體在圖像邊緣處截斷,也就是保證輪廓的清晰,這些可以通過形態學的一些方法來處理;
   ②如果Greediness值設的太高,就找不到其中一些可見物體,這時最後將其設爲0來執行完全搜索;
   ③物體是否有封閉區域,如果要求物體在任何狀態下都能被識別,則應減小MinScore值;
   ④判斷在金字塔最高級上的匹配是否失敗,可以通過find_shape_model()減小NumLevels值來測試;
   ⑤物體是否具有較低的對比度,如果要求物體在任何狀態下都能被識別,則應減小MinContrast值;
   ⑥判斷是否全局地或者局部地轉化對比度極性,如果需要在任何狀態下都能被識別,則應給參數Metric設置一個合適的值;
   ⑦物體是否與物體的其他實例重疊,如果需要在任何狀態下都能識別物體,則應增加MaxOverlap值;
   ⑧判斷是否在相同物體上找到多個匹配值,如果物體幾乎是對稱的,則需要控制旋轉範圍;
如何加快搜索匹配,需要在這些參數中進行合理的搭配,有以下方法可以參考:
   ①只要匹配成功,則儘可能增加參數MinScore的值;
   ②增加Greediness值直到匹配失敗,同時在需要時減小MinScore值;
   ③如果有可能,在創建模板時使用一個大的NumLevels,即將圖像多分幾個金字塔級;
   ④限定允許的旋轉範圍和大小範圍,在調用find_shape_model()時調整相應的參數;
   ⑤儘量限定搜索ROI的區域;
除上面介紹的以外,在保證能夠匹配的情況下,儘可能的增大Greediness的值,因爲在後面的實驗中,用模板匹配進行視頻對象跟蹤的過程中,這個值在很大程度上影響到匹配的速度。

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


[cpp] view plain copy
  1. //創建模板參數,帶“*”影響模板匹配速度,多則速度影響較大  
  2. typedef struct _pCreatModel  
  3. {  
  4.     int iNumLevel;      //****金字塔級數(該值越大匹配耗時越短)  
  5.     //模板角度,一般根據對稱性來進行設置,若模板圖像不對稱需設幅度爲360度,若爲正方形,可設幅度爲90度,長方形爲180度  
  6.     float fPhiStart;    //起始角度(弧度,範圍-3.14到3.14)  
  7.     float fPhiExtent;   //角度幅度(弧度,範圍0到6.28)  
  8.     //**優化算法參數,第一個參數,依次更優化,點數多時可使用.'none'1, 'point_reduction_low'1/2, 'point_reduction_medium'1/3, 'point_reduction_high'1/4)  
  9.     //*優化算法參數,第二個參數,'pregeneration', 'no_pregeneration' ,預分配內存對速度影響不大,反而耗費內存,不推薦使用  
  10.     QString strOptim;   //**優化算法(降低邊緣點數可提速,依次更優化.)  
  11.     //極性,'use_polarity',使用該參數即可,一般模板與目標極性相同  
  12.     int iEdge;          //對比度,用於提取模板,有三種參數模式[min,max,size],目前只用一個參數  
  13.     int iMinEdge;       //最小對比度,排除無效邊緣干擾  
  14.     _pCreatModel()  
  15.     {  
  16.         iNumLevel = 5;  
  17.         fPhiStart = -3.14;  
  18.         fPhiExtent = 6.29;  
  19.         strOptim = "point_reduction_low";  
  20.         iEdge = 20;  
  21.         iMinEdge = 10;  
  22.     }  
  23. }s_pCreatModel;  
  24. //查找模板,帶“*”影響模板匹配速度,多則速度影響較大  
  25. typedef struct _pFindModel  
  26. {  
  27.     float fPhiStart;    //**起始角度(弧度,範圍-3.14到3.14)  
  28.     float fPhiExtent;   //**角度幅度(弧度,範圍0到6.28)  
  29.     float fScore;       //***匹配度,該值越小匹配越耗時,範圍[0,1],推薦值(0.4-0.7)  
  30.     int nNumMatchs; //匹配個數,0爲所有匹配,指定個數,則選擇匹配度最高的  
  31.     float fMaxOverlap;  //允許的最大重疊面積,範圍[0,1],無格擋可設爲0  
  32.     //**亞像素精度影響檢測速度和匹配結果(*角度*),若精度要求不高,可使用'interpolation',綜合精度和速度可使用'least_squares'  
  33.     QString strSubPixel;//**亞像素精度。  
  34.     float fGreediness;  //****用於定位加速,該值越大速度越快,但可能導致無法找到匹配目標,推薦(0.7-0.9)  
  35.     _pFindModel()  
  36.     {  
  37.         fPhiStart = -3.14;  
  38.         fPhiExtent = 6.29;  
  39.         fScore = 0.5;  
  40.         nNumMatchs = 0;  
  41.         fMaxOverlap = 0;  
  42.         strSubPixel = "least_squares";  
  43.         fGreediness = 0.8;  
  44.     }  
  45. }s_pFindModel; 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章