gpt4 book ai didi

python - 如何从OpenCV calcOpticalFlowFarneback中提取像素的速度矢量-Python版本)

转载 作者:行者123 更新时间:2023-12-02 16:17:27 27 4
gpt4 key购买 nike

我想提取两帧之间每个像素的光流速度 vector 。我正在使用OpenCV函数,如下所示:

flow = calcOpticalFlowFarneback(Previous_Gray, Current_Gray, Optical_Flow, 0.5, 3, 15, 3, 5, 1.2, 0);

Previous_Gray = previous frame
Current_Gray = current frame

我想知道 flow的格式是什么以及如何提取它。

谢谢您的任何帮助! :-)

附言我知道我的问题与这个问题几乎相同: How to extract velocity vectors of a pixels from calcOpticalFlowFarneback。但是,我使用Python进行编码,请使用Python解决方案。

最佳答案

下面给出的是通过Farneback方法计算每帧光通量的python代码片段。尽管下面给出的内容不是完整的工作代码(网络上有足够的示例),但它显示了流量的计算方法。

#use this params
farneback_params={
'pyr_scale':0.5,
'levels':3,
'winsize':15,
'iterations': 3,
'poly_n': 5,
'poly_sigma':1.2,
'flags':cv2.OPTFLOW_USE_INITIAL_FLOW
}

#do initializations
while True:
#for every frame,
#get current_frame_gray
flow = cv2.calcOpticalFlowFarneback(prev_frame_gray, current_frame_gray, flow, **farneback_params)
prev_frame_gray = current_frame_gray

如果假设每个帧的尺寸为H x W,则以下断言成立。
assert(flow.shape == (H, W, 2))
assert(flow.dtype == numpy.float32)

如果您查看以下有关Farneback方法的文档,
http://docs.opencv.org/3.0-beta/modules/video/doc/motion_analysis_and_object_tracking.html,以下语句适用
for r in range(H):
for c in range(W):
prev_frame_gray[r,c] corresponds to current_frame_gray[r + flow[r,c, 1], c+ flow[r,c,0]]

因此,上一帧(prev_frame_gray)的每个像素的速度分量为
flow[r,c,0] in x- direction (columns)
flow[r,c,1] in y- direction (rows)

就像上面的各种代码示例所示,您可以通过以下简单命令轻松地以极性形式(大小, Angular )表示流量
mag, ang = cv2.cartToPolar(flow[...,0], flow[...,1])

mag和ang的形状为(H,W),类型为numpy.float32。 Angular 结果给出的 Angular 在0-2pi范围内。

关于python - 如何从OpenCV calcOpticalFlowFarneback中提取像素的速度矢量-Python版本),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43351950/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com