opencv warp(扭曲)球面投影的原理

關於座標系變換,可以參考:

http://blog.csdn.net/wangxiaokun671903/article/details/37966891

在opencv的全景視頻拼接demo stitching_detailed中,用到了warp,主要是創建用於多幅圖像融合的表面,默認是球面投影,其原理分析如下:

直觀說分3步:

1.矩形->曲面

矩形鋪在球面上(像素座標系->世界座標系),這個時候看起來這個矩形看起來已經不是矩形了,變成了一個四個邊有弧度的形狀;

2.曲面->矩形

拉伸這個形狀使之從變成矩形(求各個弧形邊的最外沿座標,或者說曲面各個弧邊的切線構成的平面矩形);

3.扭曲變換

將這個矩形通過反變換(世界座標系->像素座標系),使之變成一個扭曲的平面。


每一步的實現:

1.前向變換,三維重建:

SphericalProjector::mapForward
1)二維轉三維->將原圖的mask矩形輪廓的像素座標乘以R(旋轉矩陣)和K(內參)的逆矩陣,得到空間三維座標;
2)將三維座標(x,y,z)轉換成球面的極座標(其值爲球面座標的仰角和張角對應的弧度),球半徑爲焦距;

2.獲得產生的曲面的外圍矩形輪廓,曲面->矩形,會有拉伸;

RotationWarperBase<P>::detectResultRoiByBorder

3.反向變換:

SphericalProjector::mapBackward
1)產生的新矩形挨個像素將其作爲球面座標轉換回空間三維座標(x,y,z);
2)三維轉二維->空間三維座標乘以R和K矩陣,得到像素座標。


4.經過以上步驟得到兩個分別沿x、y軸轉換的映射矩陣;
5.原圖與這兩個矩陣做remap操作得到投影后的圖像。

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