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

how to separating the matching points in optical flow?

我正在使用 calcOpticalFlowPyrLK() 函数来跟踪特征点。我想使用 calcOpticalFlowPyrLK() 产生的状态向量将仅匹配的点与结果分开。

opencv page 的文档说,

output status vector (of unsigned chars); each element of the vector is set to 1 if the flow for the corresponding features has been found, otherwise, it is set to 0.

但是在实现之前打印状态向量的时候,我发现状态向量的尺寸更大,即使数组超过了跟踪的特征点的尺寸,1和0也散落了。

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

如果有人能帮助我得到正确的分数,我会得到帮助。

谢谢。

在我的实现中,我在 calcOpticalFlowPyrLK() 之前清除了 nextPtsstatus 向量。 prevPts、nextPts 和 status 的大小完全相同。如果 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*/
}

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

这里是我们如何使用它来过滤掉 "bad" 特征:

 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);