Как использовать SIFT в OpenCV 3.0 с c++?
У меня есть OpenCV 3.0, и я скомпилировал и установил его с модулем opencv_contrib, так что это не проблема. К сожалению, примеры из предыдущих версий не работают с текущей, и поэтому, хотя этот вопрос имеет уже спросил еще раз Я хотел бы более актуальный пример, с которым я могу работать. Даже официальные примеры не работает в этой версии (функция обнаружения работает, но не другая функция примеры), и они все равно используют SURF.
Итак, как использовать OpenCV SIFT на C++? Я хочу захватить ключевые точки в двух изображениях и сопоставить их, подобно , но даже просто получение точек и дескрипторов было бы достаточной помощью. Помогите!
1 ответов
- скачать opencv_contrib repo
- Не торопитесь с readme там, добавьте его в свой main настройки opencv cmake
- повторите 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!