基于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

相关文章

Python如何实现PDF隐私信息检测

《Python如何实现PDF隐私信息检测》随着越来越多的个人信息以电子形式存储和传输,确保这些信息的安全至关重要,本文将介绍如何使用Python检测PDF文件中的隐私信息,需要的可以参考下... 目录项目背景技术栈代码解析功能说明运行结php果在当今,数据隐私保护变得尤为重要。随着越来越多的个人信息以电子形

关于Gateway路由匹配规则解读

《关于Gateway路由匹配规则解读》本文详细介绍了SpringCloudGateway的路由匹配规则,包括基本概念、常用属性、实际应用以及注意事项,路由匹配规则决定了请求如何被转发到目标服务,是Ga... 目录Gateway路由匹配规则一、基本概念二、常用属性三、实际应用四、注意事项总结Gateway路由

SpringBoot使用Apache Tika检测敏感信息

《SpringBoot使用ApacheTika检测敏感信息》ApacheTika是一个功能强大的内容分析工具,它能够从多种文件格式中提取文本、元数据以及其他结构化信息,下面我们来看看如何使用Ap... 目录Tika 主要特性1. 多格式支持2. 自动文件类型检测3. 文本和元数据提取4. 支持 OCR(光学

基于WinForm+Halcon实现图像缩放与交互功能

《基于WinForm+Halcon实现图像缩放与交互功能》本文主要讲述在WinForm中结合Halcon实现图像缩放、平移及实时显示灰度值等交互功能,包括初始化窗口的不同方式,以及通过特定事件添加相应... 目录前言初始化窗口添加图像缩放功能添加图像平移功能添加实时显示灰度值功能示例代码总结最后前言本文将

Java中的Opencv简介与开发环境部署方法

《Java中的Opencv简介与开发环境部署方法》OpenCV是一个开源的计算机视觉和图像处理库,提供了丰富的图像处理算法和工具,它支持多种图像处理和计算机视觉算法,可以用于物体识别与跟踪、图像分割与... 目录1.Opencv简介Opencv的应用2.Java使用OpenCV进行图像操作opencv安装j

opencv实现像素统计的示例代码

《opencv实现像素统计的示例代码》本文介绍了OpenCV中统计图像像素信息的常用方法和函数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 统计像素值的基本信息2. 统计像素值的直方图3. 统计像素值的总和4. 统计非零像素的数量

基于人工智能的图像分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图像分类是计算机视觉中的一个重要任务,目标是自动识别图像中的对象类别。通过卷积神经网络(CNN)等深度学习技术,我们可以构建高效的图像分类系统,广泛应用于自动驾驶、医疗影像诊断、监控分析等领域。本文将介绍如何构建一个基于人工智能的图像分类系统,包括环境

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi