SIFT原理:
- 尺度空间极值检测:构建高斯金字塔,高斯差分金字塔,检测极值点。
- 关键点定位:去除对比度较小和边缘对极值点的影响。
- 关键点方向确定:利用梯度直方图确定关键点的方向。
- 关键点描述:对关键点周围图像区域分块,计算块内的梯度直方图,生成具有特征向量,对关键点信息进行描述。
在OpenCV中利用SIFT检测关键点的流程如下所示:
1.实例化sift
sift = cv.xfeatures2d.SIFT_create()
2.利用sift.detectAndCompute()检测关键点并计算
kp,des = sift.detectAndCompute(gray,None)
参数:
- gray: 进行关键点检测的图像,注意是灰度图像
返回:
- kp: 关键点信息,包括位置,尺度,方向信息
- des: 关键点描述符,每个关键点对应128个梯度信息的特征向量
3.将关键点检测结果绘制在图像上
cv.drawKeypoints(image, keypoints, outputimage, color, flags)
参数:
- image: 原始图像
- keypoints:关键点信息,将其绘制在图像上
- outputimage:输出图片,可以是原始图像
- color:颜色设置,通过修改(b,g,r)的值,更改画笔的颜色,b=蓝色,g=绿色,r=红色。
- flags:绘图功能的标识设置
1.cv2.DRAW_MATCHES_FLAGS_DEFAULT:创建输出图像矩阵,使用现存的输出图像绘制匹配对和特征点,对每一个关键点只绘制中间。
2.cv2.DRAW_MATCHES_FLAGS_DRAW_OVER_OUTIMG:不创建输出图像矩阵,而是在输出图像上绘制匹配对。
3.cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS:对每一个特征点绘制带大小和方向的关键点图形。
4.cv2.DRAW_MATCHES_FLAGS_NOT_DRAW_SINGLE_POINTS:单点的特征点不被绘制。
import cv2 as cv
import matplotlib.pyplot as plt
# 1 读取图像
img = cv.imread('./1.jpg')
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
# 2 sift关键点检测
# 2.1 实例化sift对象
sift = cv.xfeatures2d.SIFT_create()
# 2.2 关键点检测:kp关键点信息包括方向,尺度,位置信息,des是关键点的描述符
kp, des = sift.detectAndCompute(gray, None)
# 2.3 在图像上绘制关键点的检测结果
cv.drawKeypoints(img, kp, img, flags=cv.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
# 3 图像显示
plt.figure(figsize=(8, 6), dpi=100)
plt.imshow(img[:, :, ::-1]), plt.title('sift检测')
plt.xticks([]), plt.yticks([])
plt.show()