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

时间:2013-10-28 10:25:49

标签: opencv image-processing feature-detection feature-extraction

我正在尝试提取不同的点描述符(SIFT,SURF,ORB,BRIEF,...)来构建Bag of Visual单词。问题似乎是我使用非常小的图像: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上的小图像中密集提取点描述符? 谢谢你的帮助。

2 个答案:

答案 0 :(得分:2)

确实,我终于设法解决了问题。谢谢你的帮助。

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

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

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

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

答案 1 :(得分:1)

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

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