0

我想做一个允许使用 SIFT、SURF、ORB(所有特征检测器)、不同描述符和不同匹配器的程序。

我想运行这样的东西:特征(“SIFT”,“SIFT”,“BruteForce”)分别是特征(“检测器”,“描述符”,“匹配器”)。

确实我之前做过一个程序,但是有很多“如果”。例如 "if (detection="SIFT")" "if (matcher=="BruteForce")" 等。因此,如果我想将某个检测器与另一种描述符一起使用,我的程序就不灵活。

所以我发现了类似的东西:

 featureDetector = FeatureDetector::create( detectorType );
 descriptorExtractor = DescriptorExtractor::create( descriptorType );
 descriptorMatcher = DescriptorMatcher::create( matcherType );

这是完美的,因为我可以在一个函数中使用一个字符串来确定我想使用哪个检测器、描述符和匹配器。

但是,我无法更改参数(我发现了类似 featureDetector.set() 但没有文档),因此结果非常糟糕......仅计算一张图片需要时间,关键点不准确。

即使是 SIFT 也比 SURF 花费的时间更少!

而在我的第一个程序中,当我使用

detector=new SiftFeatureDetector(nfeatureSift,nOctaveLayerSift,contrastThresholdSift,edgeThresholdSift,sigmaSift);

结果更好!(因为我可能更改了参数)。

那么我该如何解决呢?也许,这是一个更好的解决方案来做我以前做过的事情,但它太重了,因为我必须做很多“如果”才能知道我想与哪个检测器一起使用哪个检测器等等......

你怎么看待这件事 ?

感谢

4

1 回答 1

2

要更改算法参数,请使用set()您已经找到的方法。没有记录每个特征检测器可用的参数,但它们在 OpenCV 的源代码(您可以在此处找到)或SURF 和 SIFT的非自由模块中列出。

枚举参数和为特征检测器的构造函数列出的参数之间存在粗略的对应关系。

例子

给定 SIFT 的条目:

CV_INIT_ALGORITHM(SIFT, "Feature2D.SIFT",
                  obj.info()->addParam(obj, "nFeatures", obj.nfeatures);
                  obj.info()->addParam(obj, "nOctaveLayers", obj.nOctaveLayers);
                  obj.info()->addParam(obj, "contrastThreshold", obj.contrastThreshold);
                  obj.info()->addParam(obj, "edgeThreshold", obj.edgeThreshold);
                  obj.info()->addParam(obj, "sigma", obj.sigma))

引号中的名称(例如"nFeatures")是您将提供给 的name参数的参数set()

因此,要将检测到的特征数量限制为 500,您可以编写:

featureDetector = FeatureDetector::create( detectorType );
featureDetector->set("nFeatures", 500);

这将创建一个与编写参数相同的检测器:

SIFT detector(500);

注意:如果set()用于设置算法参数,则块中列出CV_INIT_ALGORITHM但您未提供的任何字段将使用默认值。

于 2014-07-14T19:27:13.363 回答