我正在尝试这样做: 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;
我正在移动rects但是左/右移动似乎有点奇怪,而上/下工作真的很棒!有人可以解释我为什么?
翻译是好的,但我仍然坚持旋转..如果我得到平均向量,我怎么能获得学位?我尝试过使用X轴的矢量之间的角度,但是效果不好。一些提示?
现在我用opencv绘制api绘制东西,但是从2.4开始也有opengl支持..应该很好,但我没有找到示例...
答案 0 :(得分:4)
光流的最佳方法是使用卡尔曼滤波器来预测运动,因此您可以在该方向上投影补丁并减少下一帧的搜索区域。提高计算速度。
坏消息是,正确制作卡尔曼滤波器是一项艰巨的任务。
答案 1 :(得分:2)
我会建议使用Lucas Kanade方法,因为它非常快。或者您可以使用RLOF的GPU实现,这类似于Lucas Kanade。不要估计密集运动矢量场只估计网格的运动矢量(例如每个第5个像素),这样可以节省大量的运行时间。或者根据要移动的矩形来跟踪要跟踪的要素。要移动矩形,估计变换矩阵会更优雅,例如cv :: getPerspectiveTransform或cv :: getAffineTransform的仿射或透视。仿射变换包含平移,旋转和缩放,透视图还包含原理图。 (两个RANSAC都是一个很好的估算者)。通过矩阵运算可以很容易地计算矩形点的新位置。
[x,y,1] = Matrix * [x_old,y_old,1],参见OpenCV文档