关于sift特征检测的原理请看这篇文章:SIFT特征检测(超详细)
代码展示
#导入所需要的库
import cv2
import numpy as np
# 读取原始图片
face = cv2.imread('face1.jpg')
# 转换为灰度图
gray = cv2.cvtColor(face, cv2.COLOR_BGR2GRAY)
# 实例化sift对象
sift = cv2.SIFT_create()
'''sift特征检测器来查找图像中的关键点(也称为特征点)和计算它们的描述子
每个关键点对象包含了有关关键点的信息,例如位置、尺度、方向等'''
kps = sift.detect(gray)
# 在原始图像上绘制出关键点
face_sift = cv2.drawKeypoints(face, kps, face.copy(), flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
cv2.imshow('face_sift', face_sift)
cv2.waitKey(0)
# 使用sift.compute()计算关键点点的描述符,以便后期的特征配对
kps, des = sift.compute(face, kps)
# 返回kps和des的维度信息
print(np.array(kps).shape, des.shape)
运行结果:
其中需要提到的一个方法是: cv2.drawKeypoints(image, keypoints, outImage, color, flags)
-
image: 要绘制关键点的输入图像。
-
keypoints
: 包含关键点信息的列表,通常是通过特征检测器(如SIFT、SURF、ORB等)检测得到的。 -
outImage
: 可选参数,用于指定绘制关键点后的输出图像。如果不提供此参数,函数会直接在输入图像上绘制关键点。 -
color
: 可选参数,用于指定绘制关键点的颜色。默认情况下,关键点通常以随机颜色绘制。你可以指定颜色,例如(0, 255, 0)
表示绿色,来绘制关键点的颜色。 -
flags
: 可选参数,用于指定绘制关键点的附加标志。其中包括以下选项:cv2.DRAW_MATCHES_FLAGS_DEFAULT
:默认标志,没有特殊设置。cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS
:如果设置了这个标志,关键点将被绘制为彩色圆圈,其中圆圈的大小表示关键点的尺度,圆圈内部有一个小圆点表示关键点的方向。
其中看kps和des是两个重要返回参数:
从上图可以看出kps是包含357个元素的元组,也就是说明目标图检测出357个关键点
其中angle:表示当前关键点区域的亮度变化值
class_id:表示关键点的类别
octave:SIFT 检测器将图像金字塔分解成多个不同尺度的图像组,每个尺度级别被称为一个"八度"。
pt:表示该点的坐标
response:关键点的响应强值,它通常用于帮助筛选和排除不适合的关键点
size:表示圆的半径大小,单位是像素
这里对des我们要知道它是一个357*128的数组,也就是说每个关键点会有128个特征去描述它。