2

我有一个 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 之后,该方法已删除所有关键点。

我使用的图像是这样的: 在此处输入图像描述

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

4

2 回答 2

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); 
于 2013-05-22T16:17:08.897 回答
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;
于 2013-05-22T16:28:18.067 回答