基于OpenCv的图像特征点检测

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

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

基于OpenCv的图像特征点检测

  • 基于OpenCv的图像特征点检测
    • 任务需求
    • 任务目标
      • 1、掌握基于OpenCv进行SURF特征点检测
      • 2、掌握基于OpenCv进行FAST角点检测
      • 3、掌握基于OpenCv进行ORB特征点检测
    • 任务环境
      • 1、jupyter开发环境
      • 2、OpenCv
      • 3、python3.6
    • 任务实施过程
      • 一、SURF特征点检测
        • 1.导入所需要的工具包和图像
        • 2.SURF特征点检测
      • 二、FAST角点检测
      • 三、ORB特征点检测
        • (1)BRIEF特征点描述算法
        • (2)ORB特征点检测
      • 四、任务小结
  • 说明

基于OpenCv的图像特征点检测

任务需求

特征点检测结合了边缘检测与角点检测从而识别出图形的特征点。特征点在保留图像图形重要特征的同时,可以代替整幅图像的处理,有效地减少信息的数据量,有效地提高了计算的速度,有利于图像的可靠匹配,使得实时处理成为可能。
例如下图为两张图像的特征点匹配。

在这里插入图片描述

任务目标

1、掌握基于OpenCv进行SURF特征点检测

2、掌握基于OpenCv进行FAST角点检测

3、掌握基于OpenCv进行ORB特征点检测

任务环境

1、jupyter开发环境

2、OpenCv

3、python3.6

任务实施过程

一、SURF特征点检测

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/butterfly.jpg')
# 设置画布大小
plt.figure(figsize=(12,12))
# 显示图像
im_show('原图像',img)

在这里插入图片描述

2.SURF特征点检测

SURF算法在SIFT算法基础上改进了特征的提取和描述方式,用一种更为高效的方式完成特征点的提取和描述。SURF算法的速度是SIFT速度的3倍,善于处理模糊和旋转的图像,但是不善于处理视角变化和光照变化。

OpenCV获取surf特征点
surf = cv2.xfeatures2d.SURF_create() 实例化

  • surf:实例化的surf函数,可以在初始化的时候直接给设置Hessian矩阵的阈值

kp, dst = sift.detectAndCompute(gray, None) 找出图像中的关键点和对应的描述子

  • gray:输入的灰度图
  • kp:生成的关键点
  • dst:输出的特征向量,默认是64维的

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

  • gray:输入图片
  • kp:SIFT关键点
  • img:返回的图像
  • color:绘制的特征点的颜色信息
  • flags:特征点的绘制模式,DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS表示绘制特征点的时候绘制的是一个个带有方向的圆,这种方法同时显示图像的坐标,size和方向,是最能显示特征的一种绘制方式。
# 将图像转换成灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 创建一个SURF对象,实例化
# 这里设置Hessian矩阵的阈值为40000
surf = cv2.xfeatures2d.SURF_create(40000)
# 寻找关键点和描述子
kp, des = surf.detectAndCompute(gray,None)
# 打印SURF检测到的关键点数和此时的Hessian阈值
print('关键点数',len(kp))
# 检测现在的Hessian阈值
print( 'SURF对象Hessian阈值',surf.getHessianThreshold() )
# 绘制关键点,放入图像,关键点,绘制颜色,cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS表示它将绘制一个具有关键点大小的圆,并显示其方向。
img1 = cv2.drawKeypoints(gray,kp,None,(255,0,0),cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
plt.figure(figsize=(12,12))
im_show('SURF特征点检测',img1)

在这里插入图片描述

SURF更像是斑点检测器。它检测到蝴蝶翅膀上的白色斑点。

# U-SURF:不会检测关键点的方向,运算速度会快很多
# 检查upright标志
print('upright标志:',surf.getUpright())
# 设置upright标志为True
surf.setUpright(True)
# 重新计算特征点并绘制
kp, des = surf.detectAndCompute(gray,None)
# 绘制关键点,放入图像,关键点,绘制颜色,cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS表示它将绘制一个具有关键点大小的圆,并显示其方向。
img2 = cv2.drawKeypoints(gray,kp,None,(255,0,0),cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
plt.figure(figsize=(12,12))
im_show('U-SURF特征点检测',img2)

在这里插入图片描述

上图可以看到每一个关键点的方向都是一样的,U-SURF:不会检测关键点的方向,运算速度会快很多。如果想要应用的场景,关键点方向不是一个问题(如全景拼接)等,运用U-SURF更好。

# 查看SURF描述子的大小
print('SURF描述子维数',surf.descriptorSize())
# SURF描述子默认是64维向量
# 将其设为True即可获取128维的描述符
surf.setExtended(True)
# 重新计算特征点和描述子
kp, des = surf.detectAndCompute(gray,None)
print('SURF描述子维数',des.shape[1])

在这里插入图片描述

二、FAST角点检测

FAST特征检测的特点是简单、快速、有效。相比SIFT、DoG、Harris等比较耗时的特征检测方法,FAST只利用周围的像素进行比较,速度大大加快。

OpenCV进行FAST角点检测

fast = cv2.FastFeatureDetector_create(threshold, nonmaxSuppression, type) FAST特征检测器

  • threshold:阈值,默认10
  • nonmaxSuppression:非极大值抑制,默认True
  • type:检测器类型:cv2.FAST_FEATURE_DETECTOR_TYPE_5_8,cv2.FAST_FEATURE_DETECTOR_TYPE_7_12,cv2.FAST_FEATURE_DETECTOR_TYPE_9_16(默认)

kp = fast.detect(gray, None) 找出图像中的关键点,FAST只是一种特征点检测算法,并不涉及特征点的特征描述。

  • gray:输入的灰度图
  • kp:生成的关键点
# 创建一个FAST对象,实例化
# 设置阈值为50
fast = cv2.FastFeatureDetector_create(50)
# 寻找关键点
kp = fast.detect(gray,None)
# 绘制关键点,放入图像,关键点,绘制颜色
img3 = cv2.drawKeypoints(gray,kp,None,(255,0,0))
plt.figure(figsize=(12,12))
im_show('FAST角点检测',img3)

在这里插入图片描述

# 关闭非极大值抑制
fast.setNonmaxSuppression(False)
# 寻找关键点
kp = fast.detect(gray,None)
# 绘制关键点,放入图像,关键点,绘制颜色
img4 = cv2.drawKeypoints(gray,kp,None,(255,0,0))
plt.figure(figsize=(15,12))
im_show('FAST角点检测(关闭非极大值抑制前后)',np.hstack((img3,img4)))

在这里插入图片描述

FAST检测算法没有多尺度的问题,所以计算速度相对较快,但是当图片中的噪点较多的时候,会产生较多的错误特征点。并且, FAST算法的效果还依赖于一个阈值t。而且FAST特征点没有方向信息,这样就会失去旋转不变性.但是在要求实时性的场合,比如视频监控的物体识别,是可以使用的。

三、ORB特征点检测

(1)BRIEF特征点描述算法

BRIEF特征点描述子一种可以快速计算且表达方式为二进制编码的描述子。
BRIEF是特征描述符,它不提供任何查找特征的方法。因此,可以利用FAST特征点检测算法或Harris角点检测算法或SIFT、SURF等算法检测特征点的位置,接下来在特征点邻域利用BRIEF算法建立特征描述符。

# 初始化Fast检测器
fast1 = cv2.FastFeatureDetector_create(50)
# 初始化BRIEF提取器
brief = cv2.xfeatures2d.BriefDescriptorExtractor_create()
# 使用Fast寻找关键点
kp = fast1.detect(gray,None)
# 使用BRIEF计算描述子
kp, des = brief.compute(gray, kp)
print('BRIEF描述子维数',brief.descriptorSize() )
# 绘制关键点,放入图像,关键点,绘制颜色
img5 = cv2.drawKeypoints(gray, kp, None, color=(0,0,255))
plt.figure(figsize=(12,12))
im_show('BRIEF特征点描述',img5)

在这里插入图片描述

(2)ORB特征点检测

OpenCV进行ORB特征点检测

cv2.ORB_create(int nfeatures=500, …)

  • nfeatures: 最多提取的特征点的数量
# 初始化ORB检测器
orb = cv2.ORB_create()
# 使用ORB寻找关键点
kp = orb.detect(gray,None)
# 使用ORB计算描述子
kp, des = orb.compute(gray, kp)
# 仅绘制关键点位置,不绘制尺寸和方向
img6 = cv2.drawKeypoints(gray, kp, None, color=(0,255,0), flags=0)
plt.figure(figsize=(12,12))
im_show('ORB特征点检测',img6)

在这里插入图片描述

ORB算法有尺度和旋转不变性,并且运算速度是远高于sift和surf算法,ORB算子在SLAM及无人机视觉等领域得到广泛应用。

四、任务小结

本次实验主要完成基于OpenCv的SURF特征点检测、FAST角点检测、ORB特征点检测。

  • SURF特征提取:SIFT算法的增强版,有计算量小、运算速度快的优点
  • FAST特征提取:其计算速度比SIFT 和SURF快,但是精度有限,并且没有尺度和旋转不变性。
  • BRIEF特征点描述:特征描述子计算的简化与提速
  • ORB特征提取:结合了FAST算法与BRIEF算法优点,是目前最快的目标检测算法。

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

  • 1.掌握基于OpenCv进行SURF特征点检测
  • 2.掌握基于OpenCv进行FAST角点检测
  • 3.掌握基于OpenCv进行ORB特征点检测
  • 4.掌握几种特征检测算法的特点

–end–

说明

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/592876.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

从0开始linux(1)——文件操作

欢迎来到博主的专栏——从0开始linux 博主ID:代码小豪 博主使用的linux发行版是:CentOS 7.6 不同版本下的操作可能存在差异 文章目录 命令文件操作命令文件树和文件路径文件树绝对路径相对路径 文件属性tree指令删除文件复制文件 大家还记得在小学第一次…

C语言-链表实现贪吃蛇控制台游戏

使用C语言和链表实现贪吃蛇游戏 一、引言 贪吃蛇游戏是一个经典的游戏,它的玩法简单而富有挑战性。在这个博客中,我将分享如何使用C语言和链表数据结构来自主实现贪吃蛇游戏。我会详细介绍游戏的设计思路、编码过程、遇到的问题及解决方案,…

将要上市的自动驾驶新书《自动驾驶系统开发》中摘录各章片段 1

以下摘录一些章节片段: 1. 概论 自动驾驶系统的认知中有一些模糊的地方,比如自动驾驶系统如何定义的问题,自动驾驶的研发为什么会有那么多的子模块,怎么才算自动驾驶落地等等。本章想先给读者一个概括介绍,了解自动驾…

Rust 生命周期浅谈

1. 简述 Rust 中的每一个引用都有其 生命周期(lifetime),也就是引用保持有效的作用域。大部分时候生命周期是隐含并可以推断的,正如大部分时候类型也是可以推断的一样。类似于当因为有多种可能类型的时候必须注明类型,…

JAVA语言开发的智慧城管系统源码:技术架构Vue+后端框架Spring boot+数据库MySQL

通过综合应用计算机技术、网络技术、现代通信技术等多种信息技术,充分融合RS遥感技术、GPS全球定位技术、GIS地理信息系统,开始建设一个动态可视的、实时更新的、精细量化的城市管理系统。智慧城管将采用云平台架构方式进行建设,基于现有数字…

【idea-sprongboot项目】SSH连接云服务器进行远程开发

继上一篇博客【阿里云服务器】ubuntu 22.04.1安装docker以及部署java环境-CSDN博客 目录 五、远程开发方式 1)SSH进行远程开发 步骤 配置文件同步 window电脑远程操控 正式通过window电脑远程操控 运行在linux服务器上的远程程序 调试在linux服务器上的远程程…

恶补《操作系统》5_2——王道学习笔记

5.2_1 I-O核心子系统 1、用户层软件 假脱机系统 2、设备独立性软件(设备无关性软件) IO调度、设备保护、设备分配与回收、缓冲区管理 3、设备驱动程序(比如打印机驱动) 4、中断处理程序 5、硬件 5.2_2 假脱机技术&#xff…

PHP医疗不良事件上报系统源码 AEMS开发工具vscode+ laravel8 医院安全(不良)事件报告系统源码 可提供演示

PHP医疗不良事件上报系统源码 AEMS开发工具vscode laravel8 医院安全(不良)事件报告系统源码 可提供演示 医院安全不良事件报告系统(AEMS);分为外部报告系统和内部报告系统两类。内部报告系统主要以个人为报告单位&…

智慧文旅开启沉浸式文化体验,科技让旅行更生动:借助智慧技术,打造沉浸式文化体验场景,让旅行者在旅行中深度感受文化的魅力

一、引言 随着科技的飞速发展,传统旅游行业正经历着前所未有的变革。智慧文旅,作为一种新兴的旅游模式,正以其独特的魅力,吸引着越来越多的旅行者。智慧文旅不仅改变了人们的旅行方式,更在深度上丰富了人们的文化体验…

linux上如何排查JVM内存过高?

怎么排查JVM内存过高? 前言: 想必工作一两年以后的同学都会逐渐面临到,jvm等问题,但是可能苦于无法熟练的使用一些工具;本文将介绍几个比较常用分析工具的使用方法,带着大家一步步定位分析问题。 1、top 查…

代码随想录算法训练营DAY54|C++动态规划Part15|647.回文子串、516最长回文子序列、

文章目录 647.回文子串思路CPP代码双指针 516最长回文子序列思路CPP代码 动态规划总结篇 647.回文子串 力扣题目链接 文章链接:647.回文子串 视频链接:动态规划,字符串性质决定了DP数组的定义 | LeetCode:647.回文子串 其实子串问…

【C++第八课 - string的底层实现】

目录 基础知识string构造函数和析构函数的坑构造函数析构函数 迭代器、范围for运算符重载operator [] const增删查改push_backreserveappendinserteraseswapfindsubstr拷贝构造 流插入和流提取<<流插入>>流提取clear 深浅拷贝传统写法现代写法 赋值传统写法现代写法…

## 01深度学习介绍与安装PyTorch

文章目录 深度学习的发展历史和基本概念早期历史兴起与发展基本概念 如何安装和设置PyTorch环境系统要求安装步骤验证安装 结语 深度学习的发展历史和基本概念 深度学习&#xff0c;一种通过使用具有多层结构的神经网络来学习数据的复杂模型的机器学习技术&#xff0c;近年来已…

[Java EE] 多线程(七): 锁策略

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏:&#x1f355; Collection与数据结构 (90平均质量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm1001.2014.3001.5482 &#x1f9c0;Java …

奇偶校验码

目录 前言 校验原理简介 奇偶校验码 前言 在前两个文章的学习中,我们已经知道了数字字符这些简单的数据应该怎么在计算机内部进行表示,其实本质上是0101的二进制代码,但是这些数据在计算机内部进行计算存取和传送的过程中,由于计算机原器件可能会发生故障,也有可能因为某些…

python:set(集合)

set(集合) 去重处理&#xff0c;内容无序 列表使用&#xff1a;[] 元组使用&#xff1a;() 字符串使用&#xff1a;"" 集合使用&#xff1a;{} 基本语法; # 定义字面量集合&#xff1a;{元素&#xff0c;元素&#xff0c;元素&#xff0c;.......} 定义集合变…

【C语言】项目实践-贪吃蛇小游戏(Windows环境的控制台下)

一.游戏要实现基本的功能&#xff1a; • 贪吃蛇地图绘制 • 蛇吃食物的功能 &#xff08;上、下、左、右方向键控制蛇的动作&#xff09; • 蛇撞墙死亡 • 蛇撞自身死亡 • 计算得分 • 蛇身加速、减速 • 暂停游戏 二.技术要点 C语言函数、枚举、结构体、动态内存管…

用队列实现栈——leetcode刷题

题目的要求是用两个队列实现栈&#xff0c;首先我们要考虑队列的特点&#xff1a;先入先出&#xff0c;栈的特点&#xff1a;后入先出&#xff0c;所以我们的目标就是如何让先入栈的成员后出栈&#xff0c;后入栈的成员先出栈。 因为有两个队列&#xff0c;于是我们可以这样想&…

支付宝支付流程

第一步前端&#xff1a;点击去结算&#xff0c;前端将商品的信息传递给后端&#xff0c;后端返回一个商品的订单号给到前端&#xff0c;前端将商品的订单号进行存储。 对应的前端代码&#xff1a;然后再跳转到支付页面 // 第一步 点击去结算 然后生成一个订单号 // 将选中的商…

SQL 基础 | AVG 函数的用法

在SQL中&#xff0c;AVG()是一个聚合函数&#xff0c;用来计算某个列中所有值的平均值。 它通常与GROUP BY子句一起使用&#xff0c;以便对分组后的数据进行平均值计算。 AVG()函数在需要了解数据集中某个数值列的中心趋势时非常有用。 以下是AVG()函数的一些常见用法&#xff…