3

我正在尝试提取不同的点描述符(SIFT、SURF、ORB、BRIEF、...)来构建视觉词袋。问题似乎是我使用的图像非常小:12x60px。使用密集提取器我可以获得一些关键点,但是在提取描述符时没有提取数据。

这是代码:

vector<KeyPoint> points;
Mat descriptor; // descriptor of the current image
Ptr<DescriptorExtractor> extractor = DescriptorExtractor::create("BRIEF");
Ptr<FeatureDetector> detector(new DenseFeatureDetector(1.f,1,0.1f,6,0,true,false));
image = imread(filename, 0);
roi = Mat(image,Rect(0,0,12,60));

detector->detect(roi,points);

extractor->compute(roi,points,descriptor);
cout << descriptor << endl;

结果是 [](带有 Brief 和 ORB)和 SegFault(带有 SURF 和 SIFT)。有没有人知道如何从 OpenCV 上的小图像中密集提取点描述符?谢谢你的帮助。

4

2 回答 2

2

事实上,我终于设法找到了解决方案。谢谢您的帮助。

我现在正在使用带有初始化参数而不是随机参数的 Orb 检测器,例如:

Ptr<DescriptorExtractor> extractor(new ORB(500, 1.2f, 8, orbSize, 0, 2, ORB::HARRIS_SCORE, orbSize));

在找到我的问题的答案之前,我必须彻底探索 OpenCV 的文档:Orb 文档

此外,如果人们使用密集点提取器,他们应该知道,在描述符计算过程之后,他们的关键点可能比关键点提取器产生的要少。描述符计算会删除它无法获取数据的任何关键点。

于 2013-10-29T12:28:18.767 回答
1

Brief 和 ORB 使用 32x32 补丁来获取描述符。由于它不适合您的图像,因此它们会删除这些关键点(以避免返回没有描述符的关键点)。

在 SURF 和 SIFT 的情况下,它们可以使用更小的补丁,但这取决于关键点提供的规模。在这种情况下,我猜他们必须使用更大的补丁,并且和以前一样。不过,我不知道为什么会出现段错误;也许 SIFT/SURF 描述符提取器不会检查关键点是否在图像边界内,就像 BRIEF/ORB 那样。

于 2013-10-28T11:30:54.133 回答