我试图使用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
弗莱恩需要描述为类型CV_32F的,所以你需要将它们转换! find_object /示例/ main.cpp中 :
if(dbDescriptors.type()!=CV_32F) {
dbDescriptors.convertTo(dbDescriptors, CV_32F);
}
可能工作;-)
这是一个错误。 它很快就会解决。
http://answers.opencv.org/question/503/how-to-use-the-lshindexparams/
当使用ORB你应该建立像这样的匹配:
FlannBasedMatcher matcher(new cv::flann::LshIndexParams(5, 24, 2));
我也看到了这个构造建议 :
FlannBasedMatcher matcher(new flann::LshIndexParams(20,10,2));
二进制字符串描述符 - ORB,简单,活跃,FREAK,AKAZE等。
浮点描述 - SIFT,SURF,GLOH等。
二进制描述符的特征匹配可以通过比较它们的汉明距离 ,而不是用于浮点描述符欧几里得距离来高效地完成。
对于OpenCV的比较二进制描述符,使用FLANN + LSH索引或蛮力+汉明距离 。
http://answers.opencv.org/question/59996/flann-error-in-opencv-3/
默认情况下FlannBasedMatcher工作原理与KDTreeIndex L2范数。 这就是为什么它与SIFT / SURF描述运作良好,原因抛出异常的ORB描述符。
二元特征和局部敏感散列(LSH)
二进制和浮点描述符的性能比较