0

我正在尝试使用 SIFT 来匹配两个图像,并且我正在使用以下代码:

cv::initModule_nonfree(); 

cv::Mat matFrame(frame);
cv::Mat matFrameAnt(frameAnterior);

cv::SiftFeatureDetector detector(400);            //I've tried different values here
cv::SiftDescriptorExtractor extractor(400);       //but i get always the same error

std::vector<cv::KeyPoint> keypoints1;
std::vector<cv::KeyPoint> keypoints2;

detector.detect( matFrame, keypoints1 );
detector.detect( matFrameAnt, keypoints2 );

cv::Mat feat1;
cv::Mat feat2;
cv::Mat descriptor1;
cv::Mat descriptor2;

extractor.compute( matFrame, keypoints1, descriptor1 );
extractor.compute( matFrameAnt, keypoints2, descriptor2 );

    std::vector<cv::DMatch> matches;

cv::BFMatcher matcher(cv::NORM_L2, false); 

matcher.match(descriptor1,descriptor2, matches);

cv::Mat result;
cv::drawMatches( matFrame, keypoints1, matFrameAnt, keypoints2, matches, result );

cv::namedWindow("SIFT", CV_WINDOW_AUTOSIZE );
cv::imshow("SIFT", result);

运行代码时出现此错误(它编译完美)。

“OpenCV 错误:未知函数中的断言失败(firstOctave >= -1 && actualNlayers <= nOctaveLayers),文件......\src\opencv\modules\nonfree\src\sift.cpp,第 755 行”。

我知道该函数正在获得一个非正值,所以我从我的代码中打印了所有可能的值,我发现我的两个关键点向量的大小是 -616431 和 -616422。我使用的两个图像是黑白图像,黑色背景和我的手(白色)在它的中间。

发生了什么?我使用的是无效图像吗?我使用函数 cv::SiftFeatureDetector 和 cv::SiftDescriptorExtractor 错了吗?

4

1 回答 1

0

似乎你不知道自己在做什么。这个特性是相当无证的,因此尝试挖掘源代码,或者让我告诉你你做了什么。

cv::SiftFeatureDetector detector(50)

这意味着您最多将获得 50 场比赛。

cv::SiftDescriptorExtractor extractor(400);

这意味着您的提取放大倍数为 400 倍。对于正常结果,此参数应为“1”的顺序。

其余文档在这里:http ://docs.opencv.org/2.3/modules/features2d/doc/common_interfaces_of_feature_detectors.html#SiftFeatureDetector

于 2014-01-31T00:06:15.117 回答