web-dev-qa-db-ja.com

OpenCV 3.0でc ++を使用してSIFTを使用するにはどうすればよいですか?

私はOpenCV 3.0を使用しており、opencv_contribモジュールでコンパイルしてインストールしたので、問題はありません。残念ながら、以前のバージョンの例は現在のバージョンでは機能しないため、この質問には 既に質問されています複数回 実際に動作します。 公式の例 もこのバージョンでは機能せず(機能検出は機能しますが、他の機能例は機能しません)、とにかくSURFを使用します。

それでは、C++でOpenCV SIFTを使用するにはどうすればよいですか? この例 のように、2つの画像のキーポイントを取得して一致させたいのですが、ポイントと記述子を取得するだけでも十分に役立ちます。助けて!

12
leinaD_natipaC
  1. opencv_contrib repo を取得します
  2. そこにあるreadmeで時間を取って、mainopencv cmake設定に追加します
  3. メインのopencvリポジトリでcmake/make/installを再実行します

その後:

   #include "opencv2/xfeatures2d.hpp"

  // 
  // now, you can no more create an instance on the 'stack', like in the tutorial
  // (yea, noticed for a fix/pr).
  // you will have to use cv::Ptr all the way down:
  //
  cv::Ptr<Feature2D> f2d = xfeatures2d::SIFT::create();
  //cv::Ptr<Feature2D> f2d = xfeatures2d::SURF::create();
  //cv::Ptr<Feature2D> f2d = ORB::create();
  // you get the picture, i hope..

  //-- Step 1: Detect the keypoints:
  std::vector<KeyPoint> keypoints_1, keypoints_2;    
  f2d->detect( img_1, keypoints_1 );
  f2d->detect( img_2, keypoints_2 );

  //-- Step 2: Calculate descriptors (feature vectors)    
  Mat descriptors_1, descriptors_2;    
  f2d->compute( img_1, keypoints_1, descriptors_1 );
  f2d->compute( img_2, keypoints_2, descriptors_2 );

  //-- Step 3: Matching descriptor vectors using BFMatcher :
  BFMatcher matcher;
  std::vector< DMatch > matches;
  matcher.match( descriptors_1, descriptors_2, matches );

また、opencv_xfeatures2dをリンクすることを忘れないでください!

40
berak