web-dev-qa-db-fra.com

comment utiliser SIFT dans l'opencv

J'apprends le C++ et OpenCV ces jours-ci. Étant donné une image, je veux extraire ses fonctionnalités SIFT. De http://docs.opencv.org/modules/nonfree/doc/feature_detection.html , nous pouvons savoir que OpenCV 2.4.8 possède le module SIFT. Vois ici: enter image description here

Mais je ne sais pas comment l'utiliser. Actuellement, pour utiliser SIFT, je dois d'abord appeler la classe SIFT pour obtenir une instance SIFT. Ensuite, je dois utiliser SIFT::operator()() pour effectuer une EIPD. 

Mais qu'est-ce que OutputArray, InputArray, KeyPoint? Quelqu'un pourrait-il faire une démonstration pour montrer comment utiliser la classe SIFT pour effectuer une EIPD?

10
tqjustc

Voir l'exemple de Implémentation Sift avec 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;
}

Testé sur OpenCV 2.4.8

15
Liam McInroy

mise à jour pour 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;
}
1
lbsweek

J'avais la même question pour opencv3 mais j'ai trouvé ceci . Il explique pourquoi SIFT et SURF ont été supprimés de l'installation par défaut d'OpenCV 3.0 et comment utiliser SIFT et SURF dans OpenCV 3.

0
Yirga