Как использовать SIFT в OpenCV 3.0 с c++?

У меня есть OpenCV 3.0, и я скомпилировал и установил его с модулем opencv_contrib, так что это не проблема. К сожалению, примеры из предыдущих версий не работают с текущей, и поэтому, хотя этот вопрос имеет уже спросил еще раз Я хотел бы более актуальный пример, с которым я могу работать. Даже официальные примеры не работает в этой версии (функция обнаружения работает, но не другая функция примеры), и они все равно используют SURF.

Итак, как использовать OpenCV SIFT на C++? Я хочу захватить ключевые точки в двух изображениях и сопоставить их, подобно , но даже просто получение точек и дескрипторов было бы достаточной помощью. Помогите!

1 ответов


  1. скачать opencv_contrib repo
  2. Не торопитесь с readme там, добавьте его в свой main настройки opencv cmake
  3. повторите cmake / make / install в главном РЕПО opencv

затем:

   #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!