19

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

4 回答 4

34

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

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

可能工作;-)

于 2012-08-03T15:20:45.880 回答
7

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

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

于 2012-07-27T21:24:50.267 回答
7

使用 ORB 时,您应该像这样构建匹配器:

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

我还看到了这个构造函数的建议

FlannBasedMatcher matcher(new flann::LshIndexParams(20,10,2));
于 2015-04-20T19:49:38.323 回答
5

二进制字符串描述符- ORB、BRIEF、BRISK、FREAK、AKAZE 等。

浮点描述符- SIFT、SURF、GLOH 等。


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

要比较 OpenCV 中的二进制描述符,请使用FLANN + LSH indexBrute Force + Hamming distance

http://answers.opencv.org/question/59996/flann-error-in-opencv-3/


默认情况下,FlannBasedMatcher 作为具有 L2 规范的 KDTreeIndex 工作。这就是为什么它可以很好地与 SIFT/SURF 描述符配合使用并为 ORB 描述符抛出异常的原因。

二进制特征和局部敏感散列 (LSH)

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

于 2018-10-24T13:22:58.503 回答