运行光流跟踪时在每帧中的点之间绘制一条线

Posted

技术标签:

【中文标题】运行光流跟踪时在每帧中的点之间绘制一条线【英文标题】:Drawing a line between points in each frame when running optical flow tracking 【发布时间】:2017-10-03 21:04:24 【问题描述】:

我正在link here 运行稀疏光流演示,我只是想在视频中所有帧的跟踪点之间画一条线。

在for循环中,

int LastX = 0;
int LastY = 0;
int px, py;


else if( !points[0].empty() )
  
    vector<uchar> status;
     vector<float> err;
     if(prevGray.empty())
      gray.copyTo(prevGray);
      calcOpticalFlowPyrLK(prevGray, gray, points[0], points[1], status, err, winSize,
                                     3, termcrit, 0, 0.001);
      size_t i, k;
    for( i = k = 0; i < points[1].size(); i++ )
       
         if( addRemovePt )
           
              if( norm(point - points[1][i]) <= 5 )
                 
                    addRemovePt = false;
                    continue;
                  
             

          if( !status[i] )
          continue;
          points[1][k++] = points[1][i];

           px = points[1][i].x;
           py = points [1][i].y;

       if (LastX > 0)
          
            line(image, Point(px, py), Point(LastX, LastY), Scalar(255, 0, 0), 5);
          

         LastX = px;
         LastY = py;
         circle( image, points[1][i], 3, Scalar(0,255,0), -1, 8);
      
        points[1].resize(k);

    

但是,该行仅出现在当前帧中,并且该行的位置不会保存在以前的帧中。有人可以告诉我我做错了什么吗?

【问题讨论】:

所以更精确一点,在帧 n 上,您想要显示当前帧 n 以及从帧 0 到帧 1、帧 1 到帧 2 的行,最多框架n-1 到框架n。对吗? @AlexanderReynolds 是的。这正是我想要做的事情 那么我会采用下面的方法;只需将点存储在vector&lt;Point&gt; 中,并在每一帧中,在 for 循环中遍历整个向量,并从第一个点绘制到第二个、第二个到第三个等。然后当你检测到下一个点时,你可以简单地 @987654328 @. 好主意!这似乎有效,谢谢。 【参考方案1】:

尝试使用vector&lt;vector&lt;Point&gt;&gt; 存储从第一帧到最后一帧的匹配点对。

流点的匹配过程与汽车跟踪类似。

你可以参考这个Counting cars by Dan Mašek。

【讨论】:

以上是关于运行光流跟踪时在每帧中的点之间绘制一条线的主要内容,如果未能解决你的问题,请参考以下文章

在绘制的点之间绘制一条线

使用 SceneKit 在两点之间绘制一条线

如何使用线性感知器中的权重向量绘制一条线? [关闭]

从 haar 检测结果中使用光流 PyrLK 跟踪多个对象

使用光流的汽车跟踪。为啥向量不能正确绘制

干货 | OpenCV中KLT光流跟踪原理详解与代码演示