步骤三、假设你知道场景中每一个点的颜色和三维位置,你只需要设置一台不断移动的(虚拟)相机,然后把这些点投影到相机上,注意远处的点可能被近处的点遮住,就生成了楼主所说的动画。因为每一个点的位置都在沿着摄像机光心和图像上那个点的连线延长线上,但是不知道具体往外走多少,因此实际上缺乏的是每一点的深度。

步骤二、假如知道每一个相机的位置和朝向以及相机参数,可以通过三角定位算法恢复出两幅图像公共部分上的一些点的三维位置,其他的点的三维位置可以由这些先被求出的点的位置插值获得。也可以通过双目视觉的标准算法获得每一点的深度,其原理是:如果当前点的深度正确,那么在两个摄像头的成像下应该位置和两幅图片上一样,否则就把当前点朝前或朝后移动一些。然后回到步骤三。

步骤一、如果只有两幅图像,没有相机的位置信息和相机参数,那么仍然可以通过一些复杂的算法,估计出两个相机的参数和它们之间的朝向变化,这种估计是不准确的。可以近似把两个摄像机(虚拟地)校正到朝向相同。

可以看出,整个流程最关键的就是给每一个点找一个深度值。一种偷懒但效果异常好的方法是是通过人为画一幅深度图。比如用黑色表示离摄像头最远、白色表示最近,因为由近及远依次是:小圆的刘海、鼻子、眼睛,丘比的眼睛、耳朵,小圆的萌辫,就把它们依次从白色渐变涂成黑色。这幅图就是深度图,如果你画的足够好,那么出来的三维成像结果也很棒。

下面给你展示一下我用最笨的视觉方法全自动完成整个过程的结果:
一、校正,让左图中每一个点在右图上也在同一行上。

使用两张角度不同的静态图像合成连贯的动画,难度有多大?插图

二、算双目视差图,也就是深度图。这样就可以知道每一点离摄像机有多远,一般颜色越白离相机越近。好的视差图生成算法生成的深度图是连续的,并且能够把洞补上。楼上所述的光流法就是用在这一步,Horn和Schunck在1981最早在计算机视觉领域提出光流法,是相关领域最重大的进展之一。

使用两张角度不同的静态图像合成连贯的动画,难度有多大?插图1

三、重建。这一步就是要把各个像素点朝后移动到它的深度图所指定的位置上,然后就可以随意拍摄照片或视频了。想获得较好的效果可以从原始图像上提取一系列小三角形面片贴到空间三角形网格上(本示例中只是把所有像素点挪到合适的位置)。从左边看丘比应该被小圆挡着,从右边看恰好相反。

从正面看:

使用两张角度不同的静态图像合成连贯的动画,难度有多大?插图2

从右边看:

使用两张角度不同的静态图像合成连贯的动画,难度有多大?插图3

从左面看:

使用两张角度不同的静态图像合成连贯的动画,难度有多大?插图4

完全自动地执行这一过程有些复杂,但它的原理和后续改进也正是这二十年来计算机视觉领域最突出的成就之一。即使在现在,如果去翻阅最新的计算机视觉领域顶级期刊比如IJCV、PAMI、依然能经常看到计算视差图的改进算法。

遗憾的是,即使是最好的算法,也无法解决生成的重建图上有洞这一缺陷,因为原始图像中原本就缺乏足够的信息。如果仍然想自动生成,可以围着场景拍摄一系列图像然后用多视图几何理论重建。

— 完 —

本文作者:王小龙

【知乎日报】
你都看到这啦,快来点我嘛 Σ(▼□▼メ)

此问题还有 8 个回答,查看全部。

分享到