带有光流的颤动图?

Cha*_*uva 5 opencv opticalflow python-3.x

最近,我正在使用图像进行云运动跟踪,但在视频实现中使用的许多示例中,显示了根据跟踪的对象移动的颤动图。

\n\n

Quiver 文档主要采用四个参数([X, Y], U, V),何时XY是起点和 U方向V。另一方面,基于该示例的p1光流以形状为(200,200)的图像的形状(m,n,l)返回(位移)。我的困惑在于如何对参数进行排序,因为也goodFeaturesToTrack返回与p1

\n\n

\xc2\xbf如何连接两个组件来绘制云运动的颤动?

\n

Gui*_*lem 6

我找到了一个非常好的解决方案。我在这里使用汉堡出租车序列解释我的所有示例:

  1. 下载出租车序列。
$ curl -O ftp://ftp.ira.uka.de/pub/vid-text/image_sequences/taxi/taxi.zip
$ unzip -q taxi.zip
Run Code Online (Sandbox Code Playgroud)
  1. 获取所有图像并随机选择两个帧
from pathlib import Path
import numpy as np
import cv2 as cv
from PIL import Image
import matplotlib.pyplot as plt

taxis_fnames = list(Path('taxi').iterdir())
taxi1 = Image.open(taxis_fnames[rand_idx])
taxi2 = Image.open(taxis_fnames[rand_idx + 4])
Run Code Online (Sandbox Code Playgroud)
  1. 计算光流
flow = cv.calcOpticalFlowFarneback(np.array(taxi1), 
                                   np.array(taxi2), 
                                   None, 0.5, 3, 15, 3, 5, 1.2, 0)
Run Code Online (Sandbox Code Playgroud)
  1. 绘制箭袋
step = 3
plt.quiver(np.arange(0, flow.shape[1], step), np.arange(flow.shape[0], -1, -step), 
           flow[::step, ::step, 0], flow[::step, ::step, 1])
Run Code Online (Sandbox Code Playgroud)

该步骤是对选取的光流向量的数量进行下采样。x 位置从 0 到图像宽度,而 y 位置从图像高度到 0 反转(否则光流将上下颠倒)。在某些情况下,您必须更改步长,以便高度和宽度为可以被它整除。

  1. 结果图像:

在此输入图像描述