xfeatures2d has featuredetector_create feature detector attribute opencv sift

has - surf opencv



Sift implementación con OpenCV 2.2 (5)

¿Alguien conoce el vínculo del ejemplo de implementación de SIFT con OpenCV 2.2? Saludos,


A continuación se muestra un ejemplo mínimo:

#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; }

Probado en OpenCV 2.3


OpenCV proporciona SIFT y SURF ( aquí también ) y otras descripciones de funciones listas para SIFT .
Tenga en cuenta que el algoritmo SIFT está patentado, por lo que puede ser incompatible con el uso / licencia regular de OpenCV.


Otro ejemplo simple que utiliza el detector de características no libres SIFT en opencv 2.4 Asegúrese de agregar la dependencia opencv_nonfree240.lib

#include "cv.h" #include "highgui.h" #include <opencv2/nonfree/nonfree.hpp> int main(int argc, char** argv) { cv::Mat img = cv::imread("image.jpg"); cv::SIFT sift(10); //number of keypoints cv::vector<cv::KeyPoint> 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; }


Puede obtener el detector SIFT y el extractor basado en SIFT de varias maneras. Como otros ya han sugerido los métodos más directos, proporcionaré un enfoque más "de ingeniería de software" que puede hacer que los códigos sean más flexibles a los cambios (es decir, más fáciles de cambiar a otros detectores y extractores).

En primer lugar, si está buscando obtener el detector utilizando parámetros incorporados, la mejor manera es usar los métodos de fábrica de OpenCV para crearlo. Así es como:

#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 razón por la que se usan los métodos de fábrica es flexible porque ahora puede cambiar a un detector de punto de llave o extractor de funciones diferente, por ejemplo, SURF, simplemente cambiando el argumento pasado a los métodos de fábrica "crear" como este:

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

Para ver otros argumentos posibles para crear otros detectores o extractores, consulte: 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_feature_detectors.html#featuredetector-create

Ahora, usar los métodos de fábrica significa que usted gana la conveniencia de no tener que adivinar algunos parámetros adecuados para pasar a cada uno de los detectores o extractores. Esto puede ser conveniente para personas nuevas en su uso. Sin embargo, si desea crear su propio detector SIFT personalizado, puede envolver el objeto SiftDetector creado con parámetros personalizados y envolverlo en un puntero inteligente y referirse a él utilizando la variable del puntero inteligente featureDetector como se indica anteriormente.


Un ejemplo simple usando el detector de características no libres SIFT en 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; }