这几天我在学习C++和OpenCV。给定一张图像,我想提取它的 SIFT 特征。从http://docs.opencv.org/modules/nonfree/doc/feature_detection.html,我们可以知道OpenCV 2.4.8有SIFT模块。 看这里:
但我不知道如何使用它。目前,要使用 SIFT,我需要首先调用 SIFT 类来获取 SIFT 实例。然后,我需要使用
SIFT::operator()()
进行SIFT。
但是
OutputArray
、InputArray
、KeyPoint
是什么?谁能提供一个演示来展示如何使用SIFT
类进行SIFT?
#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;
}
在 OpenCV 2.4.8 上测试
OpenCV 4.2.0 更新(当然,不要忘记链接 opencv_xfeatures2d420.lib)
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/xfeatures2d.hpp>
int main(int argc, char** argv)
{
const cv::Mat input = cv::imread("input.jpg", 0); //Load as grayscale
cv::Ptr<cv::xfeatures2d::SIFT> siftPtr = cv::xfeatures2d::SIFT::create();
std::vector<cv::KeyPoint> keypoints;
siftPtr->detect(input, keypoints);
// Add results to image and save.
cv::Mat output;
cv::drawKeypoints(input, keypoints, output);
cv::imwrite("sift_result.jpg", output);it.
return 0;
}
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;
}
我对 opencv3 有同样的问题,但我发现了this。它解释了为什么 SIFT 和 SURF 从 OpenCV 3.0 的默认安装中删除以及如何在 OpenCV 3 中使用 SIFT 和 SURF。
中的算法和相关实现默认情况下不会安装,您需要在编译和安装 OpenCV 时显式启用它们才能访问它们。opencv_contrib
他们将搬到
xfeatures2d
图书馆。
#include <opencv2/xfeatures2d.hpp>
OpenCv 4.5 的更新以及那些(比如我)不知道的人快速将 @mcy 的评论翻译成代码。
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/features2d.hpp>
int main(int argc, char** argv)
{
const cv::Mat input = cv::imread("input.jpg", 0); //Load as grayscale
cv::Ptr<cv::SIFT> siftPtr = cv::SIFT::create();
std::vector<cv::KeyPoint> keypoints;
siftPtr->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;
}