使用 OpenCV 从小图像中提取点描述符

Posted

技术标签:

【中文标题】使用 OpenCV 从小图像中提取点描述符【英文标题】:Extract point descriptors from small images using OpenCV 【发布时间】:2013-11-07 01:54:25 【问题描述】:

我正在尝试提取不同的点描述符(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 上的小图像中密集提取点描述符? 感谢您的帮助。

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

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

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

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

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

【讨论】:

以上是关于使用 OpenCV 从小图像中提取点描述符的主要内容,如果未能解决你的问题,请参考以下文章

opencv中SURF特征提取的最佳hessian阈值+最小描述符匹配

第十八节图像描述符匹配算法

使用 OpenCV 描述符与 findFundamentalMat 匹配

OpenCV - 使用 SURF 描述符和 BruteForceMatcher 进行对象匹配

OpenCV-无法访问 Mat 的元素(描述符)

冲浪描述符提取器在 opencv3.1 中是不是仍然可用?