SIFT特征提取和匹配

时间:2022-12-25 11:52:35

一、sift特征原理部分:

SIFT特征详解 - *_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