我正在尝试将FLANN与ORB描述符一起使用,但opencv崩溃时使用了这个简单的代码:
vector<vector<KeyPoint> > dbKeypoints;
vector<Mat> dbDescriptors;
vector<Mat> objects;
/*
load Descriptors from images (with OrbDescriptorExtractor())
*/
FlannBasedMatcher matcher;
matcher.add(dbDescriptors);
matcher.train() //> Crash!
如果我使用SurfDescriptorExtractor()
,则效果很好。
我该如何解决这个问题?
OpenCV说:
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
答案 0 :(得分:32)
Flann需要描述符为CV_32F类型,因此您需要转换它们! find_object/example/main.cpp:
if(dbDescriptors.type()!=CV_32F) {
dbDescriptors.convertTo(dbDescriptors, CV_32F);
}
可能有用; - )
答案 1 :(得分:6)
答案 2 :(得分:6)
使用ORB时,你应该像这样构建你的匹配器:
FlannBasedMatcher matcher(new cv::flann::LshIndexParams(5, 24, 2));
我也见过this constructor suggested:
FlannBasedMatcher matcher(new flann::LshIndexParams(20,10,2));
答案 3 :(得分:1)
二进制字符串描述符-ORB,BRIEF,BRISK,FREAK,AKAZE等。
浮点描述符-SIFT,SURF,GLOH等。
要在OpenCV中比较二进制描述符,请使用 FLANN + LSH索引或 Brute Force + Hamming距离。
http://answers.opencv.org/question/59996/flann-error-in-opencv-3/
默认情况下,FlannBasedMatcher用作具有L2规范的KDTreeIndex。这就是为什么它可以与SIFT / SURF描述符以及throws an exception一起用于ORB描述符的原因。
Binary features and Locality Sensitive Hashing (LSH)
Performance comparison between binary and floating-point descriptors