一、sift特征原理部分:
SIFT特征详解 - Brook_icv - 博客园 (cnblogs.com)
sift特征提取算法_July_Zh1的博客-CSDN博客_sift特征提取算法
二、sift特征提取实践部分:
代码实现:Python+OpenCV
import cv2
def sift_kp(image):
gray_image = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
sift = cv2.SIFT.create()
kp,des = sift.detectAndCompute(image, None)
#kp_image = cv2.drawKeypoints(image, kp, None)
kp_image = cv2.drawKeypoints(image, kp, image, (122, 255, 122), flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
return kp_image,kp,des
#image = cv2.imread('E:\pythonProject\\N2.jpg')
#image = cv2.imread('E:\pythonProject\image1.jpg')
image = cv2.imread('E:\pythonProject\ldh1.jpg')
kp_image, _, des = sift_kp(image)
print(image.shape, des.shape)
cv2.namedWindow('sift features',cv2.WINDOW_NORMAL)
cv2.imshow('sift features', kp_image)
if cv2.waitKey(0) == 27:
cv2.destroyAllWindows()
老版本的OpenCV,则第四行用
sift = cv2.xfeatures2d_SIFT.create()
代替
参考:OpenCV-Python之——图像SIFT特征提取 - 简书 (jianshu.com)
三、sift特征的关键点显示部分:
cv2.drawKeypoints(image, keypoints, outImage, color=None, flags=None)
image 原始图像,可以使三通道或单通道图像;
keypoints 特征点向量,向量内每一个元素是一个KeyPoint对象,包含了特征点的各种属性信息;
outImage 特征点绘制的画布图像,可以是原图像;
color 绘制的特征点的颜色信息,默认绘制的是随机彩色;
flags 特征点的绘制模式,其实就是设置特征点的那些信息需要绘制,那些不需要绘制,有以下几种模式可选:
DRAW_MATCHES_FLAGS_DEFAULT:只绘制特征点的坐标点,显示在图像上就是一个个小圆点,每个小圆点的圆心坐标都是特征点的坐标。
DRAW_MATCHES_FLAGS_DRAW_OVER_OUTIMG:函数不创建输出的图像,而是直接在输出图像变量空间绘制,要求本身输出图像变量就是一个初始化好了的,size与type都是已经初始化好的变量。
DRAW_MATCHES_FLAGS_NOT_DRAW_SINGLE_POINTS :单点的特征点不被绘制。
DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS:绘制特征点的时候绘制的是一个个带有方向的圆,这种方法同时显示图像的坐标,size和方向,是最能显示特征的一种绘制方式
参考:cv2.drawKeypoints函数(opencv学习)_勤奋骚年的博客-CSDN博客_cv2.drawkeypoints