使用光流对图像进行对流

Convection of an image using optical flow

我有两个图像(frame1 和 frame2),我可以使用 opencv 计算 u,v:

flow = cv2.calcOpticalFlowFarneback(prvs,next, 0.5, 1, 3, 15, 3, 5, 1, 0)

我想使用这个 u,v 来翻译 frame1,以使用各种光流方法量化差异的质量。我打算使用这些 u,v.

进行推断

有没有简单的方法可以做到这一点?

计算简单翻译的一种方法是平均流量:

avg_u = np.mean(flow[:, :, 0])
avg_v = np.mean(flow[:, :, 1])

这给出了翻译所需的向量 (avg_u, avg_v)


关于您的评论,您似乎想将每个像素 (x,y) 移动到其流矢量指定的位置 (u(x,y), v(x,y))

首先,生成笛卡尔网格:

height, width = flow.shape[0, 1]
R2 = np.dstack(np.meshgrid(np.arange(width), np.arange(height)))

然后,所需的映射只是将此网格与流相加:

pixel_map = R2 + flow

最后,执行cv2.remap:

new_frame = cv2.remap(prev_frame, pixel_map)