OpenCV的FLANN与ORB描述符?(opencv FLANN with ORB descrip

2019-06-26 10:15发布

我试图使用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

Answer 1:

弗莱恩需要描述为类型CV_32F的,所以你需要将它们转换! find_object /示例/ main.cpp中 :

if(dbDescriptors.type()!=CV_32F) {
    dbDescriptors.convertTo(dbDescriptors, CV_32F);
}

可能工作;-)



Answer 2:

这是一个错误。 它很快就会解决。

http://answers.opencv.org/question/503/how-to-use-the-lshindexparams/



Answer 3:

当使用ORB你应该建立像这样的匹配:

FlannBasedMatcher matcher(new cv::flann::LshIndexParams(5, 24, 2));

我也看到了这个构造建议 :

FlannBasedMatcher matcher(new flann::LshIndexParams(20,10,2));


Answer 4:

二进制字符串描述符 - 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)

二进制和浮点描述符的性能比较



文章来源: opencv FLANN with ORB descriptors?