14

I am learning C++ and OpenCV these days. Given an image, I want to extract its SIFT features. From http://docs.opencv.org/modules/nonfree/doc/feature_detection.html, we can know that OpenCV 2.4.8 has the SIFT module. See here: enter image description here

But I do not know how to use it. Currently, to use SIFT, I need to first call the class SIFT to get a SIFT instance. Then, I need to use SIFT::operator()() to do SIFT.

But what is OutputArray , InputArray, KeyPoint? Could anyone give a demo to show how to use SIFT class to do SIFT?

tqjustc
  • 3,624
  • 6
  • 27
  • 42
  • 1
    maybe one of the [tutorials](http://docs.opencv.org/doc/tutorials/features2d/feature_detection/feature_detection.html#feature-detection) is helpful ? – berak Mar 28 '14 at 20:42
  • @berak it is SurfFeatureDetector , not SIFT. But, what I want to use is class SIFT. I show it in the link. Thanks ! – tqjustc Mar 28 '14 at 20:45
  • 2
    yea, i know. but the procedure is similar – berak Mar 28 '14 at 20:53

4 Answers4

18

See the example from Sift implementation with OpenCV 2.2

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/nonfree/features2d.hpp> //Thanks to Alessandro

int main(int argc, const char* argv[])
{
    const cv::Mat input = cv::imread("input.jpg", 0); //Load as grayscale

    cv::SiftFeatureDetector detector;
    std::vector<cv::KeyPoint> keypoints;
    detector.detect(input, keypoints);

    // Add results to image and save.
    cv::Mat output;
    cv::drawKeypoints(input, keypoints, output);
    cv::imwrite("sift_result.jpg", output);

    return 0;
}

Tested on OpenCV 2.4.8

Community
  • 1
  • 1
Liam McInroy
  • 4,339
  • 5
  • 32
  • 53
7

Update for OpenCV 4.2.0 (don’t forget to link opencv_xfeatures2d420.lib, of course)

#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/xfeatures2d.hpp>

int main(int argc, char** argv)
{
    const cv::Mat input = cv::imread("input.jpg", 0); //Load as grayscale

    cv::Ptr<cv::xfeatures2d::SIFT> siftPtr = cv::xfeatures2d::SIFT::create();
    std::vector<cv::KeyPoint> keypoints;
    siftPtr->detect(input, keypoints);

    // Add results to image and save.
    cv::Mat output;
    cv::drawKeypoints(input, keypoints, output);
    cv::imwrite("sift_result.jpg", output);it.

    return 0;
}
Julien Busset
  • 315
  • 1
  • 3
  • 12
  • 1
    I am using xfeatures2d version 451 and it has no member SIFT, it has SURF, DAISY, FREAK and a bunch of others but not SIFT :/ is it deprecated or something? Later edit: Apparently it is under `features2d` and available directly as a class in `cv` now: https://docs.opencv.org/2.4/modules/nonfree/doc/feature_detection.html?highlight=sift – mcy Nov 30 '20 at 14:02
  • 1
    Sorry for two comments, the above link is for version 2.4; for version 4.5 use this link https://docs.opencv.org/master/d7/d60/classcv_1_1SIFT.html – mcy Nov 30 '20 at 14:08
4

update for OpenCV3

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/nonfree/features2d.hpp> //Thanks to Alessandro

int main(int argc, const char* argv[])
{
    const cv::Mat input = cv::imread("input.jpg", 0); //Load as grayscale

    cv::Ptr<cv::SiftFeatureDetector> detector = cv::SiftFeatureDetector::create();
    std::vector<cv::KeyPoint> keypoints;
    detector->detect(input, keypoints);

    // Add results to image and save.
    cv::Mat output;
    cv::drawKeypoints(input, keypoints, output);
    cv::imwrite("sift_result.jpg", output);

    return 0;
}
andrewchan2022
  • 4,953
  • 45
  • 48
0

I was having the same question for opencv3 but i found this. It explains why SIFT and SURF removed from the default install of OpenCV 3.0 and how to use SIFT and SURF in OpenCV 3.

The algorithms and associated implementations in opencv_contrib are not installed by default and you need to explicitly enable them when compiling and installing OpenCV to obtain access to them.

They are move to xfeatures2d library.
#include <opencv2/xfeatures2d.hpp>

Burak
  • 2,251
  • 1
  • 16
  • 33
Yirga
  • 881
  • 1
  • 12
  • 31