OpenCV calcopticalflowfarnback: как извлечь значения вектора скорости из определенных пикселей

#python #image #numpy #opencv

#python #изображение #numpy #opencv

Вопрос:

Стандартный код для calcopticalflowfarnback 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:

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 . Я предположил, что вы имели в виду последнее, поэтому я использовал это в качестве списка для изменения.