edit: I was looking at the wrong OpenCV2 code example, there is no FeatureDetector::create
in OpenCV3 - this was confusing me.
Hey new to OpenCV and learning by example by pulling apart other peoples C++ code.
I would like to try all available options for:
detector = FeatureDetector::create(str_detector);
descriptor = DescriptorExtractor::create(str_descriptor);
currently str_detector is FAST
and str_descriptor is BRISK
I am having trouble finding what available Detectors and Descriptors are available to me.
Is there a way to output a list of all currently available options?
(I have just built the latest opencv + opencv-contrib from github on a fresh linux install)
I have found a list of 3rd party files here https://github.com/Itseez/opencv_contrib/tree/master/modules/xfeatures2d/src - I think these are 3rd Descriptors and Detectors because those words are mentioned in some of the files. However it would be nice to have a full list of currently compiled/available options to play with.
Thanks!
Trying to find the answer myself, edits as I go:
typedef Feature2D FeatureDetector
and typedef Feature2D DescriptorExtractor
in modules/features2d/include/opencv2/features2d.hpp
Feature2D
now...create
in https://github.com/Itseez/opencv/blob/master/modules/features2d/src/feature2d.cpp You have also the OpenCV documentation to have a list of OpenCV features:
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:
detect()
is ok (no exception thrown) ==> feature detectioncompute()
is ok ==> feature extractiondetectAndCompute()
is ok ==> bothMaybe a more optimal solution exists...
Anyway, from my knowledge (feel free to correct me if I am wrong):
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?
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With