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获得代表特定像素的速度 vector /幅值而不是整个形状的特定像素的平均值?
这是我尝试过的:
    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。我假设您的意思是后者,因此我将其用作要更改的列表。

10-07 15:42