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

Posted

技术标签:

【中文标题】如何在 15 帧的时间窗口的密集光流中找到特征点(某些像素)的速度?【英文标题】:How can I find speed of a feature point (certain pixel) in dense optical flow for temporal window of 15 frames? 【发布时间】:2019-01-15 03:42:28 【问题描述】:

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

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

【问题讨论】:

如果你计划随着时间的推移跟踪一个特征,也许稀疏光流更好(至少更快),但是你总是可以使用这个 dx 和 dy 来跟踪一个像素移动,只要得到这个的长度矢量并将其全部相加并除以时间,您将获得速度(如果您希望它有方向,那么您需要多做一点)。问题是,这将在每一步中离散化,并且您会失去特征跟踪的准确性,因此我认为使用稀疏方法跟踪特征会更准确 正如我在一篇论文中读到的,通过密集轨迹跟踪可以检测到比稀疏光流更快/不规则的运动。当我在视频中进行人群行为检测时,我需要检测快速运动。我需要删除视频中的静态点并找到该像素的运动速度/方向 【参考方案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]]) ....

然后将总长度除以时间。

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

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

希望对你有帮助,如果没有,请发表评论。

【讨论】:

谢谢。正如我从上面了解到的那样,我可以在假设(0,0)位置移动到(32,23)像素.position 处跟踪特征点。我将使用中值过滤跟踪。如何从密集轨迹中去除静态特征特征点?这是通过检查dispalcement是否高于阈值? 如果位移低于 3 像素,那么它不会移动。但请记住使用长度或其他东西。我不记得 OpenCV 如何处理消失的像素(移出图片),所以你也应该小心

以上是关于如何在 15 帧的时间窗口的密集光流中找到特征点(某些像素)的速度?的主要内容,如果未能解决你的问题,请参考以下文章

如何在openCV python中将背景减法与密集光流跟踪相结合

OpenCV 中的光流颜色图

如何在蒙版图像上进行基于网格(密集)的光流?

特征点法,光流法,这两种方法在图像点跟踪中的实现

SVO 代码笔记

计算视频帧中物体的速度 - 光流(Matlab)