Как использовать SIFT в OpenCV 3.0 с помощью С++?

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

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

Ответ 1

  • получить opencv_contrib repo
  • Не торопитесь с помощью readme, добавьте его в свои основные настройки cmenc. [/li >
  • повторить cmake/make/install в основном opecv repo

то

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