当前位置: 首页 > 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 软件&…...

前端react后端java实现提交antd form表单成功即导出压缩包

前端&#xff08;React Ant Design&#xff09; 1. 创建表单&#xff1a;使用<Form>组件来创建你的表单。 2. 处理表单提交&#xff1a;在onFinish回调中发起请求到后端API&#xff0c;并处理响应。 import React from react; import { Form, Input, Button } from ant…...

基于ESP32的桌面小屏幕实战[6]:环境搭建和软件基础

摘要 本文分为两部分&#xff1a;Linux开发环境搭建和软件基础。Linux开发环境搭建介绍了Ubuntu虚拟机安装及SSH、Samba配置&#xff0c;可以实现用VSCode操作虚拟机。为了后续工作&#xff0c;搭建了乐鑫ESP32 SDK环境。软件基础介绍了Linux开发常用的软件基础&#xff0c;包…...

接口(完)

大家好&#xff0c;今天我们着重来总结一下接口的知识&#xff0c;并且将接口和抽象类的区别罗列一下&#xff0c;帮助我们更好的认识抽象类和接口。 2.7 抽象类和接口的区别. 抽类和接口都是Java中多态的常见使用方式,都需要重点掌握,同时又要认清两者的区别(重要!!&#xf…...

数据结构——实验七·排序

欢迎各位大佬们来到Tubishu的博客&#x1f31f; Tubishu是一名计算机本科生&#xff0c;不定期发送一些在学校的成果供佬们消遣~希望能为佬的编程之路添砖加瓦⭐&#x1f525; 求各位大佬们垂怜&#x1f525;点赞评论一下呗&#x1f525;&#x1f525; 本文专栏 ➡️ 数据结构 …...

JVM堆空间

JVM&#xff08;Java虚拟机&#xff09;堆空间是Java内存管理的核心区域之一&#xff0c;用于存储Java对象实例。以下是关于JVM堆空间的详细介绍&#xff1a; 1. 堆空间的作用 • 存储对象实例&#xff1a;几乎所有的Java对象实例&#xff08;通过new关键字创建的对象&#xf…...

【详细】SSH公私钥认证与渗透测试攻击场景

SSH&#xff08;Secure Shell&#xff09;是一个用于远程登录和执行命令的网络协议&#xff0c;其认证方式通常有两种&#xff1a;基于密码的认证和基于公私钥的认证。本文将详细介绍SSH公私钥认证机制&#xff0c;并探讨在渗透测试场景中&#xff0c;如何利用对靶机具有读取和…...

常见的多媒体框架(FFmpeg GStreamer DirectShow AVFoundation OpenMax)

1.FFmpeg FFmpeg是一个非常强大的开源多媒体处理框架&#xff0c;它提供了一系列用于处理音频、视频和多媒体流的工具和库。它也是最流行且应用最广泛的框架&#xff01; 官方网址&#xff1a;https://ffmpeg.org/ FFmpeg 的主要特点和功能&#xff1a; 编解码器支持: FFmpe…...

C++异步future

&#x1f30e; C11异步futrue 文章目录&#xff1a; C11异步futrue future介绍     应用场景     future操作       std::async函数模版       std::packaged_task类模版       std::promise类模版 &#x1f680;future介绍 std::future是C11标准库…...

Oracle 12c 中的 CDB和PDB的启动和关闭

一、简介 Oracle 12c引入了多租户架构&#xff0c;允许一个容器数据库&#xff08;Container Database, CDB&#xff09;托管多个独立的可插拔数据库&#xff08;Pluggable Database, PDB&#xff09;。本文档旨在详细描述如何启动和关闭CDB及PDB。 二、容器数据库 (CDB) 2.1…...

Vue组件开发-使用 html2canvas 和 jspdf 库实现PDF文件导出 设置页面大小及方向

在 Vue 项目中实现导出 PDF 文件、调整文件页面大小和页面方向的功能&#xff0c;使用 html2canvas 将 HTML 内容转换为图片&#xff0c;再使用 jspdf 把图片添加到 PDF 文件中。以下是详细的实现步骤和代码示例&#xff1a; 步骤 1&#xff1a;安装依赖 首先&#xff0c;在项…...