【问题标题】: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

【问题讨论】:

标签: opencv opticalflow


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2015-01-12
      • 2015-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-01
      相关资源
      最近更新 更多