首页 文章

OpenCV - 在同一程序中收集featureDetectors和descriptorDetector

提问于
浏览
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);

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

那我怎么解决呢?也许,这是一个更好的解决方案,做我以前做过的,但它是如此沉重,因为我必须做很多“如果”,以便知道我想用哪个探测器与哪个探测器等...

你怎么看待这件事 ?

谢谢

1 回答

  • 2

    要更改算法参数,请使用您已找到的set()方法 . 没有记录每个特征检测器可用的参数,但它们在OpenCV的源代码中进行了枚举,您可以找到herethe nonfree module用于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" )是您将为 set()name 参数提供的参数 .

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

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

    这将创建一个具有相同参数的探测器:

    SIFT detector(500);
    

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

相关问题