1. 程式人生 > >全景圖轉小行星視角投影原理詳解

全景圖轉小行星視角投影原理詳解

全景圖是2:1比例的圖片,一般是多張影象拼接而成。全景圖2:1的比例可以很方便的對映到球面,而球座標可以很方便的實現各種有趣的投影。比如小行星,水晶球,區域性透視投影等。

今天來說說怎麼將全景圖投影到小行星檢視:

 

首先,要有一副2:1的全景圖,如下:

 

風景秀麗是不是。

然後,將全景圖按照經緯展開法重新貼到球面,影象的寬就是緯度0-2π,影象的高就是經度0-π。

接下來,需要一種下面這樣的投影。將一個球面上的座標投影到平面上。投影中心在球心到球面之間。

從百度百科上盜的圖,各位將就著看。

這種投影方式中,下半球面會全部投影在平面圖中的一個圓內,上半球面會全部投影到圓的外面,並且分佈越來越稀疏。

投影過程可以理解為:

1. 首先建立球座標系,將經緯度的全景圖貼到球面上,這個過程我之前的一篇部落格中魚眼圖轉經緯圖講過,原理一樣。只不過是逆過程。

2. 設定投影中心點的座標,然後連線投影中心點和球面上一點,得到一條直線。當然此時需要設定一個視場角FOV,即選擇投影的視場角是多大。視場角越大,最後得到的小行星檢視中間影象被擠壓的越厲害。

3. 建立投影平面,以上圖為例,該投影平面與球面相切與南極點。計算該直線與該投影平面的交點,即可得到投影后的平面座標。

4. 上述三步均在球座標系下完成,得到各個球面點的平面座標後,根據具體想要得到的平面圖像尺寸,將平面座標轉換為影象座標。至此完成。

上述是正向投影過程,如果採用反向投影,原理類似,不過倒過來從原全景影象素點取值即可。

 

上述過程可以很方便用C++程式碼實現,讀取影象的操作可以用OpenCV:

投影后得到的小行星檢視如下,FOV和投影中心位置都會影響小行星在影象中的大小:

這個是投影點在北極點,FOV設定的120度

 

投影點在北極點,FOV=170度,則如下:

 

投影點在北極點與球心的中點,FOV=120度,則如下:

 

同樣道理,如果投影點在南極點,投影平面放在北極,則如下圖:

 

同理,如果在球體內隨意移動投影點,投影得到的效果也會不同,可以實現不同視角的小行星。