OpenCV calcOpticalFlowFarneback:如何从特定像素中提取速度矢量值



calcOpticalFlowFarneback python的标准代码。

import numpy as np
import cv2
cam = cv2.VideoCapture("video.mp4")
ret, prev = cam.read()
prevgray = cv2.cvtColor(prev, cv2.COLOR_BGR2GRAY)
coords = np.array([
[230, 218, 205, 189, 176, 156],
[145, 156, 162, 166, 166, 165]
])
total_magnitude = []
while True:
ret, img = cam.read()
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
flow = cv2.calcOpticalFlowFarneback(prev=prevgray,
next=gray,
flow=None,
pyr_scale=0.5,
levels=10,
winsize=15,
iterations=3,
poly_n=5,
poly_sigma=1.2,
flags=0)
mag, ang = cv2.cartToPolar(flow[..., 0], flow[..., 1])

如何从表示特定像素的速度矢量/大小而不是整个形状的mag中获取特定像素的平均值?

这是我尝试过的:

mag, ang = cv2.cartToPolar(flow[..., 0], flow[..., 1])
single_frame_magnitude = []
for counter in range(coords.shape[1]):
x = coords[:, counter][0]
y = coords[:, counter][1]
single_frame_magnitude.append(mag[x][y])
total_frames_magnitude.append(np.mean(frame_mag_list))

coords只是 2D NumPy 数组,其中第一列包含行位置,第二列包含列位置。 您可以使用它们以矢量化形式索引到数组中以获取感兴趣的值,然后找到那些一起逃避循环需求的平均值:

mag, ang = cv2.cartToPolar(flow[..., 0], flow[..., 1])
values = mag[coords[:,0], coords[:,1]]
total_frames_magnitude.append(np.mean(values))

注意:在您的第一个代码片段中,您要更改的列表称为total_magnitude但在随后的示例代码片段中,它称为total_frames_magnitude。 我假设你的意思是后者,所以我用它作为列表来改变。

最新更新