基於模板匹配與透視變換影像拼接的步驟

各種變換的矩陣形式,其中透視變換的矩陣需要8個dof(自由度),所以我們至少需要4個點才能將矩陣求解。

 

 

情景:

  假設有兩張圖片,簡稱左圖和右圖,需要將兩張圖拼接到一起,這兩張圖不是簡單的平移、旋轉和縮放關係,需要用到透視變換。

步驟:

1.在左圖選取四個點,以點形成四塊ROI(感興趣區域),以右圖為模板匹配的原圖,以左圖的模板進行模板匹配。

2.匹配成功之後會獲得右圖的四個相似度最高的四個點,利用左圖的四個點和右圖的四個點求矩陣,如果懂原理

   可以自己寫求矩陣的函數,也可以調用opencv的getPerspectiveTransform函數求得矩陣。

3.用求得的矩陣進行透視變換,我的做法是用向後映射(後向映射)將右圖的每一個點通過運算後存放到一張新的大圖中。

   計算公式是,此公式可以從矩陣中推導出來。

   當然也可以調用opencv的warpPerspective函數實現透視變換。

4.將右圖通過透視變換到一張新的大圖之後,然後再將左圖遍歷到新的大圖中,遍歷需要注意的是要加一個判斷,判斷新的大圖中

   的像素點是否有值,如果無值再將左圖的像素值賦值下去。

 

原理:

模板匹配:通過計算相似度(匹配值)去匹配影像。其實網上有些部落格所講的什麼從左至右,由上而下匹配,都注重說這個遍歷過程,

而沒有真正講到這個過程是為了幹什麼?其實這個所謂的匹配移動過程的目的是為了計算相似度然後存放到一個CV_32FC1類型的結果圖中,

如果能達到這個目標,那其實從上往下匹配還是從下往上匹配其實是無關緊要的。計算完相似度之後可以通過minMaxLoc函數求得結果圖最

最匹配的位置。

還有一點就是opencv文檔中,模板匹配的結果影像的長和寬,以寬為例子,為什麼是」原圖寬度-模板圖寬度+1「,這個其實是為了保證你計算

相似度的時候,訪問不會越界。比如原圖的寬是53,模板的寬是20,53-20+1=24,意思為橫向需要求出24個相似度,當x=24的時候,結尾

剛好是53(24~53一共有20大小的寬度,剛好是最後一個相似度求解所需的大小)。

 

其中模板匹配一共有六種計算相似度的方法,我是用第一種平方差之和求解相似度去實現模板匹配函數的:

 

 

 

 

 

總結:其實整個影像拼接主要用到幾個點:模板匹配、求矩陣、通過矩陣透視變換,對結果圖片大小計算之後進行」裁剪「,最後顯示拼接後的圖片。