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

落地 ORB角点检测与sift检测

ORB角点检测

可以说ORB是由FAST、灰度质心和BRIEF等技术组合优化形成的,不过更准确地说,ORB是在FAST特征检测算法基础上,结合了灰度质心确定方向以及改进后的BRIEF描述子等技术形成的,以下是具体分析:

• FAST特征检测:ORB算法首先采用FAST算法来检测图像中的特征点。FAST算法通过判断以某个像素点为中心的圆周上的像素点灰度值与该中心像素点灰度值的关系,快速地筛选出可能的特征点,具有速度快的优点。

• 灰度质心确定方向:ORB利用灰度质心法为FAST检测出的特征点计算方向。通过计算特征点邻域内的灰度质心,确定从特征点到质心的向量方向,以此作为特征点的主方向,解决了BRIEF描述子不具有旋转不变性的问题。

• 改进的BRIEF描述子:ORB采用了改进的BRIEF描述子,称为rBRIEF。在确定了特征点的方向后,根据该方向对选取的点对进行旋转,使得描述子具有旋转不变性。同时,还对BRIEF描述子进行了其他一些优化,如对特征点的尺度进行考虑等,提高了描述子的性能。

SIFT角点检测

检测步骤

• 尺度空间极值检测:构建图像的高斯金字塔,通过对原始图像与不同尺度倍率的高斯模糊进行卷积,将相邻的高斯模糊影像两两相减得到高斯差(DoG)影像。在DoG影像中查找极大值和极小值,这些极值点即为可能的关键点。

• 关键点定位:通过关键点附近的像素信息、关键点的尺寸和主曲率来进一步定位各个关键点,计算关键点的主曲率,消除位于边缘或易受噪音干扰、位置不合适的关键点。

• 方向定向:对经过高斯模糊处理后的影像,计算相邻像素的梯度量和方向,为每个关键点建立一个以10度为单位的36条直方图,直方图中最大值的方向成为关键点的方向。若最大值与局部极大值之间的差距不超过20%,则认为关键点包含多个方向,并创建一个新的关键点。

• 生成描述子:以关键点为中心取16×16的区域,将其划分为4×4的子区域,每个子区域内建立一个八方向的直方图,计算每个像素的梯度量值大小与方向并添加到相应的子区域直方图中,最终产生一个128维的数据集,将其归一化为单位向量作为关键点的描述子。

应用场景

• 物体识别:能识别独特的关键点,不受移动、旋转、缩放等因素影响,可用于从图像或视频中识别特定物体。

• 图像拼接:通过检测不同图像中的匹配特征点,可实现非全景图像的自动全景重建。

• 三维重建:从多个视角的二维图像中提取SIFT特征,可用于重建出三维物体的形状和结构。

• 机器人导航与地图构建:帮助机器人识别环境中的关键

两者区别

ORB和SIFT的比较如下:

计算速度

• ORB:基于FAST角点检测和BRIEF描述子,二者都是基于二进制操作,计算速度快。

• SIFT:需要构建尺度空间、进行极值点检测等复杂操作,计算量较大,速度相对较慢。

特征鲁棒性

• ORB:具有一定的旋转不变性,但尺度不变性相对较弱,对光照变化和噪声敏感度相对较高。

• SIFT:对旋转、尺度缩放、亮度变化保持很好的不变性,对视角变化、仿射变换、噪声也有一定的稳定性。

特征描述

• ORB:采用二进制编码的描述子,如通过比较关键点周围的像素点对生成,占用空间小,匹配时可采用汉明距离等快速计算。

• SIFT:生成128维的特征描述子,包含了丰富的图像局部梯度等信息,特征区分性好,但维度高、计算复杂。

应用场景

• ORB:适用于实时性要求高的场景,如实时图像处理、SLAM等。

• SIFT:适用于对精度要求较高,对速度要求不苛刻的场景,如目标识别、图像拼接、三维重建等。

orb检测速度更快,但是空间旋转的控制识别相较于sift没那么好



#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main(int argc, char** argv) {
    // Mat image = imread("D:/images/butterfly.jpg");
    Mat image = imread("C:/newword/image/25.mp4");
    imshow("input", image);
    auto orb = ORB::create(500);//创建了一个 ORB 特征检测器实例,指定最多检测500个关键点
    vector<KeyPoint> kypts;
    orb->detect(image, kypts);//使用 detect 函数在图像中检测关键点并存储在 kypts 中
    Mat result;
    drawKeypoints(image, kypts, result, Scalar::all(-1), DrawMatchesFlags::DEFAULT);//

drawKeypoints函数是OpenCV中用于在图像上绘制特征点的函数,下面对drawKeypoints(image, kypts, result, Scalar::all(-1), DrawMatchesFlags::DEFAULT);这行代码的参数进行详细解释:

• image:表示输入的源图像,是要在其上绘制关键点的图像,函数不会对该图像进行修改,仅用于获取图像数据和尺寸等信息。

• kypts:是vector<KeyPoint>类型的容器,包含了要绘制的关键点信息,每个KeyPoint对象包含了关键点的坐标、尺度、方向等属性。

• result:是输出图像,函数会将绘制了关键点的图像输出到这个Mat对象中,其尺寸和类型与输入图像image相同。

• Scalar::all(-1):用于指定绘制关键点的颜色。Scalar是OpenCV中用于表示颜色的结构体,Scalar::all(-1)表示使用默认的随机颜色来绘制每个关键点。

• DrawMatchesFlags::DEFAULT:是绘制的标志位,指定了绘制关键点的方式和细节,DrawMatchesFlags::DEFAULT表示使用默认的绘制方式,会绘制关键点的圆圈以及方向(如果有的话)。

    Mat desc_orb;
    orb->compute(image, kypts, desc_orb);
    std::cout << desc_orb.rows << " x " << desc_orb.cols << std::endl;

1. orb->compute(image, kypts, desc_orb);:

• 这是在OpenCV中使用ORB(Oriented FAST and Rotated BRIEF)特征检测器的compute方法。

• orb是一个指向ORB对象的指针,compute方法的作用是根据给定的图像image和已经检测到的关键点kypts,计算这些关键点对应的描述符。

• 描述符是一种用于描述关键点特征的向量,它包含了关键点周围图像的局部信息,这些信息可以用于后续的特征匹配等操作。计算得到的描述符会存储在desc_orb这个Mat对象中。desc_orb的每一行代表一个关键点的描述符向量。

2. std::cout << desc_orb.rows << " x " << desc_orb.cols << std::endl;:

• 这行代码用于输出描述符矩阵desc_orb的尺寸信息。

• desc_orb.rows表示描述符矩阵的行数,即关键点的数量。

• desc_orb.cols表示描述符矩阵的列数,即每个关键点描述符向量的维度。

• 这行代码通过std::cout将描述符矩阵的行数和列数以"行数 x 列数"的形式输出到控制台,方便用户了解描述符的基本信息,例如输出可能是"100 x 32",表示检测到了100个关键点,每个关键点的描述符是32维的向量。

    
    imshow("ORB关键点检测", result);
    waitKey(0);
    return 0;
}



SIFT检测

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main(int argc, char** argv) {
    // Mat image = imread("D:/images/butterfly.jpg");
    Mat image = imread("C:/newword/image/28.jpg");
    imshow("input", image);
    auto sift = SIFT::create(500);
    vector<KeyPoint> kypts;
    sift->detect(image, kypts);
    Mat result;
    drawKeypoints(image, kypts, result, Scalar::all(-1), DrawMatchesFlags::DEFAULT);
    std::cout << kypts.size() << std::endl;
    for (int i = 0; i < kypts.size(); i++) {
        std::cout << "pt:" << kypts[i].pt << " angle:" << kypts[i].angle << "size: " << kypts[i].size << std::endl;
    }
    Mat desc_orb;
    sift->compute(image, kypts, desc_orb);
    std::cout << desc_orb.rows << " x " << desc_orb.cols << std::endl;

    imshow("SIFT关键点检测", result);
    waitKey(0);
    return 0;
}

与上面的ORB思路差不多

相关文章:

落地 ORB角点检测与sift检测

ORB角点检测 可以说ORB是由FAST、灰度质心和BRIEF等技术组合优化形成的&#xff0c;不过更准确地说&#xff0c;ORB是在FAST特征检测算法基础上&#xff0c;结合了灰度质心确定方向以及改进后的BRIEF描述子等技术形成的&#xff0c;以下是具体分析&#xff1a; • FAST特征检…...

16 分布式session和无状态的会话

在我们传统的应用中session存储在服务端&#xff0c;减少服务端的查询压力。如果以集群的方式部署&#xff0c;用户登录的session存储在该次登录的服务器节点上&#xff0c;如果下次访问服务端的请求落到其他节点上就需要重新生成session&#xff0c;这样用户需要频繁的登录。 …...

SpringBoot整合Swagger UI 用于提供接口可视化界面

目录 一、引入相关依赖 二、添加配置文件 三、测试 四、Swagger 相关注解 一、引入相关依赖 图像化依赖 Swagger UI 用于提供可视化界面&#xff1a; <dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger-ui</artifactI…...

如何实现滑动开关功能

文章目录 1 概念介绍2 使用方法3 示例代码 我们在上一章回中介绍了PageView这个Widget,本章回中将介绍Switch Widget.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1 概念介绍 我们在这里介绍的Switch是指左右滑动的开关&#xff0c;常用来表示某项设置是打开还是关闭。Fl…...

数仓的数据加工过程-ETL

ETL代表Extract Transform和Load。ETL将所有三个数据库功能组合到一个工具中&#xff0c;以从一个数据库获取数据并将其放入另一个数据库。 提取&#xff1a;提取是从数据库中提取(读取)信息的过程。在此阶段&#xff0c;从多个或不同类型的来源收集数据。 转换&#xff1a;转…...

自动驾驶中的多传感器时间同步

目录 前言 1.多传感器时间特点 2.统一时钟源 2.1 时钟源 2.2 PPSGPRMC 2.3 PTP 2.4 全域架构时间同步方案 3.时间戳误差 3.1 硬件同步 3.2 软件同步 3.2.3 其他方式 ① ROS 中的 message_filters 包 ② 双端队列 std::deque 参考&#xff1a; 前言 对多传感器数据…...

CYT3BB_4BB:Clock system

CYT3BB/4BB的时钟系统包括8-MHz IMO、2个ILO、4个看门狗计时器、4个PLL、一个FLL、5个时钟监控器(CSV)、一个8-33.34MHzECO和一个32.768-kHz WCO。   该时钟系统支持三个主时钟域: CLK_HF、CLK_SLOW和CLK_LF。 - CLK_HFx: CLK_HFx是活动模式的时钟。每个人都可以使用任…...

C# OpenCV机器视觉:利用CNN实现快速模板匹配

在一个阳光灿烂的周末&#xff0c;阿强正瘫在沙发上&#xff0c;百无聊赖地换着电视频道。突然&#xff0c;一则新闻吸引了他的注意&#xff1a;某博物馆里一幅珍贵的古画离奇失踪&#xff0c;警方怀疑是被一伙狡猾的盗贼偷走了&#xff0c;现场只留下一些模糊不清的监控画面&a…...

消息队列篇--通信协议扩展篇--二进制编码(ASCII,UTF-8,UTF-16,Unicode等)

1、ASCII&#xff08;American Standard Code for Information Interchange&#xff09; 范围&#xff1a;0 到 127&#xff08;共 128 个字符&#xff09;描述&#xff1a;ASCII 是一种早期的字符编码标准&#xff0c;主要用于表示英文字母、数字和一些常见的符号。每个字符占…...

Direct Preference Optimization (DPO): 一种无需强化学习的语言模型偏好优化方法

论文地址&#xff1a;https://arxiv.org/pdf/2305.18290 1. 背景与挑战 近年来&#xff0c;大规模无监督语言模型&#xff08;LM&#xff09;在知识获取和推理能力方面取得了显著进展&#xff0c;但如何精确控制其行为仍是一个难题。 现有的方法通常通过**强化学习从人类反馈&…...

跟我学C++中级篇——容器的连接

一、数据的整合 在实际的开发场景中&#xff0c;经常可以遇到以下的情况&#xff1a;有几个地方的数据需要整合在一起。解决办法也有很多&#xff0c;在不同的层面有不同的解决方式。比如经过清洗可以把非关系型数据转为关系型数据。但在底层编程的情况中会发现有几情况&#…...

java求职学习day15

多线程 1 基本概念 1.1 程序和进程的概念 &#xff08;1&#xff09;程序 - 数据结构 算法&#xff0c;主要指存放在硬盘上的可执行文件。 &#xff08;2&#xff09;进程 - 主要指运行在内存中的可执行文件。 &#xff08;3&#xff09;目前主流的操作系统都支持多进程&a…...

【脚本】如何禁用谷歌浏览器自动更新

这里写自定义目录标题 问题描述解决方法代码 问题描述 最近更新系统以后&#xff0c;发现chrome老是自己更新&#xff0c;导致我的代码也得跟着他更新&#xff0c;就跟一个拜托不掉的狗皮膏药一样。 解决方法 于是我写了一个脚本&#xff0c;以下代码都是bash代码&#xff0…...

【Linux】华为服务器使用U盘安装统信操作系统

目录 一、准备工作 1.1 下载UOS官方系统 &#xff11;.&#xff12;制作启动U盘 1.3 服务器智能管理系统iBMC 二、iBMC设置U盘启动 一、准备工作 1.1 下载UOS官方系统 服务器CPU的架构是x86-64还是aarch64&#xff09;,地址&#xff1a;统信UOS生态社区 - 打造操作系统创…...

WPF3-在xaml中引用其他程序集的名称空间

1. 如何在XAML里引用类库中的名称空间和类2. 小结 1. 如何在XAML里引用类库中的名称空间和类 首先需要记住一点&#xff1a;把类库引用到项目中是引用其中名称空间的物理基础&#xff0c;无论是C#还是XAML都是这样。 一旦将一个类库引用进程序&#xff0c;就可以引用其中的名…...

Python 在Word中添加、或删除超链接

在Word文档中&#xff0c;超链接是一种将文本或图像连接到其他文档、网页或同一文档中不同部分的功能。通过添加超链接&#xff0c;用户可以轻松地导航到相关信息&#xff0c;从而增强文档的互动性和可读性。本文将介绍如何使用Python在Word中添加超链接、或删除Word文档中的超…...

基于 WPF 平台使用纯 C# 实现动态处理 json 字符串

一、引言 在当今的软件开发领域&#xff0c;数据的交换与存储变得愈发频繁&#xff0c;JSON&#xff08;JavaScript Object Notation&#xff09;作为一种轻量级的数据交换格式&#xff0c;以其简洁、易读、便于解析和生成的特点&#xff0c;被广泛应用于各种应用程序中。在 W…...

「全网最细 + 实战源码案例」设计模式——单例设计模式

核心思想&#xff1a; 属于创建型设计模式&#xff0c;核心目的是确保一个类在整个程序运行期间只有一个实例&#xff0c;并提供一个全局访问点来获取该实例。 控制共享资源的访问&#xff08;如数据库链接、配置管理、日志处理器等&#xff09; 真实世界类比&#xff1a;政府…...

第01章 19 通过点数据逐级构建球体体数据的综合性小例子

用VTK库来创建一个三维图像数据&#xff08;vtkImageData&#xff09;&#xff0c;并填充标量数据以表示一个球体的体数据。球的半径为50&#xff0c;体数据的空间间隔为1.0/1000。 首先&#xff0c;我需要包含VTK的头文件&#xff0c;并且创建一个vtkImageData对象。然后&…...

CVE-2024-23897-Jenkins任意文件读取漏洞复现

content Jenkins是什么CVE-2024-23897总结修复建议 Jenkins是什么 Jenkins是一人基于Java开发的、可扩展的持续集成引擎&#xff0c;用于持续、自动地构建/测试软件项目&#xff0c;可以监控一些定时执行的任务。 官网文档&#xff1a; Jenkins是一款开源 CI&CD 软件&…...

centos 7 部署awstats 网站访问检测

一、基础环境准备&#xff08;两种安装方式都要做&#xff09; bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats&#xff0…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容

目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法&#xff0c;当前调用一个医疗行业的AI识别算法后返回…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...

2023赣州旅游投资集团

单选题 1.“不登高山&#xff0c;不知天之高也&#xff1b;不临深溪&#xff0c;不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

群晖NAS如何在虚拟机创建飞牛NAS

套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...

【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案

目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后&#xff0c;迭代器会失效&#xff0c;因为顺序迭代器在内存中是连续存储的&#xff0c;元素删除后&#xff0c;后续元素会前移。 但一些场景中&#xff0c;我们又需要在执行删除操作…...

AD学习(3)

1 PCB封装元素组成及简单的PCB封装创建 封装的组成部分&#xff1a; &#xff08;1&#xff09;PCB焊盘&#xff1a;表层的铜 &#xff0c;top层的铜 &#xff08;2&#xff09;管脚序号&#xff1a;用来关联原理图中的管脚的序号&#xff0c;原理图的序号需要和PCB封装一一…...

怎么开发一个网络协议模块(C语言框架)之(六) ——通用对象池总结(核心)

+---------------------------+ | operEntryTbl[] | ← 操作对象池 (对象数组) +---------------------------+ | 0 | 1 | 2 | ... | N-1 | +---------------------------+↓ 初始化时全部加入 +------------------------+ +-------------------------+ | …...

中科院1区顶刊|IF14+:多组学MR联合单细胞时空分析,锁定心血管代谢疾病的免疫治疗新靶点

中科院1区顶刊|IF14&#xff1a;多组学MR联合单细胞时空分析&#xff0c;锁定心血管代谢疾病的免疫治疗新靶点 当下&#xff0c;免疫与代谢性疾病的关联研究已成为生命科学领域的前沿热点。随着研究的深入&#xff0c;我们愈发清晰地认识到免疫系统与代谢系统之间存在着极为复…...