参考资料:
关键点检测SIFT算法笔记_亦枫Leonlew的博客-CSDN博客
- import cv2 as cv
- import numpy as np
- import matplotlib.pyplot as plt
-
- img = 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])