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

时间:2020-09-23 16:49:06

标签: python image numpy opencv

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))

1 个答案:

答案 0 :(得分:2)

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

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

NB:在您的第一个代码段中,要更改的列表称为total_magnitude,但在后面的示例代码段中,其名称为total_frames_magnitude。我以为您是说后者,所以我将其用作要更改的列表。