opencv python SIFT(尺度不变特征变换)

Introduction to SIFT (Scale-Invariant Feature Transform) html

理论

前面讲的Harris角点检测器中的角点在旋转的图像中也是角点,可是缩放呢? 若是缩放图像,则角可能不是角.例如,检查下面的简单图像, 当在同一窗口中放大时,小窗口内的小图像中的角是平坦的.因此Harris角点检测器不是尺度不变的.python

clipboard.png

因此,在2004年,不列颠哥伦比亚大学的D.Lowe在他的论文中提出了一种新的算法,即尺度不变特征变换(SIFT).算法

SIFT特征是基于物体上的一些局部外观的兴趣点而与影像的大小和旋转无关。对于光线、噪声、微视角改变的容忍度也至关高.基于这些特性,它们是高度显著并且相对容易撷取,在母数庞大的特征数据库中,很容易辨识物体并且鲜有误认.使用SIFT特征描述对于部分物体遮蔽的侦测率也至关高,甚至只须要3个以上的SIFT物体特征就足以计算出位置与方位.在现今的电脑硬件速度下和小型的特征数据库条件下,辨识速度可接近即时运算.SIFT特征的信息量大,适合在海量数据库中快速准确匹配.数据库

OpenCV中的SIFT

import numpy as np
import cv2

img = cv2.imread('img.jpg')
gray= cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

sift = cv2.xfeatures2d.SIFT_create()
kp = sift.detect(gray,None)

img=cv2.drawKeypoints(gray,kp,img)

cv2.imshow('img',img)
cv2.waitKey()

clipboard.png

NOTE:
lz直接运行上述代码时,程序报错:
module 'cv2.cv2' has no attribute 'xfeatures2d',后面查询缘由知道OpenCv3.x之后只包含部份内容,须要神经网络或者其余的函数须要导入opencv_contrib,因此须要pip install opencv-contrib-python数组

sift.detect()函数在图像中查找关键点, 若是只想搜索图像的一部分,能够传递掩膜.
OpenCV还提供了cv2.drawKeyPoints()函数,该函数在关键点的位置上绘制小圆圈.若是传递标志cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS,它将绘制一个大小为keypoint的圆圈并显示它的方向.网络

import numpy as np
import cv2

img = cv2.imread('img.jpg')

gray= cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

sift = cv2.xfeatures2d.SIFT_create()
kp = sift.detect(gray,None)

img=cv2.drawKeypoints(gray,kp,img,flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)

cv2.imshow('img',img)
cv2.waitKey()

clipboard.png

计算描述符,OpenCV提供了两种方法:函数

  1. 若是已经找到了关键点,能够调用sift.compute()来计算找到的关键点的描述符, 例如:kp,des = sift.compute(gary,kp)
  2. 若是没有找到关键点,能够使用函数sift.detectAndCompute()在一个步骤中直接查找关键点和描述符
sift = cv2.xfeatures2d.SIFT_create()
kp, des = sift.detectAndCompute(gray,None)

kp是关键点列表,des是形状为Number_of_Keypoints×128的numpy数组.spa

相关文章
相关标签/搜索