OpenCV 3:FeatureDetector :: create()和DescriptorExtractor :: create()选项列表可用吗?

10
编辑:我之前看错了OpenCV2的代码示例,OpenCV3中没有FeatureDetector::create,这让我感到困惑。

嘿,我是OpenCV的新手,通过分析其他人的C++代码学习示例。

我想尝试所有可用选项:

detector = FeatureDetector::create(str_detector);
descriptor = DescriptorExtractor::create(str_descriptor);

目前str_detector是FAST,str_descriptor是BRISK

我在寻找可用的检测器和描述符时遇到了麻烦。

有没有办法输出当前所有可用选项的列表?

(我刚刚在新的Linux安装上从GitHub构建了最新的opencv + opencv-contrib)

我在这里找到了一个第三方文件列表https://github.com/Itseez/opencv_contrib/tree/master/modules/xfeatures2d/src - 我认为这些是第三个描述符和检测器,因为这些单词在一些文件中被提到。但是,拥有一个当前编译/可用选项的完整列表会很好。

谢谢!


我正在尝试自己找到答案,边编辑边进行:

  1. modules/features2d/include/opencv2/features2d.hpp中找到了typedef Feature2D FeatureDetectortypedef Feature2D DescriptorExtractor
  2. 现在正在查找Feature2D...
  3. 我很困惑,我的C++让我失望了,https://github.com/Itseez/opencv/blob/master/modules/features2d/src/feature2d.cpp中没有create
  4. 现在只需查看代码(https://github.com/Itseez/opencv/blob/master/modules/features2d/include/opencv2/features2d.hpp
    • BRISK
    • ORB
    • MSER
    • FastFeatureDetector / FAST
    • AgastFeatureDetector / AGAST
    • GFTTDetector
    • SimpleBlobDetector
    • KAZE / AKAZE
  5. 还有来自contrib代码的(https://github.com/Itseez/opencv_contrib/blob/master/modules/xfeatures2d/include/opencv2/xfeatures2d.hpp
    • FREAK
    • StarDetector
    • BriefDescriptorExtractor
    • LUCID
    • LATCH
    • DAISY
    • MSDDetector
  6. 还有来自非免费contrib代码的(https://github.com/Itseez/opencv_contrib/blob/master/modules/xfeatures2d/include/opencv2/xfeatures2d/nonfree.hpp
    • SIFT
    • SURF
  7. 仍然不确定上述哪些可以/应该用于FeatureDetector或DescriptorExtractor。
1个回答

17

您还可以查看OpenCV文档以获取OpenCV功能列表:

我通常通过阅读文档中链接的相应论文来确定特征仅在关键点检测或描述符提取方面可用,或两者都可用。这也允许了解特征的简要描述(例如,如果它是二进制描述符、主要优势等)。

另一种方法是测试每个特征:

  • 如果detect()调用正常(没有抛出异常)==> 特征检测
  • 如果compute()调用正常 ==> 特征提取
  • 如果detectAndCompute() 调用正常 ==> 两者都可用
  • 或直接查看源代码。

也许存在更优化的解决方案...

不管怎样,根据我的知识(如果我错了,请随时纠正我):

  • BRISK:检测器 + 描述符
  • ORB:检测器 + 描述符
  • MSER:检测器
  • FAST:检测器
  • AGAST:检测器
  • GFFT:检测器
  • SimpleBlobDetector:检测器
  • KAZE:检测器 + 描述符
  • AKAZE:检测器 + 描述符
  • FREAK:描述符
  • StarDetector:检测器
  • BriefDescriptorExtractor:描述符
  • LUCID:描述符
  • LATCH:描述符
  • DAISY:描述符
  • MSDDetector:检测器
  • SIFT:检测器 + 描述符
  • SURF:检测器 + 描述符

此外,使用OpenCV 3.1的代码是:

cv::Ptr<cv::Feature2D> kaze = cv::KAZE::create(); 
std::vector<cv::KeyPoint> kpts; 
cv::Mat descriptors; 
kaze->detect(matImg, kpts); 
kaze->compute(matImg, kpts, descriptors); 
kaze->detectAndCompute(matImg, cv::noArray(), kpts, descriptors);

cv::Ptr<cv::Feature2D> daisy = cv::xfeatures2d::DAISY::create(); //Contrib

要知道使用哪种规范类型:

  std::cout << "AKAZE: " << akaze->descriptorType() << " ; CV_8U=" << CV_8U << std::endl;
  std::cout << "AKAZE: " << akaze->defaultNorm() << " ; NORM_HAMMING=" << cv::NORM_HAMMING << std::endl;

最后,为什么

features2d::create已不再支持?


非常感谢您分享这些知识! :)我刚刚意识到在这段代码中有一个 #if CV_MAJOR_VERSION > 2,它使用了更新的 detector = cv::FastFeatureDetector::create(); 而不是旧的 detector = FeatureDetector::create(str_detector);。这更加合理,并且与文档/源代码相匹配。干杯! - dtbaker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接