33 votes

Sift implémentation avec OpenCV 2.2

Est-ce que quelqu'un connaît le lien d'exemple d'implémentation de SIFT avec OpenCV 2.2. Cordialement,

35voto

Unapiedra Points 2341

Voici un exemple minimal:

 #include <opencv/cv.h>
#include <opencv/highgui.h>

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.3

30voto

lightalchemist Points 2931

Vous pouvez obtenir le détecteur SIFT et TAMISER à base d'extracteur de plusieurs façons. Comme d'autres l'ont déjà suggéré des méthodes les plus directes, je vais vous donner un aspect plus "génie logiciel" approche qui peut vous rendre le code plus flexible aux changements (c'est à dire plus facile de changer à d'autres détecteurs et extracteurs).

Tout d'abord, si vous êtes à la recherche pour obtenir le détecteur à l'aide intégrée dans les paramètres, le meilleur moyen est d'utiliser OpenCV"s factory méthodes pour créer. Voici comment:

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

#include <vector>

using namespace std;
using namespace cv;

int main(int argc, char *argv[])
{        
  Mat image = imread("TestImage.jpg");

  // Create smart pointer for SIFT feature detector.
  Ptr<FeatureDetector> featureDetector = FeatureDetector::create("SIFT");
  vector<KeyPoint> keypoints;

  // Detect the keypoints
  featureDetector->detect(image, keypoints); // NOTE: featureDetector is a pointer hence the '->'.

  //Similarly, we create a smart pointer to the SIFT extractor.
  Ptr<DescriptorExtractor> featureExtractor = DescriptorExtractor::create("SIFT");

  // Compute the 128 dimension SIFT descriptor at each keypoint.
  // Each row in "descriptors" correspond to the SIFT descriptor for each keypoint
  Mat descriptors;
  featureExtractor->compute(image, keypoints, descriptors);

  // If you would like to draw the detected keypoint just to check
  Mat outputImage;
  Scalar keypointColor = Scalar(255, 0, 0);     // Blue keypoints.
  drawKeypoints(image, keypoints, outputImage, keypointColor, DrawMatchesFlags::DEFAULT);

  namedWindow("Output");
  imshow("Output", outputImage);

  char c = ' ';
  while ((c = waitKey(0)) != 'q');  // Keep window there until user presses 'q' to quit.

  return 0;

}

La raison en utilisant les méthodes de fabrique est flexible parce que maintenant vous pouvez passer à un autre point-clé du détecteur ou de l'extracteur par exemple, SURF, simplement en changeant l'argument passé à la "création" de l'usine de méthodes comme ceci:

Ptr<FeatureDetector> featureDetector = FeatureDetector::create("SURF");
Ptr<DescriptorExtractor> featureExtractor = DescriptorExtractor::create("SURF");

Il y a d'autres arguments à transmettre à créer d'autres détecteurs ou des extracteurs de voir: http://opencv.itseez.com/modules/features2d/doc/common_interfaces_of_feature_detectors.html#featuredetector-create

http://opencv.itseez.com/modules/features2d/doc/common_interfaces_of_descriptor_extractors.html?highlight=descriptorextractor#descriptorextractor-create

Maintenant, en utilisant les méthodes de fabrique signifie que vous bénéficiez de la commodité de ne pas avoir à deviner certains paramètres appropriés pour transmettre à chacun des détecteurs ou des extracteurs. Cela peut être pratique pour les personnes à utiliser. Cependant, si vous souhaitez créer votre propre personnalisé TAMISER détecteur, vous pouvez enrouler le SiftDetector objet créé avec des paramètres personnalisés et de l'envelopper dans un pointeur intelligent et reportez-vous à l'aide de la featureDetector smart pointeur de variable comme ci-dessus.

6voto

AMCoded Points 234

Un exemple simple d'utilisation du détecteur de caractéristiques SIFT non-libre dans opencv 2.4

 #include <opencv2/opencv.hpp>
#include <opencv2/nonfree/nonfree.hpp>
using namespace cv;

int main(int argc, char** argv)
{

    if(argc < 2)
        return -1;

    Mat img = imread(argv[1]);

    SIFT sift;
    vector<KeyPoint> key_points;

    Mat descriptors;
    sift(img, Mat(), key_points, descriptors);

    Mat output_img;
    drawKeypoints(img, key_points, output_img);

    namedWindow("Image");
    imshow("Image", output_img);
    waitKey(0);
    destroyWindow("Image");

    return 0;
}
 

5voto

Adi Shavit Points 4470

OpenCV fournit SIFT et SURF ( ici aussi ) ainsi que d’autres descripteurs de fonctionnalités prédéfinis.
Notez que l’ algorithme SIFT est breveté et qu’il peut donc être incompatible avec l’utilisation / licence OpenCV habituelle.

5voto

DanielX2010 Points 990

Voici un excellent tutoriel sur les EIPD. L'auteur fournit également le code complet pour la mise en œuvre de SIFT. C'est vraiment génial!

http://aishack.in/tutorials/sift-scale-invariant-feature-transform-introduction/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X