我的opencv光流代码没有很好的结果

时间:2014-12-28 12:39:51

标签: c++ opencv image-processing opticalflow

您好我经历了几个资源(如opencv网站,opencv示例代码等)并编写了c ++代码来跟踪静态相机中移动对象(此处为人类)的路径。这是我的代码

int main(int argc, char *argv[])
{

   int MAX_COUNT=100;
   Size SubPixelWinSize(10,10),winSize(30,30);
   TermCriteria termcrit(CV_TERMCRIT_ITER|CV_TERMCRIT_EPS,30,0.01);

   Mat frame_old;
   Mat gray_old;
   vector<Point2f>points;
   vector<Point2f>pointsnew;
   vector<uchar>status;
   vector<float>err;

   VideoCapture capture("C:\\Users\\Usre\\Desktop\\free\\1.mp4");
   capture.set(CV_CAP_PROP_POS_MSEC,1000);

   if(!capture.isOpened())
   {cout<<"error opening video"<<endl;return -1;}

   else
   {

      capture>>frame_old;

      cvtColor(frame_old,gray_old,COLOR_BGR2GRAY);
      goodFeaturesToTrack(gray_old,points,MAX_COUNT,0.001,1,Mat(),3,0,0.04);
      cornerSubPix(gray_old,points,SubPixelWinSize,Size(-1,-1),termcrit);

      for(;;)
      {
           Mat framenew;
           Mat gray;

          capture>>framenew;waitKey(10);
          cvtColor(framenew,gray,COLOR_BGR2GRAY);


          calcOpticalFlowPyrLK(gray_old,gray,points,pointsnew,status,err,winSize,3,termcrit,0,0.001);
          size_t i,k;
          for(i=k=0;i<pointsnew.size();i++)
          {

              if(!status[i])
                  continue;


              pointsnew[k++]=pointsnew[i];
              Point p1,p2;
              p1.x= (int)points[i].x;
              p1.y= (int)points[i].y;
              p2.x= (int)pointsnew[i].x;
              p2.y= (int)pointsnew[i].y;

              line(framenew,p1,p2,Scalar(0,255,0),3,8,0);


          }


         pointsnew.resize(k);
         swap(points,pointsnew);
         gray.copyTo(gray_old);


        imshow("new",framenew);
        waitKey(10);
        }

      }

return 0;
}

因此,在运行时,我只有移动的点,移动的人没有沿着路径的线。有些人没有任何点。背景中有点(我的意思是静态地面。它不动)。我试过改变参数但没有运气。

我使用的视频是https://www.youtube.com/watch?v=H7BrVzdOzc4

问题 为什么我得到这些糟糕的结果?为什么跟踪线没有绘制(只有点在那里)? 2.为了得到正确的结果,需要做哪些改变?

我使用了Qt creator和visual studio 2010,opencv 2.4.8,windows 7环境。

认为我的解释很清楚。

任何帮助都将受到高度赞赏..谢谢!!!!

1 个答案:

答案 0 :(得分:0)

光流方法可以准确地给出它应该给出的内容:两个图像之间的运动矢量。您可以将它组合到多帧轨迹中,但您必须自己完成。

&#34;有些时候对于没有任何点的人来说#34;因为你的图像非常模糊,人们没有很好的跟踪功能(从goodFeaturesToTrack(...)方法名称可以清楚地看到)。您可以为第一帧的此点尝试常量步长网格(如果要将向量组合到长轨迹中)。