全景圖是2:1比例的圖片,一般是多張圖像拼接而成少态。全景圖2:1的比例可以很方便的映射到球面城侧,而球坐標可以很方便的實現(xiàn)各種有趣的投影。比如小行星况增,水晶球赞庶,局部透視投影等。
今天來說說怎么將全景圖投影到小行星視圖:
首先澳骤,要有一副2:1的全景圖歧强,如下:
風景秀麗是不是。
然后为肮,將全景圖按照經(jīng)緯展開法重新貼到球面摊册,圖像的寬就是緯度0-2π,圖像的高就是經(jīng)度0-π颊艳。
接下來茅特,需要一種下面這樣的投影。將一個球面上的坐標投影到平面上棋枕。投影中心在球心到球面之間白修。
從百度百科上盜的圖,各位將就著看重斑。
這種投影方式中兵睛,下半球面會全部投影在平面圖中的一個圓內(nèi),上半球面會全部投影到圓的外面窥浪,并且分布越來越稀疏祖很。
投影過程可以理解為:
1. 首先建立球坐標系,將經(jīng)緯度的全景圖貼到球面上漾脂,這個過程我之前的一篇博客中魚眼圖轉(zhuǎn)經(jīng)緯圖講過假颇,原理一樣。只不過是逆過程骨稿。
2. 設(shè)定投影中心點的坐標笨鸡,然后連接投影中心點和球面上一點,得到一條直線啊终。當然此時需要設(shè)置一個視場角FOV镜豹,即選擇投影的視場角是多大。視場角越大蓝牲,最后得到的小行星視圖中間圖像被擠壓的越厲害趟脂。
3. 建立投影平面,以上圖為例例衍,該投影平面與球面相切與南極點昔期。計算該直線與該投影平面的交點已卸,即可得到投影后的平面坐標。
4. 上述三步均在球坐標系下完成硼一,得到各個球面點的平面坐標后累澡,根據(jù)具體想要得到的平面圖像尺寸,將平面坐標轉(zhuǎn)換為圖像坐標般贼。至此完成愧哟。
上述是正向投影過程,如果采用反向投影哼蛆,原理類似蕊梧,不過倒過來從原全景圖像素點取值即可。
上述過程可以很方便用C++代碼實現(xiàn)腮介,讀取圖像的操作可以用OpenCV:
投影后得到的小行星視圖如下肥矢,F(xiàn)OV和投影中心位置都會影響小行星在圖像中的大小:
這個是投影點在北極點叠洗,F(xiàn)OV設(shè)置的120度
投影點在北極點甘改,F(xiàn)OV=170度,則如下:
投影點在北極點與球心的中點灭抑,F(xiàn)OV=120度十艾,則如下:
同樣道理,如果投影點在南極點腾节,投影平面放在北極疟羹,則如下圖:
同理,如果在球體內(nèi)隨意移動投影點禀倔,投影得到的效果也會不同,可以實現(xiàn)不同視角的小行星参淫。
生成了一段繞固定軸旋轉(zhuǎn)的小行星gif圖救湖,效果如下: