光流场是什么
对第 N 帧的每个像素,它给出这个像素在第 N+1 帧里所处位置的水平和垂直偏移量。可视化出来通常是一张彩色图:色相代表方向,饱和度代表速度。
有三个性质值得记住,因为几乎所有瑕疵都能追溯到其中之一。
- 它假设存在对应关系。 一个像素必须在两帧里都存在。凡是新出现、消失、或者躲到别的东西背后的内容,都没有合法向量。
- 它是有方向的。 前向(N 到 N+1)和后向是分别算的,而且一定会有分歧。比较这两份结果正是检测遮挡的标准做法:有分歧说明其中一份在猜。
- 它只做测量,不做理解。 它不知道一条胳膊是胳膊。两块看起来一样的区域,对它来说可以随意互换。
光流在生成里出现在哪
- 插帧。 慢动作和帧率转换的做法是把前后两帧各沿向量走一半,再做混合。
- 视频转视频与风格化。 把上一帧的风格化结果按光流形变到当前帧的几何上,当作起点,风格就得以延续,而不是每帧重新发明一次。这是它最重要的用途。
- 逐帧编辑。 在一帧上做的遮罩、补光、局部重绘,沿着这份运动图往后传,而不是每帧重算。
- 放大与降噪。 把相邻帧的细节对齐后合并,这也是视频放大能还原出单帧放大器凭空造不出来的细节的原因。
它会怎么失效,屏幕上长什么样
- 位移过大。 快摇和甩镜超出了搜索范围。结果是向量塌向零,画面不是在动而是在顿。
- 遮挡边界。 运动物体的边缘外侧没有可匹配的内容。结果是鬼影和半透明拖尾,在手、头发、细长物体上最明显。
- 重复纹理。 草地、水面、砖墙、栅栏到处长得一样,匹配是多解的。结果是光流游走,那块区域一直在闪。
- 运动模糊和暗光。 模糊把匹配所需的特征毁了,噪点又造出不存在的特征。
- 镜头切换。 两帧毫无关系时算出来的是垃圾。任何基于光流的处理之前都必须先按剪辑点切开,因为一个坏边界能污染它后面的全部结果。
有人说「不一致」时该改哪一步
「这段视频不稳」是个笼统的说法,但具体症状能直接指出该动管线的哪一段。
- 纹理在沸腾、边缘像有虫在爬:说明各帧是独立生成的,完全没有光流引导。
- 运动边缘后面拖着鬼影:是遮挡处的估计误差,减小传播步长,或者从更近的帧插值。
- 一种越到后面越明显的果冻式变形:说明沿链传播在漂,每隔几秒用一张新的关键帧重新锚定。
- 主体的脸或衣服换了个人:这跟光流一点关系都没有。这份运动图里没有任何东西控制外观,该改的是条件输入,通常是加一张参考帧。