如何使用像Farneback这样的密集光流方法跟踪稀疏特征?
How can I track sparse features using a dense optical flow approach like Farneback's?
我已经可以使用OpenCV中实现的Lucas Kanade跟踪SIFT或SURF特征,因为Lucas Kanade以任何方式跟踪稀疏特征,但是我正在尝试使用OpenCV中实现的Farneback光流算法来跟踪这些稀疏特征,有没有算法?
实时密集光流跟踪
请观看此视频:
开发人员声称他们使用密集方法"Farneback"而不是稀疏方法"Lucas-Kanade"跟踪选定的稀疏特征。他们是怎么做到的?
要追踪具有密集光流场的特征,可以按如下方式flow
:
// read images
cv:Mat prevImg = cv::imread( filename0 ); // image data at time t
cv::Mat currImg = cv::imread( filename1 ); // image data at time t and t + 1
cv::Mat flowMat; // storage for dese optical flow field
std::vector<cv::Point2f> prevPoints; // points to be track
// initialize points to track (example)
prevPoints.push_back( cv::Point2f( 50.3f, 30.f ) );
std::vector<cv::Point2f> currPoints( prevPoints.size()); // tracked point position
// compute dense flow field (example)
cv::calcOpticalFlowFarneback(prevImg, currImg, flowMat, 0.4, 1, 12, 2, 8, 1.2, 0);
// track points based on dense optical flow field and bilinear interpolation
for( unsigned int n = 0; n < prevPoints.size(); ++n )
{
float ix = floor(prevPoints[n].x);
float iy = floor(prevPoints[n].y);
float wx = prevPoints[n].x - ix;
float wy = prevPoints[n].y - iy;
float w00 = (1.f - wx) * (1.f - wy);
float w10 = (1.f - wx) * wy;
float w01 = wx * (1.f - wy);
float w11 = wx * wy;
if( prevPoints[n].x >= flowMat.cols - 1 || prevPoints[n].y >= flowMat.rows - 1)
{
// these points are out of the image roi and cannot be tracked.
currPoints[n] = prevPoints[n];
}
else
{
/*
bilinear interpolation of the flow vector from the flow field at a given location.
The bilinear interpolation has to be applied since the points to track can be given at subpixel level
*/
currPoints[n] = prevPoints[n]
+ flowMat.at<cv::Point2f>(iy, ix) * w00
+ flowMat.at<cv::Point2f>(iy+1, ix) * w10
+ flowMat.at<cv::Point2f>(iy, ix+1) * w01
+ flowMat.at<cv::Point2f>(iy+1, ix+1) * w11;
}
}
}
OpenCV 中有一个函数 calcOpticalFlowFarneback(( 来做到这一点。
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 通过方法访问结构
- 如何使用像Farneback这样的密集光流方法跟踪稀疏特征?
- 是否有一种便携式/标准的方法可以在堆栈跟踪中获取文件名和亚麻布
- Java,这是可能的吗?自动方法范围跟踪,就像C++中的宏一样
- 在 c++ 中通过 int id 跟踪少量结构类型的有效方法是什么
- 在 c++ 类中编写许多 void 方法,并跟踪变量更改
- 是否有C++11或Win32方法可以可靠地生成和保存跟踪信息
- 在Lua中跟踪变量以进行读访问,以启动用户定义的c++方法/函数
- 跟踪Visual Studio / Nice调试器中所有函数的方法
- 在QTreeView/QStandardItem中跟踪对象的正确方法是什么?
- 是否有一种方法来跟踪点后应用转换与openGL
- Android应用跟踪点:Video.calcOpticalFlow(..)方法不能正常工作
- 来自回溯的堆栈跟踪未显示导致多线程环境下崩溃的方法
- 什么是同时运行跟踪软件和服务器的正确方法?(OpenCV 3)
- 是否有一种方法可以从Linux发行版二进制文件中转储带有行号的堆栈跟踪信息?
- 使用3个位置和法线对光线跟踪插值三角形曲面的最佳方法
- c++中跟踪函数调用的方法
- 在c++中跟踪父类有多少个派生类的最好方法是什么?
- 跟踪GPU内存泄漏的专业方法(分配而不释放)