基於大疆無人機全景拍照的實現思路

沒故事的卓同學發表於2018-12-20

本文將介紹利用大疆無人機基於 DJI SDK 拍攝全景圖所需要的圖片,不包括圖片後期的合成拼接演算法。

全景圖基本實現過程

全景檢視是指在一個固定的觀察點,能夠提供水平方向上方位角360度,垂直方向上180度的自由瀏覽,簡化的全景只能提供水平方向360度的瀏覽。通常全景影象的獲得有兩種方法:全景拍攝和通過影象拼接來獲得全景影象。前者需要特殊的裝置,但是操作起來非常方便,簡單易行,但是,這種裝置價格非常昂貴,不適合普及。後者只需要普通的相機就可,但是需要進行相應的影象投影和拼接,所謂影象投影是指把實景影象投攝到一個統一的圓柱或者球體表面的過程,這樣可以消除影象間存在的旋轉關係,只保留平移關係,適合拼接。影象拼接是指兩幅不同視角方向具有一定重疊部分的影象合成一幅影象。顯然後者的重點在於影象的拼接和融合上。
合成全景圖中計算機視覺技術的知識和原理

顯然利用無人機拍攝全景圖採取的是上面提到的第二個方案,而不是利用專用的裝置拍攝。全景圖片後期的合成演算法處理都是一致的,專用裝置只是省掉了移動攝像頭拍攝各個角度的麻煩,因為專用裝置在各個角度都放置了固定的攝像頭,傻快貴。

基於大疆無人機全景拍照的實現思路

因為無人機有著穩定的雲臺,移動攝像頭拍照角度很方便,利用無人機進行全景圖拍攝是一個很自然的選擇。

全景圖片合成流程

在拍攝了固定點的各個角度照片後,接下來就是圖片的合成拼接演算法了。合成拼接大概分為以下幾個過程:

特徵點匹配:找到素材圖片中共有的影象部分

基於大疆無人機全景拍照的實現思路

圖片匹配:連線匹配的特徵點,估算影象間幾何方面的變換

基於大疆無人機全景拍照的實現思路

影象均衡補償:全域性平衡所有圖片的光照和色調

如果是在陰天的環境可能各個角度的光線比較均勻,如果是晴朗的天氣因為有太陽這個面光源,不同角度的曝光結果肯定有些差異,未來最後合成的時候顯得自然就需要平衡全域性的曝光、色調。

基於大疆無人機全景拍照的實現思路

補天

目前常規的無人機雲臺都無法垂直 90 度拍攝天空,實際上大部分場景的全景圖對於天空的細節也不作要求,畢竟同在一片藍天下。但是如果全景圖裡沒有天空觀感上會非常不自然,因此通常在合成最後會補充一些天空的細節。

基於大疆無人機全景拍照的實現思路
基於大疆無人機全景拍照的實現思路
基於大疆無人機全景拍照的實現思路

利用無人機拍攝各個角度照片

大疆常規無人機的雲臺的最大仰角是 30 度,但是即使是大疆自己實現的全景拍照功能拍攝的最大仰角也只設定到 15 度。因為當仰角到極限的 30 度時,頂部區域會大面積的拍到槳葉。

基於大疆無人機全景拍照的實現思路
前面提到過全景後期合成需要基於特徵點進行匹配,如果大面積拍到槳葉,因為每張照片中槳葉的位置都毫無規律,對兩張相鄰照片的匹配會造成干擾,降低匹配的概率。 這樣我們就確認了拍照區域:水平向 0 - 360 度,豎直向 - 90 到 15 度。接著根據照片重疊率可以自行計算需要拍多少照片。 我們觀察到大疆的全景拍照間隔是這樣的:

雲臺 +15 度 9 張影象
雲臺 0 度 9 張影象
雲臺 -25 度 9 張影象
雲臺 -60 度 6 張影象
雲臺 -90 度 1 張影象

我們選擇了一個更簡單的方案:15 度,-5 度,-35 度,-65 度各 8 張照片,雲臺垂直地面 -90 度拍一張照片。

拍攝順序:水平優先還是豎直優先

在確定了拍照的範圍後需要考慮一下拍攝的順序:水平優先還是豎直優先。

基於大疆無人機全景拍照的實現思路
水平優先就是把雲臺在固定一個角度後,機身自身旋轉一圈後拍攝下一個角度。豎直優先是機身固定在一個水平角度後,雲臺運動到各個角度拍照。假設都是拍攝 4 * 8 張照片(15 度,—5 度,-35 度,-65 度各一圈 8 張),水平優先機身旋轉 4 * 8 次,雲臺運動 4 次;豎直優先機身運動 8 次,雲臺運動 4 * 8 次。 所以根本的衡量因素是:讓機身多旋轉幾次還是讓雲臺多運動幾次划算? 答案是豎直優先,因為雲臺運動更穩定,代價更低。雲臺的運動環境相對可控,把雲臺旋轉到一個角度就可以了。而機身的 yaw 運動,需要產生一個水平的力,到達一個角度後還需要產生一個反向的力停下運動。因為在空中不像地面,可以通過地面摩擦力產生反向的力。所有運動的力都要通過多旋翼的力矩產生。每一次機身運動都必然伴隨著機身姿態調整的過程。
基於大疆無人機全景拍照的實現思路

如果全景照片包含仰角,那麼雲臺的豎直運動需要從低往高處運動。

基於大疆無人機全景拍照的實現思路

因為每次機身運動完都需要一定時間段調整機身姿態,此時無人機不一定是水平的。但是雲臺有穩定系統,所以畫面是穩的。

基於大疆無人機全景拍照的實現思路
因此如果機身剛運動完,馬上拍攝仰角的照片,可能會有更大的概率拍到槳葉。因為無人機在調整姿態過程中可能是側傾的。
基於大疆無人機全景拍照的實現思路

曝光策略

為了得到儘量均衡的曝光使用全域性測光是一個很合理的選擇。如果拍攝的是單張照片沒什麼問題,如果是各個角度都要拍攝,最後還有拼在一起,那麼全域性測光就不能滿足需求了。 因為全景合成的圖片有兩個特點:相鄰圖片需要有明顯特徵點;地平線下方的主體細節比較重要,天空的細節不重要。使用全域性測光在大光比的場景下,拍攝畫面有天空時曝光結果就會和我們期待的不一致。因為天空很亮,曝光就會降低,這樣天空的細節有了,我們想要的地面上的主體就會嚴重欠曝。逆光的時候就非常典型:

基於大疆無人機全景拍照的實現思路
基於大疆無人機全景拍照的實現思路
兩張照片是在同一個位置拍攝,只是拍攝角度不同。人眼通過遠處群山的形狀可以看出是在同一個地點,但是對於程式而言,因為畫面下面部分太暗,細節全部丟失,特徵點匹配值就很低。而且我們關注的是地面的層次,這樣的曝光地面嚴重欠曝,輸出的全景圖也不是我們想要的。 我們所期望的曝光結果是這樣的,地面上物體清晰有細節,天空可以過曝。
基於大疆無人機全景拍照的實現思路

最後合成的時候可以是這樣的結果,天空的顏色都接近白色也利於後期補天處理。

基於大疆無人機全景拍照的實現思路

利用曝光鎖定

現在我們明確了曝光目標是在水平、仰角時地面的物體曝光準確,天空可以過曝。 很自然的聯想到這不就是區域性測光嘛!在 DJI SDK 中,區域性測光是把畫面分割成 8 * 12 個塊,比如設定測光區域 [0, 0] ,那麼就是以左上角的那塊作為測光區域。我們可以在雲臺 -5 度,15 度的時候,設定測光區域為 [6, 6],那麼就是以靠近畫面底部的中間區域測光。 想法很美好,但是真正用這個方式進行拍攝時我們發現沒有拍攝過程中沒有人的參與,[6, 6] 這個區域性出現偏差的概率很大,結果不太穩定。這一小塊地方可能剛好在這個畫面裡比較亮,或者比較暗都有可能。 在放棄了區域性測光方案後我們想到了利用曝光鎖定。雲臺在 -35 度的時候畫面是整塊地面,拍攝完成後鎖定曝光,-5 度和 15 度都使用 -35 度的曝光,這樣就既保證了地面曝光的準確,也使豎直方向上的照片曝光有著較好的連續性。如何實現曝光鎖定可以參考這篇文章:DJI SDK 如何實現曝光鎖定

Tips

大疆無人機的產品線從兩千元的入門 spark 到專業級的 M 系列,攝像機的效能區別是很大的。全景拍攝過程中攝像機需要連續拍攝幾十張照片,每一次攝像機運動後都需要重新對焦、測光、設定曝光引數。因此拍照一定要針對不同機型測試攝像機的效能,否則可能會在拍攝過程中因為攝像機工作量過大丟擲 camera busy 的錯誤而中斷任務。

總流程

基於大疆無人機全景拍照的實現思路

相關文章