你可能已经了解到一些电影特效大片的制作过程,拍摄时演员身旁是纯色屏障和一些道具,穿着奇怪的衣服对着空气拳打脚踢、施展魔法。而到了影片里,演员却出现在惊险的树林,或是跟凶恶的怪兽打斗,画面变得格外精彩。能演电影是幸运的事,借助于现代机器视觉、计算机图形技术,或许你拿起手机也可以拍摄出你的超级大片。

It's about the network
魔兽 Warcraft(2016)
It's about the network
魔兽 Warcraft(2016)电影制作花絮

上图摄像机拍摄到的是蓝屏、道具、草地、穿着奇怪衣服的演员,衣服能够提供肢体的相对位置信息,如何把这样的图像和数据变成电影中画面?

设想一个三维场景,将拍摄到的图像放到场景中。通过色彩过滤蓝色部分可以替换为任意图像或是场景模型,比如影片中的树林。同样的,大树的位置可以放一颗大树模型。草地添加一些修饰就差不多,如果用模型代替就比较麻烦,因为兽人跑过会带风,风会引起小草晃动还可能带起地上几片落叶,而小草、落叶的运动都得符合物理规律,这样就需要引入物理引擎来模拟模型的运动,会增加大量的制作工作。

然后是那个兽人,拍摄到的图像里有演员,还有演员肢体的位置信息。同样的,穿着纯色奇怪衣服的演员可以轻松拿掉,而需要在三维场景里换上兽人角色模型。演员的体型没有兽人那么庞大,关键点通过一定的算法将演员映射为兽人,通过肢体关键点绑定可以让兽人的动作和演员的动作保持一致。真人的动作自然而且符合物理规律,不需要添加额外的物理计算,影片中你可以感受到兽人和人类很像。

将所有的图像帧做类似的处理并且保存就成了一个特效视频,当然,这里说的只是一个大概原理,实际电影特效处理远比这些要复杂而且远不止这些。回到开头提到的“手机拍大片”,类似的原理,得到人物姿态数据然后合成视频。不过姿态数据不通过专业设备获取,而是通过神经网络对图像分析得出。

上面的演示是读取视频帧(画面也可以取自摄像头),对画面做人物姿态的图像识别。左边是原始视频,右边是姿态识别并标注后的视频,为了对比我把 2 个视频合成了一个演示视频。从图像中检测关键点没法做到专业设备那么精准,也没法做到奇怪的衣服上那么丰富自由的关键点。然而图像分析可以很方便获取到姿态信息,对着摄像头自拍就行。上面的演示你会发现一些错误帧,因为画面质量比较差,人物动作稍快的地方视频图像是模糊的(比如手的挥动,不是所有帧都能看得清手),导致神经网络没法检测到所有关键点。这里用到的神经网络模型能够在一定的遮挡下估计出姿态,但是低质量图像却已经超出了他的设计范围。当然,错误帧可以去掉。

得到粗糙的姿态数据后就可以做进一步的合成,可以像电影一样构造一个虚拟场景,构造一个虚拟人物模型跟着真人跳舞。下面的演示中(左边是原始视频,右边则是合成视频),简单的贴了一张巴黎的场景图片,导入姿态数据设置一个位置渲染模型(这里的模型仅仅是贴了一个头像还有简单的连线),同步合成的视频(右边)即是“模型”按照人物的动作跳舞。

稍微复杂一点,如果把模型放到另外一个视频里,看起来即就有点电影的效果。下面的演示也类似(左边是原始视频,右边则是合成视频),简单截取了一段游戏过程(Diablo 3 武僧跳舞)视频,导入做真人动作的模型,然后合成新视频。左右 2 个视频都在动,但是右边的“小女孩”做的动作和原始视频真人的动作是一致的。

如果愿意做大工程,则可以使用图形引擎构造一个虚拟世界,导入三维模型角色,绑定人物的动作,让虚拟角色在虚拟世界里做真人的动作。也可以做精细的图像分割,将人物从视频中取出来,放到其他视频或是虚拟场景里。用手机拍摄你的大片。

参考:

OpenPose https://github.com/CMU-Perceptual-Computing-Lab/openpose
OpenCV https://github.com/opencv/opencv