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:
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?
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
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;
}
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.