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

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

全景圖基本實現過程

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

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

由於無人機有着穩定的雲臺,移動攝像頭拍照角度很方便,利用無人機進行全景圖拍攝是一個很天然的選擇。測試

全景圖片合成流程

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

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

圖片匹配:鏈接匹配的特徵點,估算圖像間幾何方面的變換

圖像均衡補償:全局平衡全部圖片的光照和色調

若是是在陰天的環境可能各個角度的光線比較均勻,若是是晴朗的天氣由於有太陽這個面光源,不一樣角度的曝光結果確定有些差別,將來最後合成的時候顯得天然就須要平衡全局的曝光、色調。 .net

補天

目前常規的無人機雲臺都沒法垂直 90 度拍攝天空,實際上大部分場景的全景圖對於天空的細節也不做要求,畢竟同在一片藍天下。可是若是全景圖裏沒有天空觀感上會很是不天然,所以一般在合成最後會補充一些天空的細節。 3d

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

大疆常規無人機的雲臺的最大仰角是 30 度,可是即便是大疆本身實現的全景拍照功能拍攝的最大仰角也只設置到 15 度。由於當仰角到極限的 30 度時,頂部區域會大面積的拍到槳葉。 cdn

前面提到過全景後期合成須要基於特徵點進行匹配,若是大面積拍到槳葉,由於每張照片中槳葉的位置都毫無規律,對兩張相鄰照片的匹配會形成干擾,下降匹配的機率。 這樣咱們就確認了拍照區域:水平向 0 - 360 度,豎直向 - 90 到 15 度。接着根據照片重疊率能夠自行計算須要拍多少照片。 咱們觀察到大疆的全景拍照間隔是這樣的:

雲臺 +15 度 9 張圖像
雲臺 0 度 9 張圖像
雲臺 -25 度 9 張圖像
雲臺 -60 度 6 張圖像
雲臺 -90 度 1 張圖像blog

咱們選擇了一個更簡單的方案: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 的錯誤而中斷任務。

總流程

相關文章
相關標籤/搜索