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!
_
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
_
Flannは、記述子がCV_32Fタイプである必要があるため、それらを変換する必要があります。 find_object/example/main.cpp :
if(dbDescriptors.type()!=CV_32F) {
dbDescriptors.convertTo(dbDescriptors, CV_32F);
}
動作する可能性があります;-)
ORBを使用する場合は、次のようにマッチャーを作成する必要があります。
FlannBasedMatcher matcher(new cv::flann::LshIndexParams(5, 24, 2));
私も見ました このコンストラクターが提案しました :
FlannBasedMatcher matcher(new flann::LshIndexParams(20,10,2));
バイナリ文字列記述子-ORB、BRIEF、BRISK、FREAK、AKAZEなど。
浮動小数点記述子-SIFT、SURF、GLOHなど。
バイナリ記述子の機能マッチングは、浮動小数点記述子に使用されるユークリッド距離とは対照的に、ハミング距離を比較することで効率的に実行できます。
OpenCVでバイナリ記述子を比較するには、FLANN + LSHインデックスまたはブルートフォース+ハミング距離を使用します。
http://answers.opencv.org/question/59996/flann-error-in-opencv-3/
デフォルトでは、FlannBasedMatcherはL2ノルムのKDTreeIndexとして機能します。これが、SIFT/SURF記述子でうまく機能し、ORB記述子の場合は 例外をスローする である理由です。