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

相关文章

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

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

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

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

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

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

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

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

烟火目标检测数据集 7800张 烟火检测 带标注 voc yolo

一个包含7800张带标注图像的数据集,专门用于烟火目标检测,是一个非常有价值的资源,尤其对于那些致力于公共安全、事件管理和烟花表演监控等领域的人士而言。下面是对此数据集的一个详细介绍: 数据集名称:烟火目标检测数据集 数据集规模: 图片数量:7800张类别:主要包含烟火类目标,可能还包括其他相关类别,如烟火发射装置、背景等。格式:图像文件通常为JPEG或PNG格式;标注文件可能为X

hdu 3065 AC自动机 匹配串编号以及出现次数

题意: 仍旧是天朝语题。 Input 第一行,一个整数N(1<=N<=1000),表示病毒特征码的个数。 接下来N行,每行表示一个病毒特征码,特征码字符串长度在1—50之间,并且只包含“英文大写字符”。任意两个病毒特征码,不会完全相同。 在这之后一行,表示“万恶之源”网站源码,源码字符串长度在2000000之内。字符串中字符都是ASCII码可见字符(不包括回车)。

二分最大匹配总结

HDU 2444  黑白染色 ,二分图判定 const int maxn = 208 ;vector<int> g[maxn] ;int n ;bool vis[maxn] ;int match[maxn] ;;int color[maxn] ;int setcolor(int u , int c){color[u] = c ;for(vector<int>::iter

基于 YOLOv5 的积水检测系统:打造高效智能的智慧城市应用

在城市发展中,积水问题日益严重,特别是在大雨过后,积水往往会影响交通甚至威胁人们的安全。通过现代计算机视觉技术,我们能够智能化地检测和识别积水区域,减少潜在危险。本文将介绍如何使用 YOLOv5 和 PyQt5 搭建一个积水检测系统,结合深度学习和直观的图形界面,为用户提供高效的解决方案。 源码地址: PyQt5+YoloV5 实现积水检测系统 预览: 项目背景

opencv 滚动条

参数介绍:createTrackbar( trackbarname , "hello" , &alpha_slider ,alpha_max ,  on_trackbar )  ;在标签中显示的文字(提示滑动条的用途) TrackbarName创建的滑动条要放置窗体的名字 “hello”滑动条的取值范围从 0 到 alpha_max (最小值只能为 zero).滑动后的值存放在

android-opencv-jni

//------------------start opencv--------------------@Override public void onResume(){ super.onResume(); //通过OpenCV引擎服务加载并初始化OpenCV类库,所谓OpenCV引擎服务即是 //OpenCV_2.4.3.2_Manager_2.4_*.apk程序包,存