web-dev-qa-db-ja.com

OpenCV3のFLANNエラー

Ubuntu14.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がベータ状態になっているものですか? FLANNに代わるものはありますか(BFMatcherを除く)

14

だから私が言ったこと:

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);
}

あなたは見ることができます この同様の質問

16

RafaelRuizMuñozの答えは間違っています。

記述子をCV_32Fに変換すると、アサーションエラーが排除されます。しかし、マッチャーは間違った方法で動作します。

ORBはハミング記述子です。デフォルトでは、FlannBasedMatcherはL2 euclid KDTreeIndexParams()を作成します。

流れるようにマッチャーを初期化してみてください。

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

記述子を計算できなかった場合も、_Unsupported format or combination of formats_がスローされます。

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__);
  }
_
2
davetapley