带有ORB描述符的opencv FLANN?

dyn*_*mic 16 c++ opencv surf sift

我试图使用带有ORB描述符的FLANN,但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!
Run Code Online (Sandbox Code Playgroud)

如果我使用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
Run Code Online (Sandbox Code Playgroud)

han*_*ans 32

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

if(dbDescriptors.type()!=CV_32F) {
    dbDescriptors.convertTo(dbDescriptors, CV_32F);
}
Run Code Online (Sandbox Code Playgroud)

可以工作;-)

  • 如果有人遇到这个问题但是使用OpenCV for Java,它可能是CvType.CV_32F而不是CV_32F.这是由于OpenCV项目决定从C/C++迁移代码的结构. (2认同)

Ric*_*ith 6

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

FlannBasedMatcher matcher(new cv::flann::LshIndexParams(5, 24, 2));
Run Code Online (Sandbox Code Playgroud)

我也看到过这个构造函数的建议:

FlannBasedMatcher matcher(new flann::LshIndexParams(20,10,2));
Run Code Online (Sandbox Code Playgroud)


Nir*_*mal 5

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

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


通过比较二进制描述符的汉明距离与用于浮点描述符的欧几里得距离,可以有效地完成二进制描述符的特征匹配。

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

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


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

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

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