使用 FFmpeg 计算光流大小

Posted

技术标签:

【中文标题】使用 FFmpeg 计算光流大小【英文标题】:Use FFmpeg to calculate Optical Flow magnitude 【发布时间】:2020-04-01 21:19:47 【问题描述】:

我正在尝试使用FFmpeg 来计算短视频中的总光流值(或运动值)。有没有命令可以做到这一点?如果速度更快,也愿意接受任何替代方法。

我目前正在使用 PythonopenCV 来做到这一点:

def getOpticalMag(prev_image, curr_image):

    prev_image_gray = cv2.cvtColor(prev_image, cv2.COLOR_BGR2GRAY)
    curr_image_gray = cv2.cvtColor(curr_image, cv2.COLOR_BGR2GRAY)

    flow = cv2.calcOpticalFlowFarneback(prev_image_gray, curr_image_gray, flow=None,
                                        pyr_scale=0.5, levels=1, winsize=15,
                                        iterations=2,
                                        poly_n=5, poly_sigma=1.1, flags=0)
    mag, ang = cv2.cartToPolar(flow[...,0], flow[...,1])

    return np.mean(mag)

【问题讨论】:

【参考方案1】:

您正在寻找的是直接从编码的视频流中提取运动矢量。 FFmpeg 没有为此提供接口。这个 git https://github.com/jishnujayakumar/MV-Tractus 可能很有趣。

另一方面,因为您正在寻找平均运动。您可以调整输入图像的大小(下采样 2 或 4 倍)和/或使用更快的方法,如 DIS 流。另一种优化策略是使用金字塔 Lucas Kanade 方法计算非常稀疏网格的运动向量。

【讨论】:

以上是关于使用 FFmpeg 计算光流大小的主要内容,如果未能解决你的问题,请参考以下文章

基于 OpenCV C++ 光流的分割代码抛出异常

用于计算光流空间导数的 Python 库

使用光流计算实际速度

计算视频帧中物体的速度 - 光流(Matlab)

如何计算光流的时间导数

在计算光流时,为啥帧没有价值?