Mise en œuvre de l'EIPD avec OpenCV 2.2

est-ce que quelqu'un connaît le lien entre L'exemple de mise en œuvre de L'EIPD et OpenCV 2.2. cordialement,

33
demandé sur skaffman 2011-03-28 19:18:36

5 réponses

ci-Dessous est 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

33
répondu Unapiedra 2011-07-15 10:44:50

vous pouvez obtenir le détecteur de SIFT et l'extracteur à base de SIFT de plusieurs façons. Comme d'autres ont déjà suggéré des méthodes plus directes, je vais fournir une approche plus "d'ingénierie logicielle" qui pourrait vous rendre le code plus flexible aux changements (c.-à-d. plus facile à changer à d'autres détecteurs et extracteurs).

#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 d'utiliser les méthodes factory est flexible parce que maintenant vous pouvez changer pour un détecteur de point de touche différent ou un extracteur de fonction par exemple SURF simplement en changeant l'argument passé aux méthodes factory "create" comme ceci:

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

pour d'autres arguments possibles à passer pour créer d'autres détecteurs ou Extracteurs 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

30
répondu lightalchemist 2012-01-19 01:01:43

un exemple simple d'utilisation du détecteur de caractéristique non libre SIFT 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;
}
6
répondu AMCoded 2012-06-02 10:47:05