opencv之sift算法

来源:互联网 发布:淘宝win10专业版激活码 编辑:程序博客网 时间:2024/05/29 15:08

  sift特征 (Scale-invariant feature transform,尺度不变特征转换) 是一种计算机视觉的算法,用来侦测与描述影像中的局部性特征,它在空间尺度中寻找极值点,并提取出其位置、尺度、旋转不变量。此算法由David Lowe在1999年所发表,2004年完善总结。其应用范围包含物体辨识、机器人地图感知与导航、影像缝合、3D模型建立、手势辨识、影像追踪和动作比对。此算法有其专利,专利拥有者为英属哥伦比亚大学。
  sift算法主要特点:从理论上说,sift是一种相似不变量,即对图像尺度变化和旋转是不变量。然而,由于构造SIFT特征时,在很多细节上进行了特殊处理,使得SIFT对图像的复杂变形和光照变化具有了较强的适应性,同时运算速度比较快,定位精度比较高。在多尺度空间采用DOG算子检测关键点,相比传统的基于LOG算子的检测方法,运算速度大大加快;关键点的精确定位不仅提高了精度,而且大大提高了关键点的稳定性。在构造描述子时,以子区域的统计特性,而不是以单个像素作为研究对象,提高了对图像局部变形的适应能力。

  SIFT 算法分为4 个阶段:

1、尺度空间极值检测:该阶段是在图像的全部尺度和全部位置上进行搜索,并通过应用高斯差分函数可以有效地识别出尺度不变性和旋转不变性的潜在特征点。

2、特征点的定位:在每个候选特征点上,一个精细的模型被拟合出来用于确定特性点的位置和尺度。而特征点的最后选取依赖的是它们的稳定程度。

3、方向角度的确定:基于图像的局部梯度方向,为每个特性点分配一个或多个方向角度。所有后续的操作都是相对于所确定下来的特征点的角度、尺度和位置的基础上进行的,
因此特征点具有这些角度、尺度和位置的不变性。

4、特征点的描述符:在所选定的尺度空间内,测量特征点邻域区域的局部图像梯度,将这些梯度转换成一种允许局部较大程度的形状变形和亮度变化的描述符形式

1、使用opencv内置的库读取图片imread()

2、调用sift函数,根据sift函数的接口,sift(InputArray _image, InputArray _mask,vector<KeyPoint>& keypoints,OutputArray _descriptors,bool useProvidedKeypoints),可以分别得到特征点和描述符。

3、利用暴力匹配算子,定义一个匹配算子matcher,BruteForceMatcher<L2<float>> matcher,定义一个向量,matches用来存放将第二步得到的descriptors进行匹配结果,matcher.match(descriptors1, descriptors2, matches)。

4、根据匹配得到的matches,利用drawMatches函数画图,drawMatches(img1, key_points1, img2, key_points2, matches, img_matches, Scalar(255, 255, 255));。


0 0
原创粉丝点击