使用ORB描述符的OpenCV FLANN?

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个回答

34

Flann需要描述符的类型为CV_32F,因此您需要将其转换!find_object/example/main.cpp:

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

可能有效;-)


2
如果有人遇到这个问题,但是使用的是OpenCV for Java,那么可能需要使用CvType.CV_32F而不是CV_32F。这是由于OpenCV项目决定从C/C++迁移代码的结构所致。 - xarlymg89
1
感谢 jstr,这真的帮了我很多! - Void Main
1
如果我转换描述符,FLANNMatcher<L2> 是否比 BFMatcher<NORM_HAMMING> 更快? - happy_marmoset
我已经开了一个新的问题,询问一个使用FLANN和ORB描述符匹配特征时遇到的错误。 - Santiago Gil

7
当使用ORB时,您应该像这样构建匹配器:
FlannBasedMatcher matcher(new cv::flann::LshIndexParams(5, 24, 2));

我还看到有人建议使用这个构造函数

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

7

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 作为 KDTreeIndex 使用 L2 范数。这就是为什么它对 SIFT/SURF 描述符能很好工作,却对 ORB 描述符抛出异常的原因。

二进制特征和局部敏感哈希(LSH)

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接