機器視覺(一)2D形狀匹配

在2D的機器視覺應用中,模板匹配比較常見,

常見的匹配算法有基於灰度的匹配,基於邊緣的匹配,基於形狀的匹配等。推薦《機器視覺算法與應用》這本書,這本書是halcon開發人員撰寫,對於模板匹配介紹的比較詳細。下面介紹基於形狀的模板匹配。

在pcl和opencv中都有關於linemod的實現。本算法是基於linemod的2D版本,主要從opencv的源碼修改。

1 算法的基本流程如下:

(1). 計算方向梯度,並進行方向擴展

以彩色梯度爲例,Opencv源碼先進行了7*7的高斯模糊,然後利用Sobel算子計算了梯度,繼而在每個像素點求解出了梯度方向以及幅值,只有超過一定閾值的梯度纔會被保留;接着在3*3的領域內統計梯度的方向,數量超過5的梯度方向纔會被採用。值得注意的是,這裏的方向都是無符號的,也就是隻取上一半,Opencv實現的代碼裏分爲了8個方向。如圖所示,這種提取特徵的方式對於梯度起到了主成分提取和放大的效果。

 

爲了使得匹配有一定的容錯度,對圖像(非模板)提取完方向後得到了特徵圖,在一定領域裏讓這個特徵進行擴散,繼而利用模板進行滑窗匹配時就有了一定的容錯度。下圖展示了擴散的過程以及對方向離散化的過程,擴散的範圍是T=3個像素,方向的個數n=5。

 

(圖像提取完)

 

(擴展後)

(2). 預處理響應圖

針對8個方向和1裏得到的擴散圖逐個像素進行匹配,匹配的結果是距離最近方向角度的餘弦值。值得注意的是,雖然這裏有八個方向,但是夾角只有五種情況(算的直線夾角而非射線),故而匹配的結果只有五種,OpenCV裏用0,1,2,3,4表示。

這裏有8個方向,故而就有8張預處理的圖,在利用模板進行匹配的時候就可以直接調用對應方向在對應像素的結果,避免了滑窗時重複的計算。

這樣就用了一點內存空間換取處理上的速度。

(3). 線性存儲

在進行滑窗匹配計算匹配度時調用響應圖中的數據都是有規律的,每隔滑窗的步長T採取一次數據,故而文章提出直接將響應圖中的數據拉成N*N個“長條”,這樣就可以將多個數據融合在一起進行加的操作從而減少算法的運行時間。

上文也提及到了匹配的結果只有0-4四種結果,一個char的長度是8位,最多能融合63個特徵相加而不溢出,故而OpenCV實現的代碼裏最多隻支持63個特徵(這一點在修改的源碼中已經改進)。

這一步是整個算法的關鍵,也是提高速度的關鍵。以下圖爲例進行詳細說明:

將響應圖按照步長T, 分爲T*T個線性存儲。這樣對於一個模板在滑窗比對的時候,模板中的同一個像素在不同位置所對應的比對值,都在同一個線性存儲裏。模板中的所有像素都對應一個匹配結果的線性存儲,如下圖2中右邊。這樣就可以用SSE進行整體相加計算。而不必在每一個模板滑窗地方單獨相加計算。

                                                    (1)

                                                     (2)

上面遍歷過程的示例代碼:

2 總結

(1)模板問題。算法因爲只對模板進行滑窗計算,針對模板的旋轉和縮放問題,需要首先將模板根據角度精度和縮放因子進行旋轉和縮放生成不同的模板,對所有模板進行梯度計算以及離散化處理。由於此算法的特點,此算法對上千張模板進行匹配對速度影響不大。

(2)此算法結合的是邊緣的梯度大小和方向,速度上用了金字塔,sse以及openMP進行加速。所以在效果上,穩定性和速度都很好,比一些商業軟件的匹配工具差不了太多。下圖是一些檢測實例,速度方面,500萬像素找出目標,大約200ms左右。

 

 

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