基于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.rhkb.cn/news/319450.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言/数据结构——(用双链表实现数据的增删查改)

一.前言 嗨嗨嗨,大家好久不见!前面我们已经通过数组实现数据的增删查改、单链表实现数据的增删查改,现在让我们尝试一下使用双链表实现数据的增删查改吧! 二.正文 如同往常一样,对于稍微大点的项目来说,…

【工程记录】Python爬虫入门记录(Requests BeautifulSoup)

目录 写在前面1. 环境配置2. 获取网页数据3. 解析网页数据4. 提取所需数据4.1 简单提取4.2 多级索引提取 5. 常见问题 写在前面 仅作个人学习与记录用。主要整理使用Requests和BeautifulSoup库的简单爬虫方法。在进行数据爬取时,请确保遵守相关法律法规和网站的服务…

FLIR LEPTON3.5 热像仪wifi 科研实验测温采集仪

点击查看详情!点击查看详情点击查看详情点击查看详情点击查看详情点击查看详情点击查看详情点击查看详情点击查看详情点击查看详情点击查看详情点击查看详情点击查看详情点击查看详情点击查看详情 1、描述 这是一款桌面科研实验测温热成像多功能热像记录仪,小巧轻便…

SFOS1:开发环境搭建

一、简介 最近在学习sailfish os的应用开发,主要内容是QmlPython。所以,在开发之前需要对开发环境(virtualBox官方SDKcmake编译器python)进行搭建。值得注意的是,我的开发环境是ubuntu22.04。如果是windows可能大同小异…

带文字海报流程自动化

上一篇文章: 带文字海报流程自动化 - 知乎 项目代码整理在: https://github.com/liangwq/Chatglm_lora_multi-gpu​github.com/liangwq/Chatglm_lora_multi-gpu 根据用户的输入生成图片prompt模块代码封装: from openai import OpenAI im…

获取淘宝商品销量数据接口

淘宝爬虫商品销量数据采集通常涉及以下几个步骤: 1、确定采集目标:需要明确要采集的商品类别、筛选条件(如天猫、价格区间)、销量和金额等数据。例如,如果您想了解“小鱼零食”的销量和金额,您需要设定好价…

【云原生系列】云计算概念与架构设计介绍

1 什么是云计算 云计算是一种基于互联网的计算模式,在这个模式下,各种计算资源(例如计算机、存储设备、网络设备、应用程序等)可以通过互联网实现共享和交付。云计算架构设计的主要目标是实现高效、可扩展、可靠、安全和经济的计算…

C++多态特性详解

目录 概念: 定义及实现: 虚函数重写的两个例外: 1.协变: 2.析构函数的重写: final关键字: override关键字: 多态是如何实现的(底层): 面试题&#xff1…

idea No versioned directories to update were found

idea如何配置svn以及svn安装时需要注意什么 下载地址:https://112-28-188-82.pd1.123pan.cn:30443/download-cdn.123pan.cn/batch-download/123-820/3ec9445a/1626635-0/3ec9445a25ba365a23fc433ce0c16f34?v5&t1714358478&s171435847804276f7d9249382ba512…

代码随想录算法训练营DAY40\DAY41|C++动态规划Part.3|343.整数拆分、96.不同的二叉搜索树

DAY40休息日,本篇为DAY41的内容 文章目录 343.整数拆分思路dp含义递推公式(难点)初始化遍历顺序打印 CPP代码数学方法归纳证明法 96.不同的二叉搜索树思路dp含义递推公式初始化遍历顺序打印 CPP代码题目总结 343.整数拆分 力扣题目链接 文章…

小蓝本--因式分解(习题1)讲解

这几天要备战期中,下一期可能要等暑假了...... 小升初的压力真是紧扣于头啊,为了分到一个好班,拼了! 对了,下一期可能在寒假更,见谅! 1分解因式: 公因式: 答案&#xff…

vue3--element-plus-抽屉文件上传和富文本编辑器

一、封装组件 article/components/ArticleEdit.vue <script setup> import { ref } from vue const visibleDrawer ref(false)const open (row) > {visibleDrawer.value trueconsole.log(row) }defineExpose({open }) </script><template><!-- 抽…

iptables---防火墙

防火墙介绍 防火墙的作用可以理解为是一堵墙&#xff0c;是一个门&#xff0c;用于保护服务器安全的。 防火墙可以保护服务器的安全&#xff0c;还可以定义各种流量匹配的规则。 防火墙的作用 防火墙具有对服务器很好的保护作用&#xff0c;入侵者必须穿透防火墙的安全防护…

排序算法--快速排序

前提&#xff1a; 快速排序(Quicksort)是对冒泡排序的一种改进。 快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分&#xff0c;其中一部分的所有数据都比另外一部分的所有数据都要小&#xff0c;然后再按此方法对这两部分…

【Leetcode每日一题】 综合练习 - 全排列 II(难度⭐⭐)(71)

1. 题目解析 题目链接&#xff1a;47. 全排列 II 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了。 2.算法原理 算法思路梳理 为了生成给定数组nums的全排列&#xff0c;同时避免由于重复元素导致的重复排列&#xff0c;我们可以遵…

快速上手RabbitMQ

安装RabbitMQ 首先将镜像包上传到虚拟机&#xff0c;使用命令加载镜像 docker load -i mq.tar 运行MQ容器 docker run \-e RABBITMQ_DEFAULT_USERitcast \-e RABBITMQ_DEFAULT_PASS123321 \-v mq-plugins:/plugins \--name mq \--hostname mq \-p 15672:15672 \-p 5672:5672 …

如何使用 GPT API 从 PDF 出版物导出研究图表?

原文地址&#xff1a;how-to-use-gpt-api-to-export-a-research-graph-from-pdf-publications 揭示内部结构——提取研究实体和关系 2024 年 2 月 6 日 介绍 研究图是研究对象的结构化表示&#xff0c;它捕获有关实体的信息以及研究人员、组织、出版物、资助和研究数据之间的关…

brpc profiler

cpu profiler cpu profiler | bRPC MacOS的额外配置 在MacOS下&#xff0c;gperftools中的perl pprof脚本无法将函数地址转变成函数名&#xff0c;解决办法是&#xff1a; 安装standalone pprof&#xff0c;并把下载的pprof二进制文件路径写入环境变量GOOGLE_PPROF_BINARY_PA…

Microsoft 365 for Mac(Office 365)v16.84正式激活版

office 365 for mac包括Word、Excel、PowerPoint、Outlook、OneNote、OneDrive和Teams的更新。Office提供了跨应用程序的功能&#xff0c;帮助用户在更短的时间内创建令人惊叹的内容&#xff0c;您可以在这里创作、沟通、协作并完成重要工作。 Microsoft 365 for Mac(Office 36…

1. 深度学习笔记--神经网络中常见的激活函数

1. 介绍 每个激活函数的输入都是一个数字&#xff0c;然后对其进行某种固定的数学操作。激活函数给神经元引入了非线性因素&#xff0c;如果不用激活函数的话&#xff0c;无论神经网络有多少层&#xff0c;输出都是输入的线性组合。激活函数的意义在于它能够引入非线性特性&am…