当前位置: 首页 > news >正文

【CV】ORB算法

1. ORB算法:

  • 特点

    • 实现了旋转不变性、尺度不变性和计算效率高等特性。
  • 旋转不变性

    • 通过计算关键点周围的梯度信息,确定关键点的主方向。
    • 将图像旋转到关键点的主方向,然后再提取BRIEF描述符,增强了旋转不变性。
      ORB(Oriented FAST and Rotated BRIEF)是一种结合了FAST关键点检测器和BRIEF描述符的特征提取算法,它在计算效率和检测性能之间取得了很好的平衡。

在FAST检测到关键点之后,ORB算法会根据关键点周围的局部图像区域计算BRIEF描述符。
为了增强ORB算法的旋转不变性,它还引入了一种旋转校正的机制。会根据关键点周围的梯度信息计算出关键点的主方向,并将图像旋转到关键点的主方向,然后再提取BRIEF描述符。

优点

ORB算法具有较高的计算效率,适用于实时应用和资源受限的环境。
ORB算法在一定程度上具备旋转不变性和尺度不变性,对图像的光照变化也具有一定的鲁棒性。
ORB算法是一种开源算法,易于实现和使用,广泛应用于计算机视觉领域的特征提取和匹配任务中。

1.1. FAST关键点检测器:

FAST算法通过比较像素周围邻域的强度值来判断当前像素是否为角点。如果一个像素周围存在连续的像素强度值超过或低于该像素强度值的阈值,那么该像素就被认为是一个角点。
FAST算法对图像的亮度变化和旋转变化具有一定的不变性,但对于尺度变化不具备不变性。

  • 原理

    • FAST算法通过比较像素周围邻域的强度值来判断当前像素是否为角点。
    • 选择一个像素 p p p,将其亮度值与周围的16个像素点进行比较。
    • 如果存在连续的 n n n个像素点,其亮度值均大于或小于阈值 T T T,则像素 p p p被认为是一个角点。

    设像素 p p p的亮度值为 I p I_p Ip,周围16个像素点的亮度值为 I p 1 , I p 2 , . . . , I p 16 I_{p1}, I_{p2}, ..., I_{p16} Ip1,Ip2,...,Ip16,阈值为 T T T
    定义像素 p p p的强度变化函数 f f f

    f(d) = |I_p - I_{p+d}|
    

    如果存在一组连续的像素点 d 1 , d 2 , . . . , d n d_1, d_2, ..., d_n d1,d2,...,dn,使得 f ( d i ) > T f(d_i) > T f(di)>T,则像素 p p p为角点。

1.2. BRIEF描述符:

BRIEF(Binary Robust Independent Elementary Features)是一种二进制描述符,用于描述关键点周围的局部特征。
BRIEF算法通过比较关键点周围的像素对来生成一个二进制字符串作为描述符。这些像素对的比较结果被编码成二进制形式,生成一个固定长度的二进制向量作为特征描述符。
BRIEF描述符具有较好的计算效率和匹配鲁棒性,但对图像的旋转、尺度和光照变化不具备不变性。

  • 原理

    • 对于给定的关键点,选择一个固定大小的窗口,并选取窗口内的一组像素对。
    • 对每对像素进行比较,并将比较结果编码为二进制串。
    • 最终得到一个固定长度的二进制向量作为特征描述符。

    P i P_i Pi P j P_j Pj为一对像素,其亮度值分别为 I ( P i ) I(P_i) I(Pi) I ( P j ) I(P_j) I(Pj)
    对比两个像素的亮度值,并根据比较结果编码为二进制形式:

    BRIEF(P_i, P_j) = { 1, if I(P_i) < I(P_j)0, otherwise }
    

示例:

import cv2
import numpy as np# 读取图像
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)# 创建ORB对象
orb = cv2.ORB_create()# 检测关键点并计算描述符
keypoints, descriptors = orb.detectAndCompute(image, None)# 绘制关键点
image_with_keypoints = cv2.drawKeypoints(image, keypoints, None)# 显示结果
cv2.imshow('Image with Keypoints', image_with_keypoints)
cv2.waitKey(0)
cv2.destroyAllWindows()

示例代码使用OpenCV库实现了ORB算法的关键点检测和描述符计算。首先,通过cv2.ORB_create()创建了一个ORB对象,然后使用detectAndCompute()方法检测图像中的关键点并计算描述符。最后,使用drawKeypoints()方法将关键点绘制在图像上,并显示结果。

相关文章:

【CV】ORB算法

1. ORB算法&#xff1a; 特点&#xff1a; 实现了旋转不变性、尺度不变性和计算效率高等特性。 旋转不变性&#xff1a; 通过计算关键点周围的梯度信息&#xff0c;确定关键点的主方向。将图像旋转到关键点的主方向&#xff0c;然后再提取BRIEF描述符&#xff0c;增强了旋转不…...

【算法】Cordic算法的原理及matlab/verilog应用

一、前言 单片机或者FPGA等计算能力弱的嵌入式设备进行加减运算还是容易实现&#xff0c;但是想要计算三角函数&#xff08;sin、cos、tan&#xff09;&#xff0c;甚至双曲线、指数、对数这样复杂的函数&#xff0c;那就需要费些力了。通常这些函数的计算需要通者查找表或近似…...

QT:信号与槽

作业&#xff1a; 完善对话框&#xff0c;点击登录对话框&#xff0c;如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示”登录成功“&#xff0c;提供一个Ok按钮&#xff0c;用户点击Ok后&#xff0c;关闭登录界面&#xff0c;跳转到其他界面 如果账号和…...

以动态库链接库 .dll 探索结构体参数

Dev c C语言实现第一个 dll 动态链接库 创建与调用-CSDN博客 在写dll 插件中发现的函数指针用途和 typedef 的定义指针的用法-CSDN博客 两步之后&#xff0c;尝试加入结构体实现整体数据使用。 注意结构体 Ak 是相同的 代码如下 DLL文件有两个&#xff0c;dll.dll是上面提到…...

vue快速入门(三)差值表达式

注释很详细&#xff0c;直接上代码 上一篇 新增内容 插值表达式基本用法插值表达式常用公式 源码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-wid…...

RabbitMQ的交换机与队列

一、流程 首先先介绍一个简单的一个消息推送到接收的流程&#xff0c;提供一个简单的图 黄色的圈圈就是我们的消息推送服务&#xff0c;将消息推送到 中间方框里面也就是 rabbitMq的服务器&#xff0c;然后经过服务器里面的交换机、队列等各种关系&#xff08;后面会详细讲&am…...

Spring的 IOC和AOP编程思想

Spring的IOC&#xff08;控制反转&#xff09;编程思想 IOC&#xff08;Inversion of Control&#xff0c;控制反转&#xff09;是Spring框架的核心思想之一。在传统的编程方式中&#xff0c;我们直接通过new关键字来创建对象&#xff0c;并直接调用对象的方法。这种方式下&am…...

Qt中显示hex数据的控件

效果类似QTextEdit&#xff0c;但是显示十六进制的数据&#xff0c;比如用于显示抓取串口或者bin文件的数据等等 chunks.h #ifndef CHUNKS_H #define CHUNKS_H/** \cond docNever *//*! The Chunks class is the storage backend for QHexEdit.** When QHexEdit loads data, C…...

python web 开发 - 常用Web框架

python web 开发 - 文章目录 python web 开发 -1、关于Web开发2、常用Web框架3、开发案例3.1. 使用Flask框架创建一个简单的Web应用程序3.2. 使用tornado框架创建一个简单的Web应用程序3.3. 使用Django框架创建一个简单的待办事项应用程序 4、总结 1、关于Web开发 Web当然是网…...

设计模式——适配器模式06

适配器模式 通常在已有程序中使用&#xff0c;至少有两个类的接口不兼容时&#xff0c;让相互不兼容的类能很好地合作。例如之前系统 用的Target 接口调用&#xff0c;现在要新增第三方接口Adaptee。如何进行适配&#xff0c;面向客户端提供 调用Target接口方式达到使用Adaptee…...

【鸿蒙开发】组件状态管理@Prop,@Link,@Provide,@Consume,@Observed,@ObjectLink

1. Prop 父子单向同步 概述 Prop装饰的变量和父组件建立单向的同步关系&#xff1a; Prop变量允许在本地修改&#xff0c;但修改后的变化不会同步回父组件。当父组件中的数据源更改时&#xff0c;与之相关的Prop装饰的变量都会自动更新。如果子组件已经在本地修改了Prop装饰…...

Web 前端性能优化之八:前端性能检测实践

五、前端性能检测实践 1、常用的检测工具 Lighthouse、Chrome开发者工具中与性能检测相关的一些工具面板、页面加载性能分析工具PageSpeed Insights、专业的性能检测工具WEBPAGETEST等 1、Chrome 任务管理器 通过Chrome任务管理器我们可以查看当前Chrome浏览器中&#xff0…...

安装VMware ESXi虚拟机系统

简介&#xff1a;ESXi是VMware公司开发的一款服务器虚拟化操作系统。它能够在一台物理服务器上运行多个虚拟机&#xff0c;每个虚拟机都可以独立运行操作系统和应用程序&#xff0c;而且对硬件配置要求低&#xff0c;系统运行稳定。 准备工具&#xff1a; 1.8G或者8G以上容…...

Vue3实践之全局请求URL配置和请求参数说明

Vue3实践之全局请求URL配置和请求参数说明 全局请求URL配置 1、首先需要导入router和axios import router from "/router";2、创建app&#xff0c;将router挂载到app上 const app createApp(App) app.use(router).use(elementIcons).mount(#app)3、设置全局请求…...

类和对象—初阶

目录 1.面向过程和面向对象初步认识 2.类的引入 3.类的定义 4.类的访问限定符及封装 4.1 访问限定符 【面试题】 4.2 封装 【面试题】 5.类的作用域 6.类的实例化 7.类对象模型 7.1 如何计算类对象的大小 7.2 类对象的存储方式 7.3 结构体内存对齐规则 【面试题】…...

【Linux】shell 脚本基础使用

在终端中输入命令可以完成一些常用的操作&#xff0c;但是我们都是一条一条输入命令&#xff0c;比较麻烦&#xff0c;为了解决这个问题&#xff0c;就会涉及到 shell 脚本&#xff0c;它可以将很多条命令放到一个文件里面&#xff0c;然后直接运行这个文件即可。 shell 脚本类…...

nfs部署--相关记录

以下是在 CentOS 8 中将 10.40.111.41 上的 /nfsdata 目录通过 NFS 共享到 10.40.111.43 和 10.40.111.45 的 /nfsdata 目录的详细步骤&#xff1a; 在 10.40.111.41 上操作&#xff1a; 安装并配置 NFS 服务器&#xff1a; a. 安装 NFS 服务器软件包&#xff1a; sudo dnf in…...

java国产化云HIS基层医院系统源码 SaaS模式

目录 ​ 云HIS开发环境 功能模块介绍&#xff1a; 1、门诊模块 2、住院模块 3、药房、药库模块 ​编辑 4、电子病历模块 5、统计报表模块 6、系统管理模块 系统优势 云his之电子病历子系统功能 云 his 系统是运用云计算、大数据、物联网等新兴信息技术&#xff0c;按…...

docker 部署 Epusdt - 独角数卡 dujiaoka 的 usdt 支付插件

部署 部署说明 部署之前必须注意的几点事项,该教程不一定适合所有用户: 本教程主要是使用 docker 部署,宝塔用户或宿主机直接安装的用户请直接参考官网教程.本教程是独立部署 epusdt,使用独立的mysql和redis,与dujiaoka项目分开. 在研究的过程中发现 epusdt 也需要用到 mys…...

数据结构排序之冒泡、快速、插入、选择、堆、归并等排序及时间,空间复杂度等(超详解,绝对能满足你的需求,并能学到很多有用知识)

在本文章开始之前给大家介绍个网站,可以通过下面动画网址来理解 ,(国外的网站帮助学习数据结构很多知识,可以翻译下来,在搜索框搜索相应的排序算法进行动画演示,非常好用。)​​​https://www.cs.usfca.edu/~galles/visualization/https://www.cs.usfca.edu/~galles/vis…...

如何在windows环境和linux环境运行jar包

功能:实现对字符串小写转大写 java代码如下: package a_od_test;import java.util.Locale; /* 实现小写转大写 打jar包 分别在windows环境和liunx环境运行*/ public class Main28_To_Upper {public static void main(String[] args) {if (args.length 1) {System.out.printl…...

2602B吉时利2602B数字源表

181/2461/8938产品概述&#xff1a; 2600B系列系统源表SMU仪器是业界领先的电流/电压源和测量解决方案&#xff0c;采用吉时利第三代SMU技术制造。2600B系列提供单通道和双通道型号&#xff0c;将精密电源、真电流源、6-1/2位数字多用表、任意波形发生器、脉冲发生器和电子负载…...

Linux——fork复制进程

1)shell: 在计算机科学中&#xff0c;Shell俗称壳&#xff08;用来区别于核&#xff09;&#xff0c;是指“为使用者提供操作界面”的软件&#xff08;command interpreter&#xff0c;命令解析器&#xff09;。它类似于DOS下的COMMAND.COM和后来的cmd.exe。它接收用户命令&…...

李廉洋:4.10黄金原油晚间走势最新分析及策略。

鉴于美联储官员对1月和2月通胀数据反应不足&#xff0c;3月通胀数据过热可能导致其反应过度的风险更大。美联储试图避免根据一两个数据点来制定政策&#xff0c;但今年迄今为止经济活动的韧性意味着&#xff0c;在年中降息的理由取决于通胀是否恢复自去年下半年以来的稳步下降趋…...

【头歌-Python】字符串自学引导

禁止转载&#xff0c;原文&#xff1a;https://blog.csdn.net/qq_45801887/article/details/137517279 参考教程&#xff1a;B站视频讲解——https://space.bilibili.com/3546616042621301 如果代码存在问题&#xff0c;麻烦大家指正 ~ ~有帮助麻烦点个赞 ~ ~ 字符串自学引导 …...

44-技术演进(下):软件架构和应用生命周期技术演进之路

应用、系统资源、应用生命周期管理这 3 个维度&#xff0c;构成了我们对云的所有诉求。 我会介绍下应用维度和应用生命周期管理维度的技术演进。 我们就先来看下软件架构的演进之路。 软件架构的演进 软件架构技术演进如下图所示&#xff1a; 单体架构 在单体架构中&#xff…...

【C++】C++中的list

一、介绍 官方给的 list的文档介绍 简单来说就是&#xff1a; list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。list的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0c;在节点中…...

uniapp:Hbuilder没有检测到设备请插入设备或启动模拟器的问题解决

问题 使用模拟器调试运行项目时&#xff0c;出现以下提示&#xff0c;“没有检测到设备&#xff0c;请插入设备或启动模拟器后点击刷新再试”。排查了一天最终找到原因。 解决 已确认模拟器是已经正常启动&#xff0c;并且Hbuilder设置中的adb路径和端口都配置没有问题&#…...

基于RBF的时间序列预测模型matlab代码

整理了基于RBF的时间序列预测模型matlab代码&#xff0c; 包含数据集。采用了四个评价指标R2、MAE、MBE、MAPE对模型的进行评价。RBF模型在数据集上表现非常好。 训练集数据的R2为&#xff1a;0.99463 测试集数据的R2为&#xff1a;0.96973 训练集数据的MAE为&#xff1a;0.…...

vue vue3 手写 动态加载组件

效果展示 一、需求背景&#xff1a; # vue3 项目涉及很多图表加载、表格加载 #考虑手写一个动态加载组件 二、实现思路 通过一个加载状态变量&#xff0c;通过v-if判断&#xff0c;加载状态的变量等于哪一个&#xff0c;动态加载组件内部就显示的哪一块组件。 三、实现效果…...