为什么我们不在光流中使用来自视频的运动矢量数据?

Why don't we use motion vector data from video in optical flow?

我在 opencv 的光流中看到的所有实现都使用视频作为帧数组,然后在每个图像上实现光流。这涉及将图像切成 NxN 块并搜索速度矢量。

虽然视频编解码器中的运动向量具有误导性,而且它不一定包含运动信息,但我们为什么不用它来检查哪个块可能有运动,然后 运行 这些块上的光流?这不应该加快进程吗?

OpenCV 是一个通用的图像处理框架。它的算法采用 ,而不是压缩视频。

您当然可以编写一个视频解码器,该解码器还将有关从编解码器到 openCV 的位移信息分发出去——但这将是非常特定于编解码器的,因此不在 openCV 本身的范围内。

我清楚地记得读过有关使用嵌入 h.264 和类似编解码器的 "motion" 矢量进行光学 flow/vision 运动分析的学术著作。最简单的方法是迭代估计(例如 Horn 和 Schunk)。可以简单地 bootstrap 使用来自解码器的向量的迭代算法。

这不会提高估计精度,我猜最多只能加快收敛速度​​,允许更早停止。

并非所有的 h.264 编码都具有相同的质量。特别是来自硬件有限的实时系统。在某些情况下,运动矢量可能会非常糟糕,并且实际上会对流估计造成损害而不是帮助。我在想一个低端 IP 摄像机的例子,它专为大多数静态场景设计,在不同的光照下移动等。

为视频编码计算的运动矢量不是 'True Motion Vector'。计算目标是找到最佳匹配块以实现最高压缩。它不以最佳运动估计为目标。这就是为什么它不能很容易地用于运动估计目的的原因。

但是,可以以某种方式使用来自解码器的运动矢量来使运动估计过程更快更好。例如

  1. 作为运动估计算法的种子。
  2. 尝试像中值这样的过滤器(取决于数据)来移除离群值运动向量并将其用于更好的运动估计。
  3. 上述步骤之一可以用作两步运动估计算法的第一步。