引用及参考博客:https://blog.csdn.net/lyl771857509/article/details/79675137
1、SIFT综述
尺度不变特征转换(Scale-invariant feature transform或SIFT)是一种电脑视觉的算法用来侦测与描述影像中的局部性特征,它在空间尺度中寻找极值点,并提取出其位置、尺度、旋转不变量,此算法由 David Lowe在1999年所发表,2004年完善总结。
其应用范围包含物体辨识、机器人地图感知与导航、影像缝合、3D模型建立、手势辨识、影像追踪和动作比对。
此算法有其专利,专利拥有者为英属哥伦比亚大学。
局部影像特征的描述与侦测可以帮助辨识物体,SIFT 特征是基于物体上的一些局部外观的兴趣点而与影像的大小和旋转无关。对于光线、噪声、些微视角改变的容忍度也相当高。基于这些特性,它们是高度显著而且相对容易撷取,在母数庞大的特征数据库中,很容易辨识物体而且鲜有误认。使用 SIFT特征描述对于部分物体遮蔽的侦测率也相当高,甚至只需要3个以上的SIFT物体特征就足以计算出位置与方位。在现今的电脑硬件速度下和小型的特征数据库条件下,辨识速度可接近即时运算。SIFT特征的信息量大,适合在海量数据库中快速准确匹配。
#include<opencv2/opencv.hpp>
#include<iostream>
#include<math.h>
#include<opencv2/xfeatures2d.hpp>
using namespace cv;
using namespace std;
using namespace cv::xfeatures2d;
Mat src;
int main(int argc, char** argv)
{
src = imread("D:/test/src.png",IMREAD_GRAYSCALE);
if (!src.data)
{
cout << "图片未找到" << endl;
return -1;
}
imshow("input title", src);
int numfeature = 400;
Ptr<SIFT>detector = SIFT::create(numfeature);//与SURF一样,剩余的取默认值
vector<KeyPoint>keypoints;
detector->detect(src, keypoints, Mat());
Mat resultImg;
drawKeypoints(src, keypoints, resultImg, Scalar::all(-1), DrawMatchesFlags::DEFAULT);
imshow("SIFT keypoint", resultImg);
waitKey(0);
return 0;
}
运行结果:
总的来说,SIFT运行效率比SURF低一些,但是检测准确率却比SURF高。