我想使用Farneback Dense光流跟踪每个像素作为15帧的时间窗口的特征点。使用flow = cv2.calcOpticalFlowFarneback(prvs,next,None,0.5,3,15,3,5,1.2,0),它显示前一帧中每个像素的dx和dy。在这里,我想跟踪超过15帧的某些特征点像素,并找到该特征点的速度。
如何通过特征点的密集光流来估计速度,该特征点具有随时间变化的轨迹长度L的一系列空间位置?
答案 0 :(得分:1)
您已经有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
我希望这对您有所帮助,即使不是,请留下评论。