Implementazione di vagliatura con OpenCV 2.2

Qualcuno conosce il collegamento dell’esempio di implementazione SIFT con OpenCV 2.2. Saluti,

Di seguito è un esempio minimo:

#include  #include  int main(int argc, const char* argv[]) { const cv::Mat input = cv::imread("input.jpg", 0); //Load as grayscale cv::SiftFeatureDetector detector; std::vector 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; } 

Testato su OpenCV 2.3

È ansible ottenere il rivelatore SIFT e l’estrattore basato su SIFT in diversi modi. Come altri hanno già suggerito i metodi più diretti, fornirò un approccio più “di ingegneria del software” che potrebbe rendere il codice più flessibile ai cambiamenti (cioè più facile da cambiare ad altri rivelatori ed estrattori).

In primo luogo, se stai cercando di ottenere il rilevatore utilizzando i parametri incorporati, il modo migliore è utilizzare i metodi di produzione di OpenCV per crearlo. Ecco come:

 #include  #include  #include  #include  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::create("SIFT"); vector 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 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 ragione per cui si utilizzano i metodi di produzione è flessibile perché ora è ansible passare a un rilevatore di punti chiave o a un estrattore di feature diversi, ad esempio SURF, semplicemente cambiando l’argomento passato ai metodi di produzione “create” come questo:

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

Per altri possibili argomenti da passare per creare altri rilevatori o estrattori, vedere: 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

Ora, usare i metodi di fabbrica significa ottenere la comodità di non dover indovinare alcuni parametri adatti da passare a ciascuno dei rivelatori o degli estrattori. Questo può essere conveniente per le persone nuove nel loro utilizzo. Tuttavia, se si desidera creare il proprio rilevatore SIFT personalizzato, è ansible avvolgere l’object SiftDetector creato con parametri personalizzati e avvolgerlo in un puntatore intelligente e fare riferimento ad esso utilizzando la variabile puntatore intelligente di featureDetector come sopra.

Un semplice esempio che utilizza il rivelatore di funzioni non libere SIFT in opencv 2.4

 #include  #include  using namespace cv; int main(int argc, char** argv) { if(argc < 2) return -1; Mat img = imread(argv[1]); SIFT sift; vector 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; } 

OpenCV fornisce SIFT e SURF ( anche qui ) e altri descrittori di funzioni pronti all’uso.
Si noti che l’ algoritmo SIFT è brevettato, quindi potrebbe essere incompatibile con il normale uso / licenza OpenCV.

Un altro semplice esempio che utilizza il rilevatore di funzioni SENZA non libero in opencv 2.4 Assicurati di aggiungere la dipendenza opencv_nonfree240.lib

 #include "cv.h" #include "highgui.h" #include  int main(int argc, char** argv) { cv::Mat img = cv::imread("image.jpg"); cv::SIFT sift(10); //number of keypoints cv::vector key_points; cv::Mat descriptors, mascara; cv::Mat output_img; sift(img,mascara,key_points,descriptors); drawKeypoints(img, key_points, output_img); cv::namedWindow("Image"); cv::imshow("Image", output_img); cv::waitKey(0); return 0; }