c++ - ¿FLANN opencv con descriptores ORB?
sift surf (4)
Estoy tratando de usar FLANN con descriptores ORB, pero opencv falla con este simple código:
vector<vector<KeyPoint> > dbKeypoints;
vector<Mat> dbDescriptors;
vector<Mat> objects;
/*
load Descriptors from images (with OrbDescriptorExtractor())
*/
FlannBasedMatcher matcher;
matcher.add(dbDescriptors);
matcher.train() //> Crash!
Si uso SurfDescriptorExtractor()
funciona bien.
¿Como puedo resolver esto?
OpenCV dice:
OpenCV Error: Unsupported format or combination of formats (type=0
) in unknown function, file D:/Value/Personal/Parthenope/OpenCV/modules/flann/sr
c/miniflann.cpp, line 299
Al usar ORB debes construir tu matcher así:
FlannBasedMatcher matcher(new cv::flann::LshIndexParams(5, 24, 2));
También he visto http://answers.opencv.org/question/503/how-to-use-the-lshindexparams/ :
FlannBasedMatcher matcher(new flann::LshIndexParams(20,10,2));
Es un bicho Va a estar arreglado pronto.
http://answers.opencv.org/question/503/how-to-use-the-lshindexparams/
Flann necesita que los descriptores sean del tipo CV_32F, por lo que necesita convertirlos. find_object/example/main.cpp :
if(dbDescriptors.type()!=CV_32F) {
dbDescriptors.convertTo(dbDescriptors, CV_32F);
}
podría funcionar ;-)
Descriptores de cadenas binarias - ORB, BRIEF, BRISK, FREAK, AKAZE etc.
Descriptores de punto flotante - SIFT, SURF, GLOH etc.
La comparación de características de los descriptores binarios se puede realizar de manera eficiente comparando su distancia de Hamming en lugar de la distancia euclidiana utilizada para los descriptores de punto flotante.
Para comparar descriptores binarios en OpenCV, use el índice de FLANN + LSH o la distancia Brute Force + Hamming .
http://answers.opencv.org/question/59996/flann-error-in-opencv-3/
Por defecto, FlannBasedMatcher funciona como KDTreeIndex con la norma L2. Esta es la razón por la que funciona bien con los descriptores SIFT / SURF y lanza una excepción para el descriptor ORB.
Características binarias y Hashing sensible a la localidad (LSH)
Comparación de rendimiento entre descriptores binarios y de punto flotante