落地 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思路差不多

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/7325.html

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

相关文章

Spring Boot 自动配置

目录 什么是自动配置&#xff1f; Spring 加载 Bean ComponentScan Import 导入类 导入 ImportSelector 接口的实现类 SpringBoot 原理分析 EnableAutoConfiguration Import(AutoConfigurationImportSelector.class) AutoConfigurationPackage SpringBoot 自动配置流…

16.好数python解法——2024年省赛蓝桥杯真题

问题描述 一个整数如果按从低位到高位的顺序,奇数位(个位、百位、万位…)上的数字是奇数,偶数位(十位、千位、十万位…)上的数字是偶数,我们就称之为“好数”。 给定一个正整数N,请计算从1到N一共有多少个好数。 输入格式 一个整数N。 输出格式 一个整数代表答案。 样例输入 1 …

wxwidgets直接获取系统图标,效果类似QFileIconProvider

目前只做了windows版本&#xff0c;用法类似QFileIconProvider // 头文件 #ifndef WXFILEICONPROVIDER_H #define WXFILEICONPROVIDER_H#include <wx/wx.h> #include <wx/icon.h> #include <wx/image.h> #include <wx/bmpcbox.h> // Include for wxB…

微服务学习-服务调用组件 OpenFeign 实战

1. OpenFeign 接口方法编写规范 1.1. 在编写 OpenFeign 接口方法时&#xff0c;需要遵循以下规范 1.1.1.1. 接口中的方法必须使用 RequestMapping、GetMapping、PostMapping 等注解声明 HTTP 请求的类型。 1.1.1.2. 方法的参数可以使用 RequestParam、RequestHeader、PathVa…

鸿蒙模块概念和应用启动相关类(HAP、HAR、HSP、AbilityStage、UIAbility、WindowStage、window)

目录 鸿蒙模块概念 HAP entry feature har shared 使用场景 HAP、HAR、HSP介绍 HAP、HAR、HSP开发 应用的启动 AbilityStage UIAbility WindowStage Window 拉起应用到显示到前台流程 鸿蒙模块概念 HAP hap包是手机安装的最小单元&#xff0c;1个app包含一个或…

想品客老师的第六天:函数

函数基础的部分写在这里 函数声明 在js里万物皆对象&#xff0c;函数也可以用对象的方式定义 let func new Function("title", "console.log(title)");func(我是参数title); 也可以对函数赋值&#xff1a; let cms function (title) {console.log(tit…

Python:元组构造式和字典推导式

&#xff08;Python 元组构造式和字典推导式整理笔记&#xff09; 1. 元组构造式 1.1 创建元组 使用圆括号&#xff1a; tuple1 (1, 2.5, (three, four), [True, 5], False) print(tuple1) # 输出: (1, 2.5, (three, four), [True, 5], False) 省略圆括号&#xff1a; tup…

Linux之Tcp粘包笔记

目录 一.网络传输四层模型 二.数据传输中数据包传输的两个限制概念 三.数据传输的中粘包问题 四.数据组装的原因 Nagle算法原理: 五.关闭Nagle优化处理粘包问题吗&#xff1f; 六.粘包处理方法 a.设置消息边界&#xff1a; b.定义消息长度&#xff1a; 七.UDP是否会出…

【C语言算法刷题】第2题 图论 dijkastra

题目描述 一个局域网内有很多台电脑&#xff0c;分别标注为 0 ~ N-1 的数字。相连接的电脑距离不一样&#xff0c;所以感染时间不一样&#xff0c;感染时间用 t 表示。 其中网络内一台电脑被病毒感染&#xff0c;求其感染网络内所有的电脑最少需要多长时间。如果最后有电脑不…

软件测试压力太大了怎么办?

本文其实是知乎上针对一个问题的回答&#xff1a; 目前在做软件测试&#xff0c;主要负责的是手机端的项目测试&#xff0c;项目迭代很快&#xff0c;每次上线前验正式都会发现一些之前验测试包时候没有发现的问题&#xff0c;压力太大了&#xff0c;应该怎么调整 看过我之前其…

枚举与模拟 练习

练习题基于《C/C程序设计竞赛真题实战特训教程&#xff08;图解版&#xff09;》 目录 1.1 卡片 题目描述 代码实现 题解笔记 总评 注意点 重点解释 1.2 回文日期 题目描述 输入描述 输出描述 代码实现 题解笔记 总评 注意点 重点解释 1.1 卡片 题目描述 小蓝…

Redis高阶5-布隆过滤器

Redis布隆过滤器 ​ 由一个初始值都为零的bit数组和多个哈希函数构成&#xff0c;用来快速判断集合中是否存在某个元素 目的减少内存占用方式不保存数据信息&#xff0c;只是在内存中做一个是否存在的标记flag 布隆过滤器&#xff08;英语&#xff1a;Bloom Filter&#xff0…

vim如何设置自动缩进

:set autoindent 设置自动缩进 :set noautoindent 取消自动缩进 &#xff08;vim如何使设置自动缩进永久生效&#xff1a;vim如何使相关设置永久生效-CSDN博客&#xff09;

检测到联想鼠标自动调出运行窗口,鼠标自己作为键盘操作

联想鼠标会自动时不时的调用“运行”窗口 然后鼠标自己作为键盘输入 然后打开这个网页 &#xff08;不是点击了什么鼠标外加按键&#xff0c;这个鼠标除了左右和中间滚轮&#xff0c;没有其他按键了&#xff09;

(Halcon)轮廓等分切割(项目分析)

目标&#xff1a;获取绿色圆所在位置&#xff08;可用于点焊/点胶引导&#xff09; 实现思路 一&#xff0c;相机标定板标定&#xff08;如果实战用于点焊/点胶引导需要做图像畸变校正以减小误差&#xff09; 相机标定 如何做一个C#仿Halcon Calibration插件-CSDN博客 二&…

Java面试题2025-Mysql

1.什么是BufferPool&#xff1f; Buffer Pool基本概念 Buffer Pool&#xff1a;缓冲池&#xff0c;简称BP。其作用是用来缓存表数据与索引数据&#xff0c;减少磁盘IO操作&#xff0c;提升效率。 Buffer Pool由缓存数据页(Page) 和 对缓存数据页进行描述的控制块 组成, 控制…

开始步入达梦中级dba

分析内存使用需要的方法之一 disql /nolog conn sysdba/sysdbaselect value from v$parameter where nameMEMORY_LEAK_CHECK; SP_SET_PARA_VALUE(0,MEMORY_LEAK_CHECK,1); select * from V$MEM_REGINFO; select * from V$MEM_HEAP;

UE求职Demo开发日志#7 强化属性完善

1 实现思路设计 定义一个结构体记录技能树一个单元的信息&#xff0c;命名为FStrengthenCellInfo&#xff0c;一个TArray记录技能树整体信息&#xff0c;需要以下信息&#xff1a; 1.TArray前置技能index 2.FString 描述文本 3.TArray<FMyItemInfo>激活需要的物品ID和…

Qt中QVariant的使用

1.使用QVariant实现不同类型数据的相加 方法&#xff1a;通过type函数返回数值的类型&#xff0c;然后通过setValue来构造一个QVariant类型的返回值。 函数&#xff1a; QVariant mainPage::dataPlus(QVariant a, QVariant b) {QVariant ret;if ((a.type() QVariant::Int) &a…

做Midjourney最好图文教程-提示词公式以及高级参数讲解

先说Midjourney万能公式 填写在绘图提示词框里的内容就是提示词&#xff0c;也叫prompt 用途&#xff1a;让Midjourney生成对应图片&#xff08;符合提示词所描述内容的图片&#xff09;&#xff0c;控制图片生成方向种类&#xff1a;文本提示、图像提示、参数提示&#xff0…