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 和灰度图像是否彼此不同。
尝试使用 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 和灰度图像是否彼此不同。