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 状态?有没有 FLANN 的替代品(BFMatcher 除外)

4

3 回答 3

21

所以我说的是:

为了使用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);
}

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

于 2015-04-17T09:13:18.790 回答
7

The answer by Rafael Ruiz Muñoz is wrong.

Convert the descriptors to CV_32F elimilated the assertion error. But, the matcher will behavior in the wrong way.

ORB is hamming descriptor. By default, the FlannBasedMatcher creates L2 euclid KDTreeIndexParams().

Try to init the matcher in the flowing way,

cv::FlannBasedMatcher matcher(new cv::flann::LshIndexParams(20, 10, 2));
于 2018-05-21T09:02:24.303 回答
2

Unsupported format or combination of formats如果无法计算描述符,也会抛出。

empty()您可以使用after检查是否是这种情况detectAndCompute,因此:

  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__);
  }
于 2018-01-05T20:27:40.090 回答