如何使用光流图像将后一帧扭曲到前一帧

Posted

技术标签:

【中文标题】如何使用光流图像将后一帧扭曲到前一帧【英文标题】:How to warp the later frame to previous frame using optical flow image 【发布时间】:2017-05-18 07:21:24 【问题描述】:

我只有两张图片,一张是当前帧,一张是其他方式计算出来的光流图。

当前帧是:

光流图为:

我的问题是如何使用这两个图像计算前一帧?

我看到了一种解决方案,只是使用双线性插值将当前帧扭曲到带有光流图像的最后一帧。但我不知道该怎么做。

那么,有人可以给我一些建议或想法吗?非常感谢。

【问题讨论】:

参见:OpenCV warping image based on calcOpticalFlowFarneback。 【参考方案1】:

您正在寻找 opencv 函数remap。如果您有当前图像 (currImg) 和光流垫 (flow),那么您可以通过首先反转光流然后应用函数 remap 来预测前一个图像。在python中代码如下:

import cv2
h, w = flow.shape[:2]
flow = -flow
flow[:,:,0] += np.arange(w)
flow[:,:,1] += np.arange(h)[:,np.newaxis]
prevImg = cv2.remap(curImg, flow, None, cv.INTER_LINEAR)

【讨论】:

您好!只是好奇:在这里反转光流有什么意义?如果流程是从上一个图像到当前图像,根据cv2.remap的公式,dst(x,y) = src(map_x(x,y),map_y(x,y))。您的代码基本上是在将网格添加到流程中吗? 光流通常是从前一个图像竞争到当前图像。如果要从当前图像中获取上一个,则必须反转流向

以上是关于如何使用光流图像将后一帧扭曲到前一帧的主要内容,如果未能解决你的问题,请参考以下文章

光流算法:关于根据光流(单目)或视差(双目)进行图像变换的原理

为啥我的 SwiftUI 动画在旋转时恢复到前一帧?

如何在opencv中使用光流跟踪来分割图像?

如何使用光流和 grid_sample 扭曲图像?

从前一帧和光流创建帧

SVO 代码笔记