运动物体的光流:几个点

Posted

技术标签:

【中文标题】运动物体的光流:几个点【英文标题】:optical flow for moving object: few points 【发布时间】:2012-09-27 18:09:10 【问题描述】:

我正在尝试做这样的事情: http://www.youtube.com/watch?feature=player_embedded&v=MIYt1yNwoZU

而且我的方法是正确的,它可以很好地进行 2 小时的编码。但我有一个问题:

我使用的是 opencv 2.4,有一些选项可供选择。请参阅 here。哪一个是最好的? lucas kanade 有一些自动特征检测?或者也许一个简单的全球定位就足够了?甚至卡尔曼滤波器?现在我正在使用密集的 farneback 算法,我认为这是第一个(= 更简单)选项,但可能不是最好的。

在计算图像上的光流后(为了计算光流而缩小 2 倍,因为这是一项艰苦的工作),我取向量的平均值。正常平均值,将所有这些相加并除以向量的数量。所以在流垫上有一个嵌套的for循环。更好的方法?

Point2f average_motion(0,0); float n=1;

for(int y = 0; y < flow.rows; y += step)
    for(int x = 0; x < flow.cols; x += step) 

        const Point2f& fxy = flow.at<Point2f>(y, x);

        if( abs(fxy.x) > threshold || abs(fxy.y) > threshold) 
            average_motion += fxy;
            n++;
        

    
 average_motion *= 1/n;

 average_motion *= 1/n;
 cout << average_motion << endl;

我正在移动矩形,但向右/向左移动似乎有点奇怪,而向上/向下移动真的很好!谁能解释一下为什么?

翻译没问题,但我被困在旋转中……如果我得到平均向量,我怎么能得到度数?我尝试过使用 X 轴的向量之间的角度,但效果不佳。有什么提示吗?

1234563

【问题讨论】:

您是否尝试过使用姿势估计函数来获得旋转/平移?也许estimateRigidTransform? 【参考方案1】:

光流的最佳方法是使用卡尔曼滤波器来预测运动,这样您就可以在该方向上投影补丁并减少下一帧的搜索区域。提高计算速度。

坏消息是让卡尔曼滤波器正确跟踪是一项艰巨的任务。

【讨论】:

【参考方案2】:

我建议使用 Lucas Kanade 方法,因为它非常快。或者您可以使用类似于 Lucas Kanade 的RLOF 的 GPU 实现。不要估计密集的运动矢量场,只需估计网格的运动矢量(例如每 5 个像素),这可以节省大量运行时间。或者播种特征以跟踪您要移动的矩形。要移动你的矩形,估计转换矩阵会更优雅,例如通过 cv::getPerspectiveTransform 或 cv::getAffineTransform 进行仿射或透视。仿射变换包含平移、旋转和缩放,而透视图也包含转向。 (RANSAC 是一个很好的估计器)。矩形点的新位置可以很容易地通过矩阵运算来计算。

[x,y,1] = 矩阵 * [x_old, y_old, 1],参见 OpenCV 文档

【讨论】:

以上是关于运动物体的光流:几个点的主要内容,如果未能解决你的问题,请参考以下文章

光流法

EmguCV:使用光流在运动物体上绘制轮廓?

目标跟踪基于matlab光流法运动视频跟踪含Matlab源码 1357期

目标跟踪基于matlab光流法运动视频跟踪含Matlab源码 1357期

用光流旋转物体?

光流(Optical flow)-视频分析基础概念