OpenCV 3中的FLANN错误

16

我正在使用Ubuntu 14.04。我试图在openCV 3上运行FLANN,但是出现了错误。

在使用AKAZE和ORB的所有尝试都失败后,下面的代码是我尝试使用ORB时出现的。

我使用ORB方法来查找描述符和关键点。

  Ptr<ORB> detector = ORB::create();

  std::vector<KeyPoint> keypoints_1, keypoints_2;
  Mat descriptors_1, descriptors_2;

  detector->detectAndCompute( img_1, noArray(), keypoints_1, descriptors_1 );
  detector->detectAndCompute( img_2, noArray(), keypoints_2, descriptors_2 );

使用 ORB 后,我使用以下代码来查找匹配项:

  FlannBasedMatcher matcher;
  std::vector<DMatch> matches;
  matcher.match(descriptors_1, descriptors_2, matches);

代码可以正常编译。但是运行代码时,我遇到了这个错误:

OpenCV Error: Unsupported format or combination of formats (type=0
) in buildIndex_, file /home/jim/opencv/modules/flann/src/miniflann.cpp, line 315
terminate called after throwing an instance of 'cv::Exception'
  what():  /home/jim/opencv/modules/flann/src/miniflann.cpp:315: error: (-210) type=0
 in function buildIndex_

Aborted (core dumped)

有人能告诉我为什么吗?这是因为OpenCV 3处于BETA状态吗?除了BFMatcher之外,是否有替代FLANN的选择?


你能提供更多关于如何制作描述符的信息吗?有些匹配器不接受浮点/整型描述符。 - Rafael Ruiz Muñoz
@RafaFirenze 刚刚添加了(在我上面的帖子中)我用来查找描述符的代码。 - Metalzero2
请看这里的同一问题答案:http://answers.opencv.org/question/59996/flann-error-in-opencv-3/ - berak
3个回答

24

所以我说:

为了使用FlannBasedMatcher,您需要将描述符转换为CV_32F

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

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

你可以看一下这个类似的问题


成功了!非常感谢你的帮助。我已经看过那篇文章(你提供的链接),但因为被接受的答案说这只是一个 bug,所以我忽略了它。再次感谢你的帮助 :) - Metalzero2
没问题!我想当它发生在我身上时,我也做了同样的事情!;) - Rafael Ruiz Muñoz
嗨,我也在使用ORB并且遇到了相同的错误。我尝试使用提供的解决方案,但是我仍然遇到了相同的错误。你能帮忙解决一下吗? - Anirudh
你需要描述错误并展示代码 @Anirudh - Rafael Ruiz Muñoz
2
ORB 和 AKAZE 描述符是 二进制 的,不像 SIFT 和 SURF 是 浮点数。为了比较 ORB / AKAZE 描述符,请使用 FLANN + LSH 索引或暴力匹配 + 汉明距离。[http://answers.opencv.org/question/59996/flann-error-in-opencv-3/] - Nirmal

8

拉斐尔·鲁伊斯·穆尼奥斯的答案是错误的。

将描述符转换为CV_32F可以消除断言错误。但是,匹配器的行为将变得不正确。

ORB是汉明描述符。默认情况下,FlannBasedMatcher创建L2欧几里得KDTreeIndexParams()。

尝试以以下方式初始化匹配器:

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

你好。我的答案并没有错,它在不同的情况下可以工作。就是这样 :) - Rafael Ruiz Muñoz

3

不支持的格式或格式组合如果无法计算描述符,则也会抛出异常。

您可以在使用detectAndCompute后使用empty()检查是否是这种情况,如下:

  detector->detectAndCompute( img_1, noArray(), keypoints_1, descriptors_1 );
  detector->detectAndCompute( img_2, noArray(), keypoints_2, descriptors_2 ); 

  if ( descriptors_1.empty() ) {
     cvError(0,"MatchFinder","descriptors_1 descriptor empty",__FILE__,__LINE__);
  }
  if ( descriptors_2.empty() ) {
     cvError(0,"MatchFinder","descriptors_2 empty",__FILE__,__LINE__);
  }

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