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

3
我将尝试提取不同的点描述符(SIFT、SURF、ORB、BRIEF等),以构建视觉词袋。然而,问题似乎在于我使用的图片非常小:12x60像素。虽然使用密集提取器可以获得一些关键点,但在提取描述符时未从中提取任何数据。
以下是代码:
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提取的结果是[],而使用SURF和SIFT会出现SegFault错误。 有没有人知道如何在OpenCV上从小图像中密集提取点特征描述符? 感谢您的帮助。

2个回答

2

确实,我最终成功地找到了解决方案。感谢你的帮助。

现在,我正在使用一个已初始化参数的球探测器,而不是随机的,例如:

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

我必须仔细研究OpenCV文档,才能找到解决我的问题的答案:Orb文档

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


1
BRIEF和ORB使用32x32的补丁来获取描述符。由于它不适合您的图像,他们会删除这些关键点(以避免返回没有描述符的关键点)。
在SURF和SIFT的情况下,它们可以使用较小的补丁,但这取决于关键点提供的比例。在这种情况下,我猜他们必须使用更大的补丁,然后与之前发生的相同情况。虽然我不知道为什么会出现段错误,也许SIFT / SURF描述符提取器不检查关键点是否在图像边界内,就像BRIEF / ORB一样。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接