从前一帧和光流创建帧

Posted

技术标签:

【中文标题】从前一帧和光流创建帧【英文标题】:Create frame from previous frame and Optical Flow 【发布时间】:2020-06-07 11:21:27 【问题描述】:

我有一个视频,我需要使用光流模拟帧;即有一个帧和代表下一帧的像素转换的光流模拟这个随后的结果帧。

我使用 Python 和 OpenCV 如下:

    在两个连续的灰度帧之间生成流
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
flow = cv2.calcOpticalFlowFarneback(prev_gray, gray, None, pyr_scale = 0.5, levels = 5, winsize = 11, iterations = 5, poly_n = 5, poly_sigma = 1.1, flags = 0)

这是第一帧和第二帧之间的流程:

这是以下(目标框架):

    现在,我想使用第一帧和光流来生成第二帧估计。基于this question
height = flow.shape[0]
width = flow.shape[1]
R2 = np.dstack(np.meshgrid(np.arange(width), np.arange(height)))
pixel_map = R2 + flow
prev = original_frames[0].astype("float32")
pixel_map = pixel_map.astype("float32")
new_frame = cv2.remap(prev, pixel_map, None, cv2.INTER_LINEAR)

生成的图像是:

【问题讨论】:

【参考方案1】:

问题已解决,稍微更新代码如下:

h = flow.shape[0]
w = flow.shape[1]
flow[:,:,0] += np.arange(w)
flow[:,:,1] += np.arange(h)[:,np.newaxis]

new_frame = cv2.remap(original_frame, flow, None, cv2.INTER_LINEAR)

【讨论】:

以上是关于从前一帧和光流创建帧的主要内容,如果未能解决你的问题,请参考以下文章

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

SVO 代码笔记

在光流路径场周围创建一个边界框

不能使用光流功能

cv2 Farneback 光流值太低

深度学习之超分辨率,视频增强基础:光流估计与可变性卷积