how to use SIFT in opencv

前端 未结 4 725
被撕碎了的回忆
被撕碎了的回忆 2021-02-05 18:58

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

相关标签:
4条回答
  • 2021-02-05 19:21

    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>

    0 讨论(0)
  • 2021-02-05 19:33

    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;
    }
    
    0 讨论(0)
  • 2021-02-05 19:37

    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

    0 讨论(0)
  • 2021-02-05 19:45

    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;
    }
    
    0 讨论(0)
提交回复
热议问题