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