OpenCV 3: List of available FeatureDetector::create() and DescriptorExtractor::create() options?

后端 未结 1 1469
执念已碎
执念已碎 2021-02-15 18:28

edit: I was looking at the wrong OpenCV2 code example, there is no FeatureDetector::create in OpenCV3 - this was confusing me.


Hey n

相关标签:
1条回答
  • 2021-02-15 18:50

    You have also the OpenCV documentation to have a list of OpenCV features:

    • OpenCV 3.1 documentation
    • OpenCV 3.1 contrib documentation

    What I do to know if the feature is available only in keypoints detection or descriptor extraction or both is to read the corresponding paper linked in the documentation. It allows also to have a brief description of the features (for example if it is a binary descriptor, main advantages, etc.)

    Other solution is to test each feature:

    • if the call to detect() is ok (no exception thrown) ==> feature detection
    • if the call to compute() is ok ==> feature extraction
    • if the call to detectAndCompute() is ok ==> both
    • or looking directly into the source code.

    Maybe a more optimal solution exists...

    Anyway, from my knowledge (feel free to correct me if I am wrong):

    • BRISK: detector + descriptor
    • ORB: detector + descriptor
    • MSER: detector
    • FAST: detector
    • AGAST: detector
    • GFFT: detector
    • SimpleBlobDetector: detector
    • KAZE: detector + descriptor
    • AKAZE: detector + descriptor
    • FREAK: descriptor
    • StarDetector: detector
    • BriefDescriptorExtractor: descriptor
    • LUCID: descriptor
    • LATCH: descriptor
    • DAISY: descriptor
    • MSDDetector: detector
    • SIFT: detector + descriptor
    • SURF: detector + descriptor

    Also with OpenCV 3.1, the code is:

    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
    

    To know which norm type to use:

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

    Finally, why

    No more features2d::create?

    0 讨论(0)
提交回复
热议问题