标签:
也许就是这一两年之间,随着VR热潮的风起云涌,“全景”这个词汇被一次又一次地搬上了台面,再冠以“虚拟实景”,“3D实景”,“360度”,“720度”等种种名号,以至于被很多人当作了虚拟现实内容具体呈现形式的主要代名词。
诚然,VR内容的缺失问题现在已经被越来越多的开发者和商业团体所关注,而全景拍摄的图片和视频,以及正在襁褓期的VR电影,无疑会成为一种很好的内容落地方式。它能够在不需要过多的交互方式以及因此产生的学习成本的同时,带给观看者充分的沉浸式体验,以及通过离线渲染和摄影得到各种极致的效果。
那么,全景的定义与实现过程究竟是怎样的,人们可以如何去构建全景内容呢?本文会尝试从多个不同的关键角度去进行讲述,期望能够对前赴后继的创想者们有所助益。
全景拍摄并非是多么时新的一个概念,事实上它甚至可以追溯到12世纪的《韩熙载夜宴图》:
当然这并非真正意义上的沉浸式体验,就算我们把这幅长画给卷成一个圆筒,然后站在中心去观看,也依然会觉得缺失了一点什么,没错,一个明显的接缝,以及头顶和脚下两片区域的空白。
出现这种问题的原因是很简单的,因为宋朝人并没有打算把这幅画做成沉浸式的体验——当然这是废话——真正的原因是,画面对应的物理空间视域并没有达到全包围的程度,也就是水平方向(经度)360度,垂直方向(纬度)180度。没错,说到这里,你一定想到了这张图:
类似这样的世界地图也许在你家里的墙面上已经贴了有一些年头了,也许自从升上大学之后你从未正眼瞧过它,但是它却符合一张全景图片需要的全部条件,你把它放到各种VR眼镜里去观看的话,就宛若陷入了整个世界的环抱当中。
这种能够正确地展开全物理视域的真实场景到一张2D图片上,并且能够还原到VR眼镜中实现沉浸式观看的数学过程,就叫做投影(projection)。
而那张看起来平凡无奇的世界地图,使用的就是一种名为Equirectangular的常见投影方式,它的特点是水平视角的图像尺寸可以得到很好的保持,而垂直视角上,尤其是接近两极的时候会发生无限的尺寸拉伸。
下图中对于这种投影方式的拉伸现象体现得更为明显,注意看穹顶上的纹路变化,越是靠近画面的顶端,就越是呈现出剧烈的扭曲变形。幸好,VR头盔和应用软件的意义也就在于将这些明显变形的画面还原为全视角的内容,进而让使用者有一种身临其境的包围感。
然而全景图像的投影方式远不止这一种,比如最近刚刚发布的理光Theta S以及Insta360全景相机,就采用了另外一种更为简单而有效的投影策略:
通过它的两个鱼眼摄像头输出的画面,各自涵盖了180度的水平和垂直视场角,然后将两个输出结果“扣”在一起就是全视域的沉浸式包围体了。
当然,这种名为Fisheye的投影方式,生成的2D画面事实上扭曲变形是更加严重的。而通过图像重投影处理的方式将它变换到VR眼镜中显示的时候,受到图像采样频率的限制(或者通俗点说,像素点大小的限制),这样的扭曲被还原时会多少产生一定程度的图像质量损失,因而也可能会造成全景内容本身的质量下降。
由此看来,作为全景内容的一种重要承载基体,投影图像(或者视频)不仅应当完整包含拍摄的全部内容,还要避免过多的扭曲变形以免重投影到VR眼镜时产生质量损失。
那么,除了上述两种投影方式之外,还有更多方案可以选择吗?答案是,当然了,而且有的是!
比如墨卡托投影(Mercator),它沿着轴线的拉伸变形比Equirectangular更小,对应实际场景的比例更为真实,但是垂直方向只能表达大约140度左右的内容;
又比如Equisolid投影,也有人称之为“小行星”或者“720度”全景,它甚至可以把垂直方向的360度视域都展现出来,但是前提是使用者并不在乎巨大的扭曲变形可能带来的品质损失:
那么,有没有什么投影方式生成的画面,是能够覆盖至少360度水平方向和180度的垂直方向,并且没有任何画面的扭曲变形呢?
答案是:没有扭曲变形的单一图像投影方式,是不存在的。然而,如果投影的结果画面不是单一图像的话,方法还是有的:
如果你正好是一位图形开发或者虚拟现实软件开发的从业者的话,这张图对你来说应该是非常熟悉的,这就是Cubemap(立方体图像)。
它相当于一个由六幅图像拼合组成的立方体盒子,如果假设观察者位于立方体的中心的话,那么每幅图像都会对应立方体的一个表面,并且在物理空间中相当于水平和垂直都是90度的视域范围。而观察者被这样的六幅画面包围在中心,最终的视域范围同样可以达到水平360度,垂直360度,并且画面是绝对不存在任何扭曲变形的。
如下:
这是一种很理想的投影结果了,并且如果你恰好懂得使用一些离线渲染软件或者插件来制作和输出全景内容的话,这一定是最合适的一种选择。然而,在实际拍摄当中我们却几乎不可能用到这种立方图的记录方式,原因很简单——我们现有的拍摄设备难以做到。
如果说有六台摄像机,它们的FOV角度被严格限定为水平和竖直都是90度,然后造一个一丝不苟的支架,把这六台摄像机牢固而稳定地安装到支架上,确保它们的中心点严格重合在一起,并且各自朝向一个方向——这样的话,输出的图像也许能够正好符合立方图的标准,并且可以直接使用。
然而,无论摄像机镜头的感光面积,焦距参数(以及因此计算得到的FOV视场角度),还是支架的钢体结构设计与制作,都无法确保精确地达到上面要求的参数,几mm的光学或者机械误差看似无伤大雅,但是对于严丝合缝的立方图图像来说,必然会在最终呈现的沉浸式场景中留下一条或者多条明显的裂缝。更何况还有支架运动时产生的振动问题,以及相机镜头老化产生的焦点偏移问题,这些看似细小的麻烦各个都足以让我们刚刚构建的理想物理模型化为泡影。
理想和现实的差距如此之大,幸好我们还有解决的办法——没错,如果在拼接的地方留下足够大的冗余,然后正确识别和处理两台摄像机画面重合的区域,这样不就可以做到六幅画面的输出和组成全景内容了吗——而这正是全景内容制作的另一大法宝,图像的拼接与边缘融合。
下图是360Heros系列全景摄像机。
它使用了6个GoPro运动相机以及一个支架来辅助完成拍摄,这六台相机分别朝向不同的方向,如果采用4X3宽视角设定的话,其水平和垂直FOV角度约为122度和94度。
在全景视频拼接和输出软件中读取六台摄像机的输入流或者视频文件,并且设置它们在支架上的实际方位信息(或者直接获取数码相机本身记录的姿态信息)。这样我们就得到了足够覆盖全视域范围的视频内容。
正如我们之前所描述的,因为无法做到精确的对齐,因此需要在每台相机的视域角度上提供必要的冗余,因而得到的视频画面互相之间会存在一定的交叠关系,直接输出全景画面的时候,可能会存在明显的叠加区域或者错误的接边。虽然目前几种常见的全景视频处理工具,诸如VideoStitch,Kolor等具备一定程度的自动边缘融合功能,但是很多时候我们还是免不了要自己手动去裁切和调整这些边缘区域(例如下图中使用PTGui来进行各幅画面接缝的修正),择取画面质量更高或者畸变更小的边缘区域,并且确保画面之间是严格对齐的。
这样的工作耗时耗力,并且有一个重要的前提,就是作为输入源的画面必须能够覆盖360度全视域并且存在冗余。
正如我们之前所计算的,如果采用六个相机拼装的方式,那么每个相机的FOV角度不应小于90度,对于GoPro Hero3系列相机来说,此时必须采用4x3的宽视域模式,如果是16x9的宽高比设置,那么垂直方向的FOV角度很可能无法达到要求的数值,进而产生“无论如何都拼接不上”的问题——当然我们可以通过在支架上调整各个相机的朝向角度,或者增加相机的数量,来避免这一问题的产生,不过无论从何种角度来看,采用接近1x1的宽高比的宽视域相机都是一个更为理想的选择。
如果只是为了输出一张全景图片的话,那么上面的步骤通常来说已经绰绰有余,不需要再考虑更多的事情。但是,不会动的图片是很难让戴上VR头盔的人哇哇大叫的,能看到身边战火纷飞,或者野鬼出没的动态景象才更加刺激。如果你正在考虑如何制作如是的VR电影,那么有一个问题不得不提出来,那就是——
同步性——简单来说,就是你手中所有的摄像机如何精确保证同时开始,以及在录制的过程中保持帧率的一致性。
这看起来似乎并不算什么问题,然而如果两台摄像机的开始时间不一致的话,会直接影响到它们的对齐和拼接结果——甚至如果场景中存在大量的动态元素或者相机位置在这个过程中发生了改变的话,结果可能根本是无法对齐的。因此,对于需要大量摄像机同时参与的全景拍摄工作而言,同步开始以及同步录制的需求就变得分外重要了。
要从硬件上根本解决这个问题,可以用到“同步锁相”(genlock)的技术,即通过外部设备传递时间码来控制各台相机的同步运行(典型的例如Red One专业电影摄像机)。当然并不是所有的摄像机都具备专门的Genlock接口,这种情况下,也可以考虑一些传统或者是看起来略微“山寨”的同步方法,例如:路见不平一声吼……
在拍摄开始的时候,演员大吼一声,或者用力拍一下巴掌。然后在进行拼接的过程中,找到每个视频当中吼声对应的时间节点,作为同步开始的位置,然后再进行全景视频的拼接。这种方法虽然并没有什么精确性可言,但是同样没有开销什么额外的成本;但是确保了基本的同步起始位置之后,再进行视频的细微调节和拼缝工作,却无疑从相当程度上简化了后期制作的难度。
类似的方法还有给所有的摄像机蒙上黑布,然后开始拍摄的时候快速抽走,等等。总之在硬件条件无法完全具备的前提下,就是八仙过海各显神通的时候了。
细心的你可能已经发现,之前讨论的所有全景视频的拍摄过程都忽略了一个要点:无论采用何种投影方式,生成的都只是一幅360度的全景内容,放在PC或者网页端去观看当然没有任何问题,但是如果要将这样的内容输入到VR头盔显示器上,结果恐怕是不正确的。为了将画面赋予立体感并呈现到人的眼中,我们提供的内容必须采用左右眼水平分隔显示的模式:
这看起来只是将原来的全景画面复制了一份而已,但是悉心观察的话,在靠近画面边界的位置就会发现,左右画面的内容存在了一定的偏移。因为人的双眼是存在一定的视角差的,双眼各自看到的图像有一定的差异,再通过大脑的解算就可以得到立体的感受。景物距离人眼越近,这种视差就越明显,远处的景物则相对没有很强的立体感。
而任何一种现有的VR眼镜,都需要通过结构的设计确保佩带者的左右眼都只能看到实际屏幕的一半,也就是分别看到分隔后的左右眼画面内容,从而模拟了人眼的真实运作机制。
这种情形下,全景内容的拍摄设备也需要做出一些对应的改动,比如将原来的6台相机改成12台相机,即每个方向都有左右眼两台相机负责拍摄;支架的构建形式也因此与原来的设计大相径庭(图中为360 Heros3 Pro12,使用了12台GoPro运动相机)。
对于拼接和融合软件来说,倒是并没有什么特别需要做的,只是要先后两次读取六个视频流,处理后输出两个不同的全景视频,分别对应左右眼的画面内容。之后再通过后期工具或者应用程序将它们合并到一幅画面中即可。
当然了,另辟蹊径的路子也有很多,比如从2011年就震动了Kickstarter的众筹者,却直到如今VR全景应用大火却依然没有按期发出的Panono,它的设计原理是通过均匀分布在球体上的36个摄像头来拍摄,拼接并得到左右眼的全景图像。
这个设计虽然看起来拽得飞起,实际上却是万变不离其宗:朝向不同方向的36台摄像机拍摄的画面,叠加在一起足以覆盖水平360度和垂直360度的视域范围,并且一定可以覆盖两遍!再加上自身精准的结构设计和安装姿态,这样就能够从内部准确计算出拼接后的全景图像,并且直接按照左右眼两幅图像的标准输出视频流或者文件,其能够输出的实际分辨率也是相当可观的。
与之相仿的还有Bublcam(四个遍布球身的超大广角镜头),Nokia的OZO(8个遍布球身的广角镜头),以及Jaunt研发中的产品等等。它们都具备直接输出立体形式的全景内容的能力。
当然了,最不济的情形下,我们还有一种选择,就是自己假造一种立体模式……
将原始的全景画面复制成两份,其中一份向左偏移一点,另一份向右偏移一点,然后各自做一个轻度的透视变换(为了模拟视线角度的偏转)。这样构成的“立体”画面在多数情形下也具有一定的立体欺骗效果,但是对于近处的景物,或者左右眼画面中的景物存在遮挡关系的时候(比如模拟脸贴在门上,一只眼被门闩挡住的情景),则会有明显的瑕疵。当然了,对于依然对VR全景内容处于懵懂阶段的爱好者来说,这也许暂时不是什么严重的问题了。
转至:http://www.leiphone.com/news/201512/bMLT4bE88swBjG19.html?foxhandler=RssReadRenderProcessHandler
在讨论全景视频的未来之前,我们先搞清楚全景视频是如何实现的[转]
标签:
原文地址:http://www.cnblogs.com/1024Planet/p/5674412.html