基于OpenCv的图像SIFT特征点检测和特征匹配

2024-05-05 02:36

本文主要是介绍基于OpenCv的图像SIFT特征点检测和特征匹配,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

⚠申明: 未经许可,禁止以任何形式转载,若要引用,请标注链接地址。 全文共计3077字,阅读大概需要3分钟
🌈更多学习内容, 欢迎👏关注👀【文末】我的个人微信公众号:不懂开发的程序猿
个人网站:https://jerry-jy.co/

❗❗❗知识付费,🈲止白嫖,有需要请后台私信或【文末】个人微信公众号联系我

基于OpenCv的图像SIFT特征点检测和特征匹配

  • 基于OpenCv的图像SIFT特征点检测和特征匹配
    • 任务需求
    • 任务目标
      • 1、掌握SIFT特征点检测的简单步骤
      • 2、掌握基于OpenCv进行SIFT特征点检测
      • 3、掌握使用SIFT描述子进行蛮力匹配
    • 任务环境
      • 1、jupyter开发环境
      • 2、OpenCv
      • 3、python3.6
    • 任务实施过程
      • 一、SIFT特征点检测
        • 1.导入所需要的工具包和图像
        • 2.SIFT特征点检测
      • 二、特征匹配
        • 1.读入图像
        • 2.Brute-Force蛮力匹配
      • 三、任务小结
  • 说明

基于OpenCv的图像SIFT特征点检测和特征匹配

任务需求

SIFT是一种基于尺度空间的,对图像缩放、旋转甚至仿射变换保持不变性的图像局部特征描述算子。SIFT是迄今使用最为广泛的一种特征提取方法。
图像点特征能够代表图像的内容,所以在运动目标跟踪、物体识别、图像配准、全景图像的拼接、三维重建等方向中,图像特征点的提取都至关重要,特征点提取的好坏将直接决定目标跟踪、物体识别、图像匹配、图像拼接、三维重建的准确度。
例如下图为基于SIFT特征的全景图像拼接。

在这里插入图片描述

在这里插入图片描述

任务目标

1、掌握SIFT特征点检测的简单步骤

2、掌握基于OpenCv进行SIFT特征点检测

3、掌握使用SIFT描述子进行蛮力匹配

任务环境

1、jupyter开发环境

2、OpenCv

3、python3.6

任务实施过程

一、SIFT特征点检测

SIFT是一种基于尺度空间的,对图像缩放、旋转甚至仿射变换保持不变性的图像局部特征描述算子。

SIFT算法主要分为四个步骤:

  • 1.多尺度空间极值点检测:通过高斯金字塔构建高斯差分尺度空间(DOG),寻找尺度空间的极值点,中间的检测点要和其所在图像的上下两层和本层的3×3邻域26个像素点进行比较。
  • 2.特征点精确定位:对尺度空间DoG函数进行曲线拟合,计算其极值点,从而实现关键点的精确定位。
  • 3.特征点的主方向计算:使用直方图统计邻域内像素的梯度和方向,极值点周围区域方向梯度直方图的主峰值也就是特征点的主方向。
  • 4.生成特征点描述:对每个关键点使用16×16的窗口,4×4共16个种子点来描述,这样一个关键点就可以产生128维的SIFT特征向量。

在这里插入图片描述

1.导入所需要的工具包和图像
import cv2 # 导入opencv
import matplotlib.pyplot as plt # 导入绘图模块
import numpy as np # 导入numpy库
from utils import im_show # 导入显示图像函数
# 绘制图像直接展示,不用调用plt.show()
%matplotlib inline 
# 用来正常显示中文标签
plt.rc('font',family="SimHei")
# 读取图像
img = cv2.imread(r'./experiment/data/home.jpg')
# 设置画布大小
plt.figure(figsize=(6,6))
# 显示图像
im_show('原图像',img)

在这里插入图片描述

2.SIFT特征点检测

OpenCV获取SIFT特征点
sift = cv2.SIFT_create()/cv2.xfeatures2d.SIFT_create() 实例化

  • sift:实例化的sift函数

kp = sift.detect(gray, None) 找出图像中的关键点

  • kp:生成的关键点
  • gray:输入的灰度图

ret = cv2.drawKeypoints(gray, kp, img) 在图中画出关键点

  • gray:输入图片
  • kp:SIFT关键点
  • img:返回的图像

kp, dst = sift.compute(kp) 计算关键点对应的sift特征向量(128维)

  • kp:输入的关键点
  • dst:输出的sift特征向量,通常是128维的
# 先将图像转换为灰度图
gray= cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# 创建SIFT特征点检测器
# 如果opencv版本号以4.4开头使用sift = cv2.SIFT_create()实例化
# 如果opencv版本号以4.3开头使用sift = cv2.xfeatures2d.SIFT_create()实例化
sift = cv2.SIFT_create()
# 找出关键点,放入灰度图gray
kp = sift.detect(gray, None)
# 这里得到的关键点不是坐标,默认情况下使封装好的类型,没办法直接从图上显示
# 使用drawKeypoints()函数绘制关键点
img1 = img.copy()
img1=cv2.drawKeypoints(gray,kp,img1)
img2 = img.copy()
# 设置drawKeypoints()函数中特征点的绘制模式
# flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS表示它将绘制一个具有关键点大小的圆,并显示其方向。
img2=cv2.drawKeypoints(gray,kp,img2,flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
plt.figure(figsize=(12,12))
# 显示SIFT检测的特征点和每一个特征点的坐标,size和方向
im_show('SIFT特征点检测',np.hstack((img1,img2)))

在这里插入图片描述

# 求得关键点对应的128个特征向量
kp, des = sift.compute(gray, kp)
print(np.shape(kp))
print(np.shape(des))

图像中提取到了3661个关键点。

在这里插入图片描述

二、特征匹配

原图像与目标图像通过SIFT特征提取生成特征描述子,然后将两图中各个尺度的描述子进行匹配。
依次找出两图中相似度最高的两个特征向量,完成对特征点的连线匹配。

1.读入图像
# 读取图像
ayst1 = cv2.imread(r'./experiment/data/ayst1.jpg')
ayst2 = cv2.imread(r'./experiment/data/ayst2.jpg')
# 设置画布大小
plt.figure(figsize=(12,12))
# 显示图像
plt.subplot(121)
im_show('待匹配图像1',ayst1)
plt.subplot(122)
im_show('待匹配图像1',ayst2)

在这里插入图片描述

2.Brute-Force蛮力匹配

蛮力匹配器:采用第一个特征一些距离计算与第二特征中的所有其它特征匹配,将最近的一个返回。

实现原理:

  • 两幅图片分别提取出来N,M个特征向量
  • 然对N和M的特征向量进行匹配,找到最佳匹配
  • 画出匹配的特征显示出来

OpenCV进行Brute-Force蛮力匹配
bf = cv2.BFMatcher(normType, crossCheck=False)创建BFMatcher对象,有两个可选参数:

  • normType:指定要使用的距离测量,默认情况下为cv.NORM_L2。对于SIFT,SURF等(也有cv.NORM_L1)很有用,对于基于二进制字符串的描述符,例如ORB,BRIEF,BRISK等,应使用cv.NORM_HAMMING,该函数使用汉明距离作为度量。如果ORB使用WTA_K == 3或4,则应使用cv.NORM_HAMMING2。
  • crossCheck:默认值为False,如果设置为True,匹配条件就会更加严格,只有到A中的第i个特征点与B中的第j个特征点距离最近,并且B中的第j个特征点到A中的第i个特征点也是最近时才会返回最佳匹配,即这两个特征点要互相匹配才行。

bf.match(queryDescriptors, trainDescriptors,…)/knnMatch(queryDescriptors, trainDescriptors,k,…)第一个返回最佳匹配, 第二种方法返回k个最佳匹配,其中k由用户指定。

  • queryDescriptors:特征描述子1
  • trainDescriptors:特征描述子2

cv2.drawMatchsKnn(img1,keypoints1,img2,keypoints2,matches1to2,…)如果前面使用的bf.knnMatch(),则可以使用函数cv2.drawMatchsKnn为每个关键点和它的个最佳匹配点绘制匹配线。

  • img1 :源图像1
  • keypoints1:源图像1的特征点.
  • img2:源图像2.
  • keypoints2:源图像2的特征点
  • matches1to2:源图像1的特征点匹配源图像2的特征点
# 初始化SIFT检测器
sift = cv2.SIFT_create()
# 使用SIFT寻找关键点和描述子
kp1, des1 = sift.detectAndCompute(ayst1,None)
kp2, des2 = sift.detectAndCompute(ayst2,None)
print('两个图像提取的SIFT关键点个数分别为:',len(kp1),len(kp2))
# 创建BFMatcher对象,使用默认参数做蛮力匹配
bf = cv2.BFMatcher()
# 进行匹配,放入两个图像的描述向量,设置k=2,一个特征点对应与它最佳匹配的2个特征点
matches = bf.knnMatch(des1,des2,k=2)
# 应用比率测试
good = []
# 使用for循环,设一个特征点对应的两个特征点的距离m和n
# 如果m<0.75n(m和n表示距离)表示距离相对较近,将满足条件的匹配保留下来
for m,n in matches:if m.distance < 0.75*n.distance:good.append([m])
# 使用KNN方法绘制匹配点,flags=0表示画特征点和连线,flags=2表示不画特征点。
img3 = cv2.drawMatchesKnn(ayst1,kp1,ayst2,kp2,good,None,flags=2)
# 设置画布大小
plt.figure(figsize=(12,12))
im_show('使用SIFT描述子的蛮力匹配',img3)

在这里插入图片描述

三、任务小结

本次实验主要完成基于OpenCv的SIFT特征点检测和使用SIFT描述子进行蛮力匹配。注意SIFT特征点检测的步骤和不同OpenCv版本号使用不同的代码创建SIFT特征点检测器。

通过本次实验需要掌握以下内容:

  • 1.掌握基于OpenCv进行SIFT特征点检测
  • 2.掌握使用SIFT描述子进行蛮力匹配
  • 3.掌握使用knnMatch()进行匹配

–end–

说明

本实验(项目)/论文若有需要,请后台私信或【文末】个人微信公众号联系我

这篇关于基于OpenCv的图像SIFT特征点检测和特征匹配的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/960637

相关文章

Nginx路由匹配规则及优先级详解

《Nginx路由匹配规则及优先级详解》Nginx作为一个高性能的Web服务器和反向代理服务器,广泛用于负载均衡、请求转发等场景,在配置Nginx时,路由匹配规则是非常重要的概念,本文将详细介绍Ngin... 目录引言一、 Nginx的路由匹配规则概述二、 Nginx的路由匹配规则类型2.1 精确匹配(=)2

Python+wxPython构建图像编辑器

《Python+wxPython构建图像编辑器》图像编辑应用是学习GUI编程和图像处理的绝佳项目,本教程中,我们将使用wxPython,一个跨平台的PythonGUI工具包,构建一个简单的... 目录引言环境设置创建主窗口加载和显示图像实现绘制工具矩形绘制箭头绘制文字绘制临时绘制处理缩放和旋转缩放旋转保存编

python+OpenCV反投影图像的实现示例详解

《python+OpenCV反投影图像的实现示例详解》:本文主要介绍python+OpenCV反投影图像的实现示例详解,本文通过实例代码图文并茂的形式给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一、前言二、什么是反投影图像三、反投影图像的概念四、反向投影的工作原理一、利用反向投影backproj

使用Python实现IP地址和端口状态检测与监控

《使用Python实现IP地址和端口状态检测与监控》在网络运维和服务器管理中,IP地址和端口的可用性监控是保障业务连续性的基础需求,本文将带你用Python从零打造一个高可用IP监控系统,感兴趣的小伙... 目录概述:为什么需要IP监控系统使用步骤说明1. 环境准备2. 系统部署3. 核心功能配置系统效果展

Nginx location匹配模式与规则详解

《Nginxlocation匹配模式与规则详解》:本文主要介绍Nginxlocation匹配模式与规则,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、环境二、匹配模式1. 精准模式2. 前缀模式(不继续匹配正则)3. 前缀模式(继续匹配正则)4. 正则模式(大

使用Python实现图像LBP特征提取的操作方法

《使用Python实现图像LBP特征提取的操作方法》LBP特征叫做局部二值模式,常用于纹理特征提取,并在纹理分类中具有较强的区分能力,本文给大家介绍了如何使用Python实现图像LBP特征提取的操作方... 目录一、LBP特征介绍二、LBP特征描述三、一些改进版本的LBP1.圆形LBP算子2.旋转不变的LB

Java 正则表达式URL 匹配与源码全解析

《Java正则表达式URL匹配与源码全解析》在Web应用开发中,我们经常需要对URL进行格式验证,今天我们结合Java的Pattern和Matcher类,深入理解正则表达式在实际应用中... 目录1.正则表达式分解:2. 添加域名匹配 (2)3. 添加路径和查询参数匹配 (3) 4. 最终优化版本5.设计思

在PyCharm中安装PyTorch、torchvision和OpenCV详解

《在PyCharm中安装PyTorch、torchvision和OpenCV详解》:本文主要介绍在PyCharm中安装PyTorch、torchvision和OpenCV方式,具有很好的参考价值,... 目录PyCharm安装PyTorch、torchvision和OpenCV安装python安装PyTor

openCV中KNN算法的实现

《openCV中KNN算法的实现》KNN算法是一种简单且常用的分类算法,本文主要介绍了openCV中KNN算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录KNN算法流程使用OpenCV实现KNNOpenCV 是一个开源的跨平台计算机视觉库,它提供了各

Python中使用正则表达式精准匹配IP地址的案例

《Python中使用正则表达式精准匹配IP地址的案例》Python的正则表达式(re模块)是完成这个任务的利器,但你知道怎么写才能准确匹配各种合法的IP地址吗,今天我们就来详细探讨这个问题,感兴趣的朋... 目录为什么需要IP正则表达式?IP地址的基本结构基础正则表达式写法精确匹配0-255的数字验证IP地