一、原理
参考大神的博客,介绍的非常详细
SIFT算法详解
二、函数介绍
opencv 3.x中的部分函数有改变:SIFT、SURF等都在cv.xfeatures2d模块中
函数sift.detect()可以在图像中找到关键点。如果想在图像中的一个区域搜索的话,可以创建一个掩模图像作为参数使用。返回的关键点是个带有很多不同属性的特殊结构体,这些属性如下:
pt: 表示图像中关键点的X坐标和Y坐标
size: 表示特征的直径
angle:表示特征的方向
response:表示关键点的强度。某些特征会通过SIFT来分类,因为它得到的特征比其他特征更好,通过查看response属性可以评估特征强度
octave:表示特征所在金字塔的层级。SIFT算法与人脸检测算法类似,即只通过改变计算参数来依次处理相同的图像。例如算法在每次迭代(octave)时,作为参数的图像尺寸和相邻像素都会发生变化,因此octave属性表示的是检测到的关键点所在的层级。
class_id: 表示关键点的ID
当我们找到了关键点,我们可以使用函数sift.compute()来计算这些关键点的描述符。
kp = sift.detect(gray, None)
kp, des = sift.compute(gray, kp)
当然还可以使用函数sift.detectAndCompute()一步到位,直接找到关键点并计算出其描述符
kp, des = sift.detectAndCompute(gray, None)
kp 是一个关键点列表。des是一个numpy数组,其大小是关键的数目乘以128.
opencv也提供了绘制关键点的函数cv2.drawKeyPoints(),它可以在关键点的部位绘制一个小圆圈。如果设置了参数为cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS,就会绘制代表关键点大小的圆圈甚至可以绘制关键点的方向。
具体代码:
import cv2 as cv import numpy as np from matplotlib import pyplot as plt img = cv.imread('img/home.jpg') gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY) sift = cv.xfeatures2d_SIFT.create() #两种写法 kp, des = sift.detectAndCompute(gray, None) #kp是一个关键点列表 #des是一个numpy数组,其大小是关键点数目乘以128 # kp = sift.detect(gray, None) # kp, des = sift.compute(gray, kp) print(des) kp_image = cv.drawKeypoints(gray, kp, None, flags=cv.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) cv.imshow('image', kp_image) cv.namedWindow('img',cv.WINDOW_AUTOSIZE) cv.imshow('img',img) cv.waitKey(0) cv.destroyAllWindows()
效果