Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用像Farneback';s_C++_Opencv_Computer Vision_Opticalflow - Fatal编程技术网

C++ 如何使用像Farneback';s

C++ 如何使用像Farneback';s,c++,opencv,computer-vision,opticalflow,C++,Opencv,Computer Vision,Opticalflow,我已经可以使用在OpenCV中实现的Lucas Kanade跟踪SIFT或SURF特征,因为Lucas Kanade以任何方式跟踪稀疏特征,但是我尝试使用在OpenCV中实现的Farneback光流算法跟踪这些稀疏特征,有算法吗 请查看此视频: 开发人员声称,他们使用密集方法“Farneback”而不是稀疏方法“Lucas Kanade”跟踪选定的稀疏特征。他们是如何做到的?OpenCV中有一个函数可以做到这一点。要跟踪具有密集光流场流的特征,可以按以下步骤进行: // read images

我已经可以使用在OpenCV中实现的Lucas Kanade跟踪SIFT或SURF特征,因为Lucas Kanade以任何方式跟踪稀疏特征,但是我尝试使用在OpenCV中实现的Farneback光流算法跟踪这些稀疏特征,有算法吗

请查看此视频:


开发人员声称,他们使用密集方法“Farneback”而不是稀疏方法“Lucas Kanade”跟踪选定的稀疏特征。他们是如何做到的?

OpenCV中有一个函数可以做到这一点。

要跟踪具有密集光流场
流的特征,可以按以下步骤进行:

// 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;
  }
}

}
//读取图像
cv:Mat prevImg=cv::imread(filename0);//时间t处的图像数据
cv::Mat currImg=cv::imread(文件名1);//时间t和t+1处的图像数据
cv::Mat flowMat;//dese光流场的存储
std::向量prevPoints;//要跟踪的点
//初始化要跟踪的点(示例)
前推点(cv::Point2f(50.3f,30.f));
std::向量currPoints(prevPoints.size());//跟踪点位置
//计算稠密流场(示例)
cv::calcOpticalFlowFarneback(prevImg,currImg,flowMat,0.4,1,12,2,8,1.2,0);
//基于稠密光流场和双线性插值的跟踪点
for(无符号整数n=0;n=flowMat.cols-1 | | prevPoints[n].y>=flowMat.rows-1)
{
//这些点位于图像roi之外,无法跟踪。
currPoints[n]=prevPoints[n];
}
其他的
{
/*
从给定位置的流场中对流矢量进行双线性插值。
由于要跟踪的点可以在亚像素级给出,因此必须应用双线性插值
*/
currPoints[n]=prevPoints[n]
+流量表at(iy,ix)*w00
+流量表(iy+1,ix)*w10
+流量表at(iy,ix+1)*w01
+在(iy+1,ix+1)*w11处的流程图;
}
}
}

我知道这个函数,Farneback的方法为每个像素提供了一个密集的运动场,但我的问题是如何使用Farneback的函数跟踪一组稀疏的关键点或特征。非常感谢,我正在测试您的代码。最后一个问题:flowMat.at(iy,ix)*cv::Point2f(w00,w00)->这是元素乘法还是叉积?因为这在opencv中不起作用。对不起,我刚刚意识到2D向量的叉积没有意义,所以我假设你指的是元素乘法。谢谢,它有点起作用,但我必须修复一些东西。对不起。我希望现在情况好转。我忘了cv::Point2f有一个使用浮点数的重载乘法运算符。谢谢,我们不应该累加位置:currPoints[n]=currPoints[n]+(flowMat.at(iy,ix)*w00+flowMat.at(iy+1,ix)*w10+flowMat.at(iy,ix+1)*w01+flowMat.at(iy+1,ix+1)*w11);