OpenCV goodFeaturesToTrack 的状态为零

OpenCV goodFeaturesToTrack's status are zeros

尝试使用 OpenCV 3.1 为 iOS 实现光流。

我构建了如下代码所示的基本内容,我确实从 goodFeaturesToTrack 获得了 features 点,但问题是 没有意义正在跟踪,并且status结果始终为零(未成功跟踪)。

cv::Mat gray;         // current gray-level image
cv::Mat gray_prev;

std::vector<cv::Point2f> features;  // detected features
std::vector<cv::Point2f> newFeatures;

std::vector<uchar> status; // status of tracked features
std::vector<float> err;    // error in tracking
cv::TermCriteria _termcrit = cv::TermCriteria(cv::TermCriteria::COUNT|cv::TermCriteria::EPS,20,0.03);


-(void)processImage:(cv::Mat&)image {

    //-------------------- Optical Flow ---------------------

    cv::cvtColor(image, gray, CV_BGR2GRAY);

    if(gray_prev.empty()) {
        gray.copyTo(gray_prev);
    }

    cv::goodFeaturesToTrack(gray, features, 20, 0.01, 10);
    cv::calcOpticalFlowPyrLK(gray_prev, gray, features, newFeatures, status, err,  cv::Size(10, 10), 3, _termcrit, 0, 0.001);

    // draw circles for features points
    for (int i = 0; i < features.size(); i++) {
        circle(image, features[i], 10, cv::Scalar(250,250,250));
    }

    for (int y = 0; y < status.size(); y++) {
        NSLog(@"Status: %d", status[y]); // always zero
    }

    std::swap(newFeatures, features);
    cv::swap(gray_prev, gray);
}

你应该打电话给

cv::goodFeaturesToTrack(gray, features, 20, 0.01, 10);

仅用于功能列表的第一次初始化,而不是在每个周期。 您所做的是重置功能列表以匹配每个周期的当前帧,因此功能中没有位移。

此外,如果您只需要两帧之间的位移,您应该调用

cv::goodFeaturesToTrack(**gray_prev**, features ....

两种情况状态为0:

  • 特征在图像 roi 之外
  • lucas-kanade 的梯度矩阵的最小特征值 window 高于 minEigThreshold,即在你的 window 中没有足够的纹理。

然而,根据我的经验,状态标志是一个很好的猜测,但不是了解该功能是否已成功跟踪的重要标志。

忽略状态并绘制或打印您的特征和新特征向量。如果它们相同,请检查 gray_prev 和灰度图像是否彼此不同。