最近我在使用图像进行云运动跟踪,但在许多示例中,当在视频实现中使用 时,会显示根据跟踪对象移动的颤动图。
Quiver 文档主要采用四个参数 ([X, Y], U, V)
,当 X
和 Y
是起点时以及 U
和 V
方向。另一方面,基于this example的光流返回形状为 (200,200) 的图像的形状为 (m, n, l) 的 p1
(位移)。我的困惑在于如何对参数进行排序,因为 goodFeaturesToTrack
返回的结果与 p1
¿如何连接这两个组件来绘制云运动的颤动?
最佳答案
我找到了一个很好的解决方案。我在这里使用汉堡出租车序列解释我的所有示例:
- 下载出租车序列。
$ curl -O ftp://ftp.ira.uka.de/pub/vid-text/image_sequences/taxi/taxi.zip
$ unzip -q taxi.zip
- 获取所有图像并随机选择两个帧
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])
- 计算光流
flow = cv.calcOpticalFlowFarneback(np.array(taxi1),
np.array(taxi2),
None, 0.5, 3, 15, 3, 5, 1.2, 0)
- 绘制箭袋
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])
该步骤是对选取的光流矢量数量进行下采样。 x 位置从 0 到图像宽度,而 y 位置从图像高度反转(否则光流将上下颠倒)从图像高度到 0。在某些情况下,您将不得不更改步长,以便高度和被它整除。
- 生成的图像:
关于python-3.x - 带有光流的箭袋图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61943240/