(二)OpenCV特征提取与检测_07_SIFT特征检测

Azura ·
更新时间:2024-09-21
· 652 次阅读

SIFT(Scale-Invariant Feature Transform)特征检测关键特性:
①建立尺度空间,寻找极值
工作原理
构建图像高斯金字塔,求取DOG,发现最大与最小值在每一级;
构建的高斯金字塔,每一层根据sigma的值不同,可以分为几个等级,最少有4个。 ②关键点定位(寻找关键点准确位置与删除弱边缘)
我们在像素级别获得了极值点的位置,但是更准确的值应该在亚像素位置,这个过程称为关键点(准确/精准)定位;
删除弱边缘- 通过Hassian 矩阵特征值实现,小于阈值自动舍弃。 ③关键点方向指定
求得每一层对应图像的梯度,根据给定的窗口大小计算每个高斯权重,sigma=scalex1.5, 0~360之间建立36个直方图Bins
找最高峰对应的Bin, 大于max*80% 的都保留
这样就实现了旋转不变性,提高了匹配时候的稳定性。
大约有15%的关键点会有多个方向。 ④关键点描述子
拟合多项式插值寻找最大Peak
得到描述子=8x16=128 #include #include #include using namespace cv; using namespace std; using namespace cv::xfeatures2d; int main(int argc, char** argv) { Mat src = imread("../path.jpg", IMREAD_GRAYSCALE); if (src.empty()) { printf("could not load image...\n"); return -1; } namedWindow("src", WINDOW_AUTOSIZE); imshow("src", src); //SIFT特征检测 int numFeatures = 400;//定义阈值hessianThreshold为100 Ptr detector = SIFT::create(numFeatures);//定义一个SIFT特征检测器 vector keypoints;//定义关键点 detector->detect(src, keypoints, Mat());//检测 cout << "Total KeyPoints :" << keypoints.size() << endl;//总共有多少个关键点 //绘制关键点 Mat dst; drawKeypoints(src, keypoints, dst, Scalar::all(-1), DrawMatchesFlags::DEFAULT); namedWindow("SIFT KeyPoints", WINDOW_AUTOSIZE); imshow("SIFT KeyPoints", dst); waitKey(0); return 0; }

输出结果:
基于OpenCV4.1.1,函数/功能未实现(此算法已获得专利,不包括在此配置中)…
在这里插入图片描述


作者:丶小早



sift opencv

需要 登录 后方可回复, 如果你还没有账号请 注册新账号