首页 > 解决方案 > 如何在 15 帧的时间窗口的密集光流中找到特征点(某些像素)的速度?

问题描述

我想使用 Farneback Dense 光流跟踪每个像素作为 15 帧时间窗口的特征点。使用 flow=cv2.calcOpticalFlowFarneback(prvs,next,None,0.5,3,15,3,5,1.2,0) ,它显示了前一帧中每个像素的 dx 和 dy。在这里,我想跟踪 15 帧以上的某个特征点像素并找到该特征点的速度。

如何通过具有一系列空间位置的特征点随时间的轨迹长度 L 的密集光流来估计速度?

标签: pythonopencvopticalflow

解决方案


你已经有了 dx 和 dy。有了这些信息,如果你知道时间,你总是可以知道这个像素的速度t

vx =  dx / t
vy =  dy / t

dx 和 dy 可以是负数,因此它会保持某种方向......请记住,原点是左上角并且指向右下角。

这样,您可以获得每个维度每帧每个像素的速度。您可以随时跟踪像素并计算其轨迹长度并将其除以时间,您可以说是像素的平均速度。

为此,您计算轨迹中每个点的长度:

length =  sqrt(dx**2 + dy**2)

并在像素之后添加它们,我的意思是:

totalLength = length(prev1[y,x]) + length(prev2[y+prev1[y,x][1], prev2[x+prev1[y,x]][0]]) ....

然后将 totalLength 除以时间。

如果你想要总位移的速度,我的意思是从初始点到终点的速度(如果像素来回移动可能是 0)然后只需通过添加位移来跟踪像素,然后计算速度.

disp = (x,y) + prev1[y,x] + prev2[y,x] ...
speed = disp / t

我希望这对您有所帮助,如果没有,请发表评论。


推荐阅读