2

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

而且我走对了,它可以很好地进行 2 小时的编码。但我有一个问题:

  • 我正在使用 opencv 2.4,周围有一些选项.. 见这里。哪一个是最好的?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 轴的向量之间的角度,但效果不佳。一些提示?

  • 现在我正在用 opencv 绘图 api 绘制东西,但是从 2.4 开始,也有 opengl 支持.. 应该很好,但我没有找到这方面的例子..

4

2 回答 2

4

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

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

于 2012-09-28T07:03:12.207 回答
2

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

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

于 2013-01-16T16:05:59.603 回答