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を除く)
だから私が言ったこと:
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);
}
あなたは見ることができます この同様の質問 :
RafaelRuizMuñozの答えは間違っています。
記述子をCV_32Fに変換すると、アサーションエラーが排除されます。しかし、マッチャーは間違った方法で動作します。
ORBはハミング記述子です。デフォルトでは、FlannBasedMatcherはL2 euclid KDTreeIndexParams()を作成します。
流れるようにマッチャーを初期化してみてください。
cv::FlannBasedMatcher matcher(new cv::flann::LshIndexParams(20, 10, 2));
記述子を計算できなかった場合も、_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__);
}
_