關於座標系變換,可以參考:
http://blog.csdn.net/wangxiaokun671903/article/details/37966891
在opencv的全景視頻拼接demo stitching_detailed中,用到了warp,主要是創建用於多幅圖像融合的表面,默認是球面投影,其原理分析如下:
直觀說分3步:
1.矩形->曲面
矩形鋪在球面上(像素座標系->世界座標系),這個時候看起來這個矩形看起來已經不是矩形了,變成了一個四個邊有弧度的形狀;
2.曲面->矩形
拉伸這個形狀使之從變成矩形(求各個弧形邊的最外沿座標,或者說曲面各個弧邊的切線構成的平面矩形);
3.扭曲變換
將這個矩形通過反變換(世界座標系->像素座標系),使之變成一個扭曲的平面。
每一步的實現:
1.前向變換,三維重建:
SphericalProjector::mapForward1)二維轉三維->將原圖的mask矩形輪廓的像素座標乘以R(旋轉矩陣)和K(內參)的逆矩陣,得到空間三維座標;
2)將三維座標(x,y,z)轉換成球面的極座標(其值爲球面座標的仰角和張角對應的弧度),球半徑爲焦距;
2.獲得產生的曲面的外圍矩形輪廓,曲面->矩形,會有拉伸;
RotationWarperBase<P>::detectResultRoiByBorder3.反向變換:
SphericalProjector::mapBackward1)產生的新矩形挨個像素將其作爲球面座標轉換回空間三維座標(x,y,z);
2)三維轉二維->空間三維座標乘以R和K矩陣,得到像素座標。
4.經過以上步驟得到兩個分別沿x、y軸轉換的映射矩陣;
5.原圖與這兩個矩陣做remap操作得到投影后的圖像。