如何分离光流中的匹配点?

时间:2017-11-13 04:06:52

标签: c++ opencv vector computer-vision opticalflow

我使用calcOpticalFlowPyrLK()功能来跟踪要素点。我想使用calcOpticalFlowPyrLK()生成的状态向量将匹配的点与结果分开。

opencv page的文档说,

  

输出状态向量(无符号字符);向量的每个元素   如果找到相应功能的流,则设置为1,   否则,它被设置为0.

但是在实现之前打印状态向量时,我发现状态向量大小更大,即使数组通过跟踪的特征点大小,也会分散1和0。

如果我的跟踪点矢量大小为65,则状态矢量大小为100,即使在状态[64]之后也存在1和0。

如果有人可以帮助我获得正确的分数,那将会有所帮助。

谢谢。

2 个答案:

答案 0 :(得分:1)

在我的实现中,我在calcOpticalFlowPyrLK()之前清除 nextPts 状态向量。 prevPts,nextPts和status的大小完全相同。如果状态中的数据为0,则输出流无效。

vector<cv::Point2f> points_prev;
/* points_prev.push_back(some data) */
vector<cv::Point2f> points_next;
vector<uchar> status;
calcOpticalFlowPyrLK(img_prev, img_next, points_prev, points_next, status, err, winSize, 3, termcrit, 0, 0.001);
for (size_t i = 0; i < status.size(); i++)
{
    if(status.at(i) == 0)
        /*points_prev[i] is not valid*/
}

答案 1 :(得分:1)

状态向量应与特征向量的大小相同。 如果您发现尺寸不匹配 - 请分享您正在使用的代码。

在这里,我们如何使用它来过滤掉“坏”功能:

 calcOpticalFlowPyrLK(gray_1, gray_2, features_1, features_2, status, err, 
    wins_size, max_level, term_crit);

  // filter points with bad status
  size_t i, k;
  for( i = k = 0; i < features_2.size(); i++ ){
    if (!status[i]) continue;
    features_1[k] = features_1[i];
    features_2[k] = features_2[i];
    err[k] = err[i];
    k++;
  }
  features_1.resize(k);
  features_2.resize(k);
  err.resize(k);