您的位置:首页 > 理论基础

计算机视觉方向简介(二) | 阵列相机立体全景拼接

2018-01-31 19:30 561 查看

有什么用?

全景相机(详见《5分钟了解全景相机》)现在在日常生活中已经比较常见,不同的全景相机外观、性能、价格等差别还是挺大的(详见《全景相机哪家强?》)。消费级全景相机主要用于生活自拍、个人直播等,而专业级全景相机可用于专业全景直播、专业VR内容制作、影视拍摄等。

其中,基于阵列相机的立体全景拼接无疑站在全景相机生态链的顶端。普通的全景相机只能生成二维全景图像,而立体全景图是由两张具有一定视差的左右全景图组成,因此合成的全景图是具备深度信息的,用VR头显观看这样的立体全景图/视频时,就像用3D眼镜观看360° x 180°环绕的沉浸式巨型屏幕,身临其境的感觉就像在真实的物理世界一样。

目前具备这样功能的设备主要有两种:Google Jump和Facebook Surround 360(详见《最牛全景相机——Facebook Surround360原理解析》)。本文以Google Jump为例介绍。如下图所示:(a) 是Jump的阵列相机圆盘(b) 通过16个相机拼接好的立体全景视频。



什么原理?

先来看看硬件设计方案。主要有如下两种设计方案:(a)切向设计和(b)径向设计。切向设计中一半相机负责立体全景图中的左视图,一半负责右视图。径向布局设计中每个相机同时负责左右视图中的一部分。径向设计只需要在相邻图像间进行插值,而切向设计需要间隔一个相机进行插值,这使得基线增大一倍,难度也更高。因此,径向设计更适合大圆盘半径而切向设计更适合于小圆盘半径。



相机的数目和参数如何选择?

我们知道硬件设计是非常重要的,好的硬件平台可以极大方便算法的开发和调试,避免走弯路。这对于视觉效果要求极高的立体全景设备而说,有过之而无不及。阵列圆盘的半径、相机数目、视场角有严格的约束关系。

硬件设计完成后,就到了最重要的环节:立体全景拼接算法。拼接算法流程图如下图所示:



1、首先需要对所有的相机进行标定,得到每个相机的内参和外参。

2、稠密光流场计算。该算法将水平方向的光流近似作为深度的倒数(视差)。该光流算法可以保持较清晰的边缘,如下图所示。(a)、(b)是输入的两帧,(c)是该方法得到的保持边界清晰的光流场。对(d)中(第1帧图)的一个小区域,在(e)中(第2帧图)较大范围内进行搜索并计算得到一个归一化的误差平方和(f)。根据块光流及其置信度图(g),从而得到用色彩、饱和度、明度表示的初始的光流(h),最后经过双边滤波等后处理方法得到最终边界清晰的光流场(i)。



3、曝光校正。为了能够得到较大的曝光范围,该阵列全景相机都设置为自动曝光模式。但这会带来一个严重的后果,就是相邻的相机因为朝向不同,曝光量可能会差距特别大(能够达到3倍)。这不仅会造成拼接困难,还会因为左右眼曝光差异过大给3D效果带来极大的不适感。如下图所示,(a)、(b)、(c)中上半部分表示立体全景图中的左视图,下半部分表示右视图。(a)是未进行曝光校正的结果,左右图曝光差别较大(b)是HDR校正结果,可以看到校正后出现了过曝,(c)是本算法校正后的结果。



4、融合。融合方法比较复杂,这里不再赘述,详见最后的参考资料。最后对每个像素进行了基于间隔的融合,我们得到了两张全景图,一张对应左眼一张对应右眼。

效果怎么样?

Google Jump官方的立体全景视频在VR设备上观看还是很震撼的,由于具备了深度信息,真实感特别强。感兴趣的读者可以用VR眼镜(调整到上下3D模式)观看这个视频感受一下:

该方法也并不是尽善尽美,在一些情况下会出现比较明显的拼接问题。下图列举几个例子:



(a) 物体距离镜头特别近时,拼接会出错,图中大猩猩距离镜头大概15cm。(b) 细长的物体在光流计算中很容易被遗漏,这会导致图中麦克风杆的鬼影效果。 (c) 半透明的物体表面会产生变形. (d) 少部分情况下重复纹理区域的光流会出现误匹配。

运行时间:

输入16个2704 × 2028帧率为 30 FPS的视频流,输出是 8192 × 8192的视频流,其中左右眼(左眼在上右眼在下)各对应一个 8192 × 4096的全景图。

经过优化,一个小时的视频流输入在1000多个核上并行计算时间约为10个小时。

虽然两张图光流计算只需5s,但是一次同时输入16张图,前后向光流需要各算一次,所以主要的时间耗费在光流的计算上了。每张立体全景图平均处理时间分布如下图所示:



有什么参考资料?

Google Jump 原理:

Anderson R, Gallup D, Barron J T, et al. Jump: virtual reality video[J]. Acm Transactions on Graphics, 2016, 35(6):198.

Facebook Surround360的开源硬件设计和代码:

https://github.com/facebook/Surround360

注:本文首发于微信公众号:「计算机视觉 life」。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐