Кто-нибудь знает ссылку примера реализации SIFT с OpenCV 2.2. С уважением,
Просеивать реализацию с помощью OpenCV 2.2
Ответ 1
Ниже приведен минимальный пример:
#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;
}
Протестировано на OpenCV 2.3
Ответ 2
Вы можете получить детектор SIFT и экстрактор на основе SIFT несколькими способами. Поскольку другие уже предложили более прямые методы, я предоставлю более "программный" подход, который может сделать ваш код более гибким для изменений (т.е. Легче изменить на другие детекторы и экстракторы).
Во-первых, если вы хотите получить детектор, используя встроенные параметры, лучший способ - использовать методы OpenCV factory для его создания. Вот как:
#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;
}
Причина использования методов factory является гибкой, поскольку теперь вы можете переключиться на другой детектор ключей или экстрактор признаков, например. SURF, просто изменив аргумент, переданный методам "create" factory следующим образом:
Ptr<FeatureDetector> featureDetector = FeatureDetector::create("SURF");
Ptr<DescriptorExtractor> featureExtractor = DescriptorExtractor::create("SURF");
Для других возможных аргументов для передачи других детекторов или экстракторов см. http://opencv.itseez.com/modules/features2d/doc/common_interfaces_of_feature_detectors.html#featuredetector-create
Теперь, используя методы factory, вы получаете удобство не угадывать некоторые подходящие параметры для прохождения к каждому из детекторов или экстракторов. Это может быть удобно для людей, новых для их использования. Однако, если вы хотите создать свой собственный SIFT-детектор, вы можете обернуть объект SiftDetector, созданный с помощью настраиваемых параметров, и перенести его в интеллектуальный указатель и обратиться к нему с помощью переменной интеллектуального указателя featureDetector, как указано выше.
Ответ 3
Простой пример использования SIFT без функции детектора функции в 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;
}
Ответ 4
OpenCV предоставляет SIFT и SURF (здесь тоже) и другие дескрипторы функций из коробки.
Обратите внимание, что алгоритм SIFT запатентован, поэтому он может быть несовместим с обычным использованием/лицензией OpenCV.
Ответ 5
Еще один простой пример использования SIFT без функции детектора функции в opencv 2.4 Обязательно добавьте зависимость 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;
}
Ответ 6
если кому-то интересно, как это сделать с двумя изображениями:
import numpy as np
import cv2
print ('Initiate SIFT detector')
sift = cv2.xfeatures2d.SIFT_create()
print ('find the keypoints and descriptors with SIFT')
gcp1, des1 = sift.detectAndCompute(src_img,None)
gcp2, des2 = sift.detectAndCompute(trg_img,None)
# create BFMatcher object
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
matches = bf.match(des1,des2)
# Sort them in the order of their distance.
matches = sorted(matches, key = lambda x:x.distance)
#print only the first 100 matches
img3 = drawMatches(src_img, gcp1, trg_img, gcp2, matches[:100])