基于OpenCv的图像特征点检测

news2024/5/18 15:30:44

⚠申明: 未经许可,禁止以任何形式转载,若要引用,请标注链接地址。 全文共计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.coloradmin.cn/o/1641890.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

蓝桥杯练习系统(算法训练)ALGO-947 贫穷的城市

资源限制 内存限制:256.0MB C/C时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s 问题描述 某城市有n个小镇,编号是1~n。由于贫穷和缺乏城市规划的人才,每个小镇有且仅有一段单向的公路通往别…

Activiti7 开发快速入门【2024版】

记录开发最核心的部分,理论结合业务实操减少废话,从未接触工作流快速带入开发。假设你是后端的同学学过JAVA和流程图,则可以继续向后看,否则先把基础课程书准备好先翻翻。 为什么要工作流 比起直接使用状态字段,工作…

上海计算机学会2021年1月月赛C++丙组T2康托表

题目背景 康托是一名数学家,他证明了一个重要的定理,需要使用一张表: 这个表的规律是: 从上到下:每一行的分子依次增大;从左到右:每一列的分母依次增大。 康托以一种不重复、不遗漏的方式&am…

旅游系列之:庐山美景

旅游系列之:庐山美景 一、路线二、住宿二、庐山美景 一、路线 庐山北门乘坐大巴上山,住在上山的酒店东线大巴游览三叠泉,不需要乘坐缆车,步行上下三叠泉即可,线路很短 二、住宿 长江宾馆庐山分部 二、庐山美景

基于ZYNQ7020的ARM+FPGA模块化仪器

模块化仪器平台基于 FPGA控制器, 搭配丰富灵活的仪器模块,如万⽤表、⽰波器、信 号发⽣器、数据记录仪、⾳频分析仪等,涵盖了⾼精度信号、⾼速与射频信号测试测量与处理,提供了从验证到试产到量产的全过程测试测量技术与解决⽅案&…

实景AI自动直播系统引领直播新时代,争做行业销量领跑者。

实景AI自动直播系统引领直播新时代,争做行业销量领跑者! 在当今时代,随着科技的飞速发展,AI技术正逐渐渗透到各个行业中。马云曾明确指出,新兴事物经历着从“看不见”、“看不起”、“看不懂”到“来不及”的四个阶段。…

C语言案例04 -流程控制-逻辑符的正确使用

****一.C语言逻辑运算符详解:逻辑与&&与逻辑或||的运用及其短路特性 你知道吗?逻辑运算符&&和||可是C语言世界的“流量担当”,它们不仅实力强大,还自带神秘光环——短路效应 📝短路法则揭秘&#xf…

短视频矩阵系统ai剪辑 矩阵 文案 无人直播四合一功能核心独家源头saas开发

抖去推矩阵AI小程序是一款针对短视频平台的智能创作和运营工具,它具有以下功能特点: 1.批量视频生成:抖去推可以在短时间内生成大量视频,帮助商家快速制作出适合在短视频平台上推广的内容 2.全行业覆盖:适用于多个行业…

【前端学习——防抖和节流+案例】

定义 【前端八股文】节流和防抖 防抖 连续触发事件但是在设定的一段时间内只执行最后一次 代码实现思路【定时器】 大概意思就是: 每次按起键盘后,都将之前的定时器删除,重新开始计时。 节流 连续触发事件,只执行一次 …

分享一份物联网 SAAS 平台架构设计

一、架构图**** 二、Nginx**** 用于做服务的反向代理。 三、网关**** PaaS平台所有服务统一入口,包含token鉴权功能。 四、开放平台**** 对第三方平台开放的服务入口。 五、MQTT**** MQTT用于设备消息通信、内部服务消息通信。 六、Netty**** Socket通信设…

docker mysql更新升级版本

一、环境说明 操作系统:Centos7 数据库版本:MySql 8.0.22 数据库中数据量不大,处于开发/测试环境,风险较低 二、升级原因 升级是因为测评漏洞,在进行国家三级等级保护测评过程中,漏扫发现多个MySql漏洞…

[论文阅读] 测试时间自适应TTA

最初接触 CVPR2024 TEA: Test-time Energy Adaptation [B站](1:35:00-1:53:00)https://www.bilibili.com/video/BV1wx4y1v7Jb/?spm_id_from333.788&vd_source145b0308ef7fee4449f12e1adb7b9de2 实现: 读取预训练好的模型参数设计需要更…

数字化战略|数字化建设总体规划蓝图PPT(建议收藏)

摘要 这份头部咨询公司关于数字化转型的报告为企业管理者和技术人员提供了一份详尽的数字化转型指南。报告从战略出发,详细阐述了数字生态体系建设、数字化核心方案构建、管理协同能力提升以及数据集中管理和应用能力增强等关键环节。对于从业者而言,报…

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

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

protobuf在配置文件管理上的应用

TextFormat::ParseFromString 是 Google Protocol Buffers(通常简称为 Protobuf)库中的一个函数,用于从文本格式解析消息。Protobuf 是一种用于序列化结构化数据的库,它允许你定义数据的结构,然后自动生成源代码来处理…

neo4j 的插入速度为什么越来越慢,可能是使用了过多图谱查询操作

文章目录 背景描述分析解决代码参考neo4j 工具类Neo4jDriver知识图谱构建效果GuihuaNeo4jClass 背景描述 使用 tqdm 显示,处理的速度; 笔者使用 py2neo库,调用 neo4j 的API 完成节点插入; 有80万条数据需要插入到neo4j图数据中&am…

基于SSM的校园短期闲置资源置换平台(有报告)。Javaee项目。ssm项目。

演示视频: 基于SSM的校园短期闲置资源置换平台(有报告)。Javaee项目。ssm项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构,通过…

c语言从入门到函数速成(2)

温馨提醒:本篇文章适合人群:刚学c又感觉那个地方不怎么懂的同学以及以及学了一些因为自身原因停学一段时间后又继续学​​​c的学 好,正片开始! 数组 概念:数组中存放的是1个或者多个数据,但是数组元素个…

Topaz Video AI 5.0.3激活版 AI视频无损缩放增强

Topaz Video AI专注于很好地完成一些视频增强任务:去隔行,放大和运动插值。我们花了五年时间制作足够强大的人工智能模型,以便在真实世界的镜头上获得自然的结果。 Topaz Video AI 还将充分利用您的现代工作站,因为我们直接与硬件…

Redis核心数据结构——跳表(生成数据到文件和从文件中读取数据、模块合并、)

生成文件和从文件中读取数据。 需求如下: 你的任务是实现 SkipList 类中的数据持久化成员函数和数据加载成员函数。 持久化数据成员函数签名:void dump_file(); 该成员函数负责将存储引擎内的数据持久化到文件中。数据的持久化格式是将每个键值对写入文…