各種變換的矩陣形式,其中透視變換的矩陣需要8個dof(自由度),所以我們至少需要4對點才能將矩陣求解。
四對點的含義是:你自己選取的4個和模板匹配的4個點,總共8個點求解8個未知數。
矩陣求解過程:
其中:(xi,yi)表示的是你自己選取的點。
(u0,u1)表示在右圖模板匹配后得到的相似度最高的點。匹配成功的話,他們的關系是一一對應的。
情景:
假設有兩張圖片,簡稱左圖和右圖,需要將兩張圖拼接到一起,這兩張圖不是簡單的平移、旋轉和縮放關系,需要用到透視變換。
步驟:
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大小的寬度,剛好是最后一個相似度求解所需的大小)。
其中模板匹配一共有六種計算相似度的方法,我是用第一種平方差之和求解相似度去實現模板匹配函數的:
效果圖:
注:向前映射會導致圖片有空洞,所以采用向后映射,而映射過程中我選擇用最近鄰插值,因為它比雙線性插值簡單而且效果也還不錯。
總結:其實整個圖像拼接主要用到幾個點:模板匹配、求矩陣、通過矩陣透視變換,對結果圖片大小計算之后進行”裁剪“,最后顯示拼接后的圖片。