OpenCV goodFeaturesToTrack 的状态为零
Posted
技术标签:
【中文标题】OpenCV goodFeaturesToTrack 的状态为零【英文标题】:OpenCV goodFeaturesToTrack's status are zeros 【发布时间】:2016-09-13 06:54:44 【问题描述】:尝试使用 OpenCV 3.1 为 ios 实现光流。
我构建了如下代码所示的基本内容,我确实从 goodFeaturesToTrack
获得了 功能 点,但问题是 没有任何点被跟踪,并且 @ 987654322@ 结果始终为零(未成功跟踪)。
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);
【问题讨论】:
您是否尝试更改质量级别参数? @Pierre 是的,没有任何改变。 【参考方案1】:你应该打电话
cv::goodFeaturesToTrack(gray, features, 20, 0.01, 10);
仅用于功能列表的第一次初始化,而不是在每个循环中。 您所做的是重置特征列表以匹配每个周期的当前帧,因此特征中没有位移。
另外,如果你只想要两帧之间的位移,你应该调用
cv::goodFeaturesToTrack(**gray_prev**, features ....
【讨论】:
【参考方案2】:状态在两种情况下为0:
特征在图像 roi 之外 lucas-kanade 窗口的梯度矩阵的最小特征值高于 minEigThreshold,即在您的窗口中没有足够的纹理。但是,根据我的经验,状态标志是一个很好的猜测,但不是一个重要的标志,可以知道该功能是否已成功跟踪。
忽略状态并绘制或打印您的特征和新特征向量。如果它们相同,请检查 gray_prev 和 gray image 是否彼此不同。
【讨论】:
以上是关于OpenCV goodFeaturesToTrack 的状态为零的主要内容,如果未能解决你的问题,请参考以下文章
cmake错误:opencv2/opencv.hpp:opencv2/opencv.hpp:没有这样的文件或目录