基于大疆无人机全景拍照的实现思路

本文将介绍利用大疆无人机基于 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 的错误而中断任务。

总流程

© 著作权归作者所有
这个作品真棒,我要支持一下!
奇志技术团队博客 http://meshtech.co/
2条评论
Nick53
#1

先赞再看

亮Ge
#2

总结得很棒!

top Created with Sketch.