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
。我假设您的意思是后者,因此我将其用作要更改的列表。