SIFT特征点检测_使用python+opencv

关于SIFT算法的详解可以参考这篇博客:https://blog.csdn.net/zddblog/article/details/7521424
本文旨在使用python+opencv来实现特征点检测的内容。
opencv中已经有写好的SIFT函数cv2.xfeatures2d.SIFT_create().detectAndCompute(),直接使用就行。下面简单讲讲这个函数。

注意:opencv高版本中剔除了cv2.xfeatures2d.SIFT_create()函数,所以要用低版本的opencv,如果你的opencv版本过高,可以用pip uninstall opencv-python 卸载后,使用下面的命令重新安装低版本即可。

pip install opencv-python==3.4.2.16
pip install opencv-contrib-python==3.4.2.16

cv2.xfeatures2d.SIFT_create().detectAndCompute()的参数:
一般是image(需要检测的照片)和None(默认), 即:

cv2.xfeatures2d.SIFT_create().detectAndCompute(image,None)

cv2.xfeatures2d.SIFT_create().detectAndCompute()的返回值:

kps, des = cv2.xfeatures2d.SIFT_create().detectAndCompute()

kps 是关键点,是一个列表,记录所有检测到特征点的信息。它所包含的信息有:

  • angle:角度,表示关键点的方向,为了保证方向不变形,SIFT算法通过对关键点周围邻域进行梯度运算,求得该点方向。-1为初值;
  • class_id:当要对图片进行分类时,我们可以用class_id对每个特征点进行区分,未设定时为-1,需要靠自己设定;
  • octave:代表是从金字塔哪一层提取的得到的数据;
  • pt:关键点点的坐标;
  • response:响应程度,代表该点强壮大小,更确切的说,是该点角点的程度;
  • size:该点直径的大小。
    下面是将kp的内容依次打印出来的结果(注释行为输出):
print(type(kp))
#kp的类型:<class 'list'>
print(len(kp)))
#kp的个数:8947
print(kp[0].angle)
#167.8749237060547
print(kp[0].class_id)
#-1
print(kp[0].octave)
#15926015
print(kp[0].pt)
#(2.730217695236206, 57.79762268066406)
print(kp[0].response)
#0.02118147909641266
print(kp[0].size)
#2.819002389907837

des:返回特征点的特征描述符,是一个二维列表,或者说是一个矩阵,列表元素为Dmatch类型,输出如下图所示:

print(type(des))#打印des的类型
print(des.shape)#打印des的形状
print(des)#打印des
print(des[1])#打印des[1]

out:

<class 'numpy.ndarray'>

(8947, 128)

[[ 46.  42.   5. ...   0.   0.   0.]
 [  3.   3.   2. ...   0.   0.   0.]
 [119.  16.   5. ...   5.   0.   0.]
 ...
 [ 28.  61.  59. ...   0.   0.   0.]
 [ 45.  16.   1. ...   0.   0.   0.]
 [  0.   0.   0. ...  81.  66.  52.]]
 
[  3.   3.   2.   1.   4.   5.   1.   1. 152.   5.   1.   1.   0.   0.
   0.   3. 200.  13.   0.   0.   0.   0.   0.   4.  59.   5.   0.   0.
   0.   0.   0.   1.   6.   3.   0.   2.  16.   4.   1.   2. 178.  14.
   0.   0.   1.   3.   1.   4. 200.  21.   0.   0.   0.   0.   0.   4.
  38.   4.   0.   0.   0.   0.   0.   0.   7.   8.   3.   7.   9.   1.
   0.   2. 181.  10.   3.   0.   1.   2.   0.  17. 200.  30.   0.   0.
   0.   0.   0.  18.   9.   2.   0.   0.   0.   0.   0.   0.   8.   3.
   2.   3.   3.   0.   0.   3. 135.  16.   1.   2.   3.   0.   0.   3.
 155.  59.   0.   0.   0.   0.   0.   2.   0.   0.   0.   0.   0.   0.
   0.   0.]

使用这个函数,我们就可以进行编程:

#导入需要的库
import numpy as np
import cv2
from matplotlib import pyplot as plt

#图片地址,改为自己的
img_path = r"E:\Postgraduate project\sift_1\2.JPG"
#引入sift创建函数
sift = cv2.xfeatures2d.SIFT_create()
#读入图片
img = cv2.imread(img_path)
#进行sift特征点检测
kp,des = sift.detectAndCompute(img,None)

#画出关键点
img1=cv2.drawKeypoints(img,kp,img,color=(255,0,0))#color为标记特征点的颜色,按(B,G,R)排的

#显示图片
cv2.imshow('point',img1)

#写入图片,保存的位置改为自己的
cv2.imwrite(r"E:\Postgraduate project\sift_1\sift_2.JPG",img1)
cv2.waitKey(0)#按下任意键退出
cv2.destroyAllWindows()

原图:在这里插入图片描述
标记特征点后:
在这里插入图片描述
图中的蓝色点即为用sift检测到的特征点。

  • 4
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python是一种功能强大的编程语言,在计算机视觉领域广泛应用。OpenCV是一个开源的计算机视觉库,提供了许多处理图像和视频的函数和方法。SIFT是一种常用的特征提取算法,可以在图像中检测出关键点,并生成特征向量。在这里,我们将介绍如何使用Python结合OpenCV实现SIFT特征提取与匹配。 使用Python实现SIFT特征提取的基本步骤如下: 1. 导入OpenCV库并读取图像 ``` import cv2 img = cv2.imread('image.jpg') ``` 2. 创建SIFT对象并检测关键点 ``` sift = cv2.xfeatures2d.SIFT_create() kp, des = sift.detectAndCompute(img, None) ``` 通过使用SIFT对象的detectAndCompute()函数,我们可以对图像进行关键点检测特征描述符提取,并将结果保存在两个变量kp和des中。 3. 可视化关键点并保存图像 ``` img_kp = cv2.drawKeypoints(img, kp, None) cv2.imshow('Keypoints', img_kp) cv2.imwrite('output.jpg', img_kp) cv2.waitKey() ``` 在这个步骤中,我们使用drawKeypoints()函数将检测到的关键点绘制在图像上,并可以通过imshow()函数显示图像。然后,我们可以使用imwrite()函数将图像保存到本地。 实现SIFT特征匹配的基本步骤如下: 1. 读取并检测两张图像的关键点和描述符 ``` import cv2 img1 = cv2.imread('image1.jpg') img2 = cv2.imread('image2.jpg') sift = cv2.xfeatures2d.SIFT_create() kp1, des1 = sift.detectAndCompute(img1, None) kp2, des2 = sift.detectAndCompute(img2, None) ``` 2. 创建并运行暴力匹配器 ``` bf = cv2.BFMatcher() matches = bf.knnMatch(des1, des2, k=2) ``` 3. 使用比值测试来筛选出良好的匹配 ``` good_matches = [] for m, n in matches: if m.distance < 0.75 * n.distance: good_matches.append([m]) ``` 4. 可视化匹配点并保存图像 ``` img_matched = cv2.drawMatchesKnn(img1, kp1, img2, kp2, good_matches, None, flags=2) cv2.imshow('Matching result', img_matched) cv2.imwrite('output.jpg', img_matched) cv2.waitKey() ``` 在步骤2中,我们使用了暴力匹配器BFMatcher()来对特征描述符进行匹配。knnMatch()函数返回的是最近邻和次近邻的描述符距离,我们可以用比值测试筛选出距离最近的描述符,并将其作为好的匹配。最后,我们使用drawMatchesKnn()可以将匹配点绘制在图像上,并通过imshow()函数显示图像。最后,我们可以通过imwrite()函数保存图像。 综上所述,使用Python结合OpenCV实现SIFT特征提取和匹配非常简单。利用OpenCV中的函数和方法,我们可以轻松地处理图像和视频,实现各种计算机视觉应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值