带有ORB描述符的opencv FLANN?

时间:2012-07-19 16:29:42

标签: c++ opencv sift surf

我正在尝试将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

4 个答案:

答案 0 :(得分:32)

Flann需要描述符为CV_32F类型,因此您需要转换它们! find_object/example/main.cpp

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

可能有用; - )

答案 1 :(得分:6)

这是一个错误。它很快就会修好。

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

答案 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等。


通过比较它们的 Hamming距离(而不是用于浮点描述符的欧几里德距离),可以有效地完成二进制描述符的特征匹配。

要在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