我有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
答案 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;