ORB计算错误:它删除所有具有小图像的关键点

时间:2013-05-22 09:59:32

标签: c++ opencv c++11 orb

我有50x50的小图片。我找到了ORB关键点:

(请注意,我必须将patchSize的默认参数从31更改为14才能检测到某些关键点):

 OrbFeatureDetector det(500,1.2f,8,14,0,2,0,14);   //> (From 31 to 14)
 OrbDescriptorExtractor desc;

 det.detect(image,kp)
 //> kp.size() is about 50 keypoints

现在,如果我将关键点传递给orb.compute,我会删除所有关键点。

 desc.compute(image,kp,kpDesc);
 //> Now kp.size() == 0

这意味着在我调用.compute后,该方法已删除所有关键点。

我正在使用的图像是这样的: enter image description here

我相信这是某种错误。有人可以确认一下吗?我正在使用OpenCV 2.4.5

2 个答案:

答案 0 :(得分:4)

不,这不是一个错误。

问题是OrbDescriptorExtractor不知道您在FeatureDetector中更改了参数。所以你必须再次设置正确的参数:

OrbFeatureDetector      det(500,1.2f,8,14,0,2,0,14);   //> (From 31 to 14)
OrbDescriptorExtractor desc(500,1.2f,8,14,0,2,0,14); 

答案 1 :(得分:4)

您正在创建两个对象,即特征检测器和描述符提取器。必须使用相同的参数初始化它们。

您可以通过创建cv::ORB的单个实例然后调用cv::ORB::operator()来减少必须设置相同参数两次的代码重复,如下所示:

cv::ORB orb(500,1.2f,8,14,0,2,0,14);
orb(image,cv::noArray(),kp,kpDesc);

这与您的初始解决方案相同,因为特征检测器和提取器实际上是同一个对象。来自OpenCV标题:

typedef ORB OrbFeatureDetector;
typedef ORB OrbDescriptorExtractor;