参考资料:
关键点检测SIFT算法笔记_亦枫Leonlew的博客-CSDN博客
SIFT特征检测算子和sift = cv2.xfeatures2d.SIFT_create出错的解决办法_self.sift=cv2.xfeatures2d.sift_create()_刘凯数据分析的博客-CSDN博客
import cv2 as cv
import numpy as np
import matplotlib.pyplot as pltimg = cv.imread("../SampleImages/shunsuke.jpg", cv.IMREAD_COLOR)
plt.imshow(img[:,:,::-1])#得到灰度图
img_gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
plt.imshow(img_gray, plt.cm.gray)#SIFT算法
#1. 实例化SIFT
# sift = cv.xfeatures2d.SIFT_create()
#参考资料:https://blog.csdn.net/cliukai/article/details/102525486
sift = cv.xfeatures2d.SIFT_create()
#2. 使用sift对象的检测关键点方法
# kp,des = sift.detectAndCompute(gray, None)
# gray:灰度图
# 返回:kp - 关键点信息,包括位置,尺度和方向信息
# des - 关键点描述符,每个关键点对应128个梯度信息的特征向量
#参考资料:https://blog.csdn.net/cliukai/article/details/102525486
keypoints,descriptors = sift.detectAndCompute(img_gray, None)
#3. 将关键点绘制到图像上
# cv.drawKeypoints(img, keypoints, outputimage, color, flags)
# img: 原图,关键点要绘制到的图像
# keypoints:关键点信息
# outputimage:输出图像,可以是原图
# color: 颜色设置,(b,g,r)值
# flags: 绘图的标志
# cv.DRAW_MATCHES_FLAGS_DEFAULT: 创建输出图像矩阵,使用现存的输出图像绘制匹配对和特征点,对每一个关键点只绘制中间点
# cv.DRAW_MATCHES_FLAGS_DRAW_OVER_OUTIMG: 不创建输出图像矩阵,而是在输出图像上绘制匹配对
# cv.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS: 对每一个特征点绘制带大小和方向的关键点图像
# cv.DRAW_MATCHES_FLAGS_NOT_DRAW_SINGLE_POINTS:单点的特征点不被绘制
cv.drawKeypoints(img, keypoints, img, (0,255,0), cv.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)plt.imshow(img[:,:,::-1])