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

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

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

12

Решение

  1. получить opencv_contrib репо
  2. не торопитесь с readme там, добавьте его в свой главный Настройки 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!

39

Другие решения


По вопросам рекламы [email protected]