web-dev-qa-db-ja.com

ORB記述子を使用したopencvFLANN?

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
_
17
dynamic

バグです。間もなく修正されます。

http://answers.opencv.org/question/503/how-to-use-the-lshindexparams/

6
dynamic

Flannは、記述子がCV_32Fタイプである必要があるため、それらを変換する必要があります。 find_object/example/main.cpp

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

動作する可能性があります;-)

33
hans

ORBを使用する場合は、次のようにマッチャーを作成する必要があります。

FlannBasedMatcher matcher(new cv::flann::LshIndexParams(5, 24, 2));

私も見ました このコンストラクターが提案しました

FlannBasedMatcher matcher(new flann::LshIndexParams(20,10,2));
6
Rick Smith

バイナリ文字列記述子-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記述子の場合は 例外をスローする である理由です。

バイナリ機能と局所性鋭敏型ハッシュ(LSH)

バイナリ記述子と浮動小数点記述子のパフォーマンス比較

1
Nirmal