我的订单|我的收藏|我的商城|帮助中心|返回首页
虚拟现实新闻>创客>产品技术>硬件

史上最详细的Google 虚拟现实摄像机原理解读

文章来源:网络搜集整理 作者:VRFans 发布时间:2015年06月13日 点击数: 字号:

Google Jump是在Google I/O 2015上亮相的一款360°全景摄像装置,它是由镜头组、自动整合和处理素材的软件、播放平台3部分组成。它可以使用户实现360度全景拍摄。拍摄的原始视频经过JUMP应用转换后,会生成非常逼真的3D虚拟现实视频。JUMP由谷歌和GoPro联合开发完成。 被外媒称之为“完整的虚拟现实录制生态系统”。

让我们仔细分析下其中最有趣的东西(至少我认为!):Jump 虚拟现实拍摄装置。我们来解析下这个玩意儿,看和之前各种拼接的什么环视啊什么360°啊到底有什么不同。

首先,Jump 是一个 GoPro 阵列,外形上看和各种 VR 影像公司提供的东西没什么不同,不过是摄像头数量的多寡而已。Google 的产品副总监、VR/AR 部负责人 Clay Bavor 称这个东西通过自己去买到的些部件就能拼起来。Google 自己不卖这玩意儿,但他们会放出 CAD 图纸让任何想搞的人去生产售卖。如下图所示:

而且,他们也依旧拿纸糊了一个(8000美金的摄像头以及8块钱的纸板)。但在你雄心勃勃地想要自己去生产这个玩意儿开始创业,上市老总,成为妖股,迎娶白富美,走向人生巅峰之前,你要晓得 GoPro 是要打算从今年开夏卖这个东西的。GoPro 卖这个了粗粮岂能坐视不管?不过总之吧,如果你想要个性化颜色什么的还是可以自己去做吧,塑料版淘宝上肯定马上能有的啦。不过要注意的就是这个结构的松紧,因为摄像头的位置是非常重要的。

一眼瞄过来,这个圆形阵列并没有朝上或朝下的摄像头,如果按照 GoPro 4 Black 的规格,这个阵列能捕捉水平360°的画面,但垂直只有120°。因此,顶上脚下都会丢失60°的可视角度。此外,Jump 乍一看像非立体的单眼摄像机,每个相机都对着不同方向。多数 3D GoPro 相机有两个摄像头对准某个方向,类似这样:当有两个摄像头对准某个方向后,你在这个方向上就能给每只眼以不同的画面,这样就有了视角差和立体效果。画面也会有拼接痕迹,因为某个方向的“左”摄像头离另一个方向的“左”摄像头有点远(显然,如果不管立体效果,平面相机的)。围绕着对于降低拼接痕迹的各种方式,诞生了一个小微行业。

而这一点就是 Google 这个解决方案的大牛之处:这个看起来像平面相机组的摄影阵列实际上是立体的。每个摄像头拍摄的画面并不是给左眼或者右眼的,这些数据可以给两眼都使用。3D 效果是通过计算机图形学来得到相对的立体位置,再重新映射到你的眼中,因此根本没有拼接痕迹(理论上)。非常屌,因为这种不到1W美金的半专业设备能捕捉流畅的360°3D VR 影片的话,是一个非常大的突破。

工作原理是这样的:

因为软件知道每两个摄像头之间的相对距离、位置,因此只要它能计算出两个摄像头之间的场景像素,就能得到场景中某个点的深度。使用这些立体数据,你可以通过扭曲某个画面来得到所谓的“立体垂直”视野:基本上,每个摄像头拍到的画面都是正确的视差点(对于以前的那些针对双目的立体拍摄设备,只有在双眼的摄像头之间的拍摄画面才有正确的视角差,也就是说越往边上去,立体感越差)。当然,这需要大量的计算,不过谁让 Google 自己电脑多呢。

当你从某个摄像头的画面过度到另一个摄像头的捕捉画面时,视角会稍微偏一点点。为了连接画面(或建立3D模型),你从邻近的摄像头离找到相匹配的区域,比如你从 A 摄像头找到一组像素,然后在 B 摄像头也去找同样的一组(这个一组指的是同一个相关部位,比如同一片树叶,不同位置摄像头拍出来的画面会稍有不同),实际上你是能知道往哪找的(相邻摄像机拍出来的图像差别不会太大),比起那些未校准的相机也会极大提升处理速度。目前已存在的拼接软件比如 Videostitch 或者 Kolor (早前被 GoPro 收购了)由于是通用软件,会对你的拍摄设备结构做一些猜测,但如果是类似 Google 这种校准过的摄像头,就只需要通过严密的数学算法解决。

当你找到匹配的区域,同时也知道在图片上这些区域的距离差,你就能计算出相机阵列和这个区域实物之间的距离。如果物体,比如说天空是在无限远,那么两个相邻相机照出来的图片天空部位会非常接近。当物体离相机很近时,物体在画面上会变大,同时两个相邻相机拍出来的图像也会有较大距离偏差。具体的偏差完全由物体离摄像阵列的距离决定,因此你可以得到非常精确的物体位置。

更准确一点,你是在右边寻找这条对极几何线。由于 GoPro 镜头扭曲得很厉害,这条线实际上是弯的。不过基于这种方式的高效算法也仅只有几年时间而已。

当有了 3D 模型后,你甚至能得到一定的四处看、头部跟踪的范围。不过只有一小部分,而且你没有任何的垂直视角差。图像的点理论上都有正确的深度信息,但后面的背景信息你是没有的,在你垂直移动时会出现问题。(通过差值来填补像素并非完全不可能,但复杂度也会大很多,而且目前来看也没这个必要)

这么说起来,好像前景分外光明一片大好啊,但现在问题来了,计算机图形并不是灵丹妙药。当通过以上算法来计算差别时,我们默认相邻两幅图是相似的,像素是能互相对应的。对于没有镜面反射的不光滑表面来说,OK没有问题(技术用语是朗伯表面),但只要有发光闪烁就会出现问题。Google 视频中的演示是静态的,但对于自然界光线复杂时,对于算法的要求就高了,可能会弄出各种奇怪的或是撕裂或是扭曲变形的图像状况。

另外一种明显的会搞晕你算法的状况就是重复的图形,因为算法可能会识别到错误的区域(砖墙啦锁链栏杆啦都是这类技巧的灾星,当然也有一些绕过去的技巧)。此外透明的玻璃啦、没有纹理的白墙之类的东西啦也不好搞。还有无中生有的一些东西,比如电话线中间的空间:电话线绕了一圈,背景是白墙,那么对于算法来说咦这两组像素好像啊,肯定是一个物体。但其实什么也没有,只是电话线圈出来的虚空。压缩也会带来高频错误:GoPro 是即时把数据压成 H.264 的,而压缩质量也参差不齐。什么树叶、镜头反射之类的就更别说了。

当然,毕竟 Google 从街景时代就一直在做方面的研究,因此积累也很深了 - 而在演示中他们甚至放出了一些算法方面的解决途径,Bavor 展示了算法追踪场景得到的等高线轮廓图:

Google 有可能是通过这种方式来解决上面提到的一些问题的:当两个摄像头拍摄到的图片某部分不好吻合时,那么就从这部分周边通过插值来得到深度数据。比如你得到一些完全错误的数据,比如镜头的反射闪光或者假的匹配,就忽略掉并直接采用插值数据。当然这是一种柔化或者低通的处理方式,而且这幅曲线图看起来也就是 Google 的算法直接生成的,因为如果你仔细看会发现其结果并不完全匹配真实世界:线条在边缘处过于光滑(看柱子顶部),而且一直连续,就好像一条被撑开的大橡皮筋套在整个场景里一样(虽然听起来离真实世界差距很大,但你要知道我们对于深度的感知并不仅仅靠的是深度本身的精确性,而避免立体错误比起让深度完全正确要必要得多)。如果这的确是 Google 算法算出来的场景部分,其中一部分尤其彰显了这个橡皮筋效果:

当然无论怎样都是会有差错的。而且其实这些场景中都有一些去看就能看到的问题。比如说你去看着右边中间前景里的一叠木制柱子,当视角横向来回移动时其反光和形状都发生了重影、断裂。

也许这个例子看起来还不是什么大问题,但目前这个系统我们还不知道那些往常的反射、睡眠、重复图案、透明等问题如何解决。当然,视频中的演示确实不错,至少这个系统也会提高制作 VR 摄像装备的门槛,大概淘汰掉现在业界八成左右的人吧(当然国内不一样,反而会降低门槛,连个 Cardboard 都能拿去上市)。

但使用起来其实也不是那么轻松,毕竟这么大。GoPro 会在夏季发布官方产品,不过反正 Google 会放出图纸,希望同时开启16个摄像头的方式并不复杂。Bavor 说曝光会搭配得很好,帧同步应该也不是问题。但在帧同步这一方面,我们不确定是意味着半帧时间内的同步,还是类似于专业3D摄像系统的毫秒乃至微秒级的同步。听说 GoPro3 和 4 无法被硬同步到毫秒或者微秒级,也不知是真是假(GoPro 有这个 3D 系统,但无法选择 Hero 3 或者 Hero 4)。从内容制作者的角度来看,这可能是个问题;因为在半毫秒级别的误差下,高速运动的物体或者摄像头都会导致最终拼接画面的错误,同时摄像头的时钟可能是石英晶振器容易有漂移现象(千分之一的漂移意味着60fps下每20秒会丢失一帧)。当然,对精确度的要求取决于你想要拍摄的场景和对象,但讽刺的是有可能 GoPro 将不再适合用来拍摄高速动作片段了。

而一脉相承的,GoPro 也有明显的果冻效应(Rolling Shutter),GoPro Black 的 4k 影片拍摄帧率为30,那么你会看到30ms左右的果冻延迟。因为拍摄是逐行扫描的,扫描完一个画面需要33ms的话在这个过程中物体或者摄像头有移动,就会产生比较明显的形变。这种形变会如何影响到 Google 的算法?目前不得而知,只有等具体的产品出来了。

当然,提高帧率是能降低一些问题,不过最终的可用性如何呢?粗略计算这个摄像机组每小时的视频容量将达430GB:在GoPro Black 里,你可以以 60Mbit 录制 H.264 压缩的视频流,也就是每秒每个摄像头7.5mb。所有16个摄像头1个小时就是432GB。看样子你的硬盘、SD卡也得准备一大堆啊,当然有摩尔定律在几年后可能我们也会跨入PB时代了吧。


Bavor 提到这些摄像头拍摄出的源文件基本上和“5个4k电视”那么大。掐指一算,大概就是20k,或者20480 x 2160。当然这是源文件,至于处理后的文件呢?我们知道有大量数据是为了建模,实际上是不需要的 - 如果我们把这些 GoPro 排成一排拍摄不去管它们的重叠部分,总共达到 1510°(94.4° x 16),而显然我们只需要其中的360°,大概是1/4的样子,而剩下的3/4都是给算法用来消除误差用的。

无论如何,对于 Jump,以及在大会上宣布的拍摄+Google 服务器云计算+YouTube 终端播放(目前已经支持4k,360°和60fps视频,360°3D将会在今年夏天和 Jump 一起发布),彰显了 Google 把自己定位成在 VR 内容领域的一个大玩家。对于普通人来说,VR 视频是普及 VR 的最关键接口,Google 看样子为自己找了个好位置。

  • 暂无资料
  • 暂无资料
  • 暂无资料
  • 暂无资料
  • 暂无资料