Est-ce que quelqu'un connaît le lien d'exemple d'implémentation de SIFT avec OpenCV 2.2. Cordialement,
Réponses
Trop de publicités?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
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
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.
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;
}
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/