ORB-SLAM2源码学习:ORBextractor.cc:IC_Angle 利用灰度质心法求解关键点方向角

news2024/11/23 21:48:05

ORB特征点:

特征点是由关键点描述子两部分组成,关键点是指特征点在图像中的位置,描述子是用来描述关键点周围的像素信息。ORB关键点是在FAST关键点的基础上进行改进给像素增加了一个主方向,称为Oriented FAST。描述子在BRIEF的基础上加入了上述的方向信息,称为Steered BRIEF。

FAST关键点:

FAST关键点是一种检测角点的方法。一个像素与它周围像素的差值达到一定阈值,并且达到一定的像素数量,这个像素就有可能是角点。

提取思想:
1.设定选取的像素值为Ip。

2.设定阈值为T,一般为Ip的20%

3.以选取的像素为中心,选取半径为3的圆上的16个像素点。

4.若选取的16个像素点中有N个像素灰度值大于/小于Ip+T/Ip-T,则可认为该像素点为角点。

5.遍历图像的每一个像素点,循环执行上述步骤。

55087322290a481994bb075e2b1dcb2b.png

图像金字塔:

FAST关键点存在尺度问题,ORB特征点使用构建图像金字塔的方式来规避这个问题。我们在对不同图像特征点进行特征匹配时,可以匹配不同图像的不同金字塔层级来提取到特征点,实现尺度不变性。

灰度质心法:

1fa1a55581314813a7e9bd7c2861ad2d.png

利用灰度质心法求出关键点的方向(形心指向质心),将所有图像都旋转到这个方向从而实现旋转不变性。

1.函数声明: 

/*
  1.image 是矩阵的形式代表某层金字塔的图像。
  2.pt 特征点坐标
  3.u_max 图像块每一行的最大边界。
*/
static float IC_Angle(const Mat& image, Point2f pt,  const vector<int> & u_max)
//static 关键字表示该函数的作用域是局限于其定义的源文件内。
//cv::Point2i 是OpenCV库中的一个数据结构,表示二维平面上的一个点,使用的是整数坐标。也可以是 cv::Point2f  cv::Point2d

 2.函数定义:

我们处理的是一个圆形区域,圆具有对称性,我们利用对称性可以一次性的索引多行像素。从而可以实现加速计算圆的灰度质心。

步骤:

1.初始化两个一阶矩:

int m_01 = 0, m_10 = 0;//初始化一阶矩,前为y,后为x。

2.首先先索引中心线:先求出水平坐标轴上的所有一阶矩。

3.以水平坐标轴为轴线,一次性的索引上下两侧的坐标。

5299a8f4f3214b4391d95eaa22e378bb.png

 4.代码解析:

static float IC_Angle(const Mat& image, Point2f pt,  const vector<int> & u_max//模板类point的别名,vector<int> 动态数组模板类。
{
    int m_01 = 0, m_10 = 0;//初始化一阶矩,前为y,后为x。

    //获取中心点灰度值
    const uchar* center = &image.at<uchar> (cvRound(pt.y), cvRound(pt.x));
    //<uchar>单通道灰度图像,<cv::Vec3b>三通道彩色图。
    //cvRound 是 OpenCV 中的函数,它将浮点数四舍五入为最近的整数。
    //at<uchar>(...) 是 cv::Mat 提供的一个成员函数,用于访问指定位置的像素值。

    // Treat the center line differently, v=0。处理中心行。
    for (int u = -HALF_PATCH_SIZE; u <= HALF_PATCH_SIZE; ++u)
        m_10 += u * center[u];//中心线的一阶矩之和。

    // Go line by line in the circuI853lar patch
    int step = (int)image.step1();//.step1()图像一行包含的字节数
    //v=0为中心线,然后对称的对成对的两行进行遍历,提升了计算速度。
    for (int v = 1; v <= HALF_PATCH_SIZE; ++v)
    {
        // Proceed over the two lines
        int v_sum = 0;
        int d = u_max[v];
        for (int u = -d; u <= d; ++u)
        {
            //val_plus中心线下方,val_minus中心线上方。
            int val_plus = center[u + v*step], val_minus = center[u - v*step];
            v_sum += (val_plus - val_minus);//图像坐标y方向向下,故求和要进行相减。
            m_10 += u * (val_plus + val_minus);
        }
        m_01 += v * v_sum;
    }

    return fastAtan2((float)m_01, (float)m_10);//fastAtan2 是 OpenCV 提供的一个函数,用于计算给定两个坐标(x,𝑦)的反正切值。
}

3.调用IC_Angle函数

computeOrientation函数调用了IC_Angle函数通过遍历图像上的所有特征点计算其方向。

/*
 计算特征点的方向
 image                 特征点所在当前金字塔的图像
 keypoints       特征点向量
 umax                  每个特征点所在图像区块的每行的边界 u_max 组成的vector
 */
static void computeOrientation(const Mat& image, vector<KeyPoint>& keypoints, const vector<int>& umax)
{
	// 遍历所有的特征点
    for (vector<KeyPoint>::iterator keypoint = keypoints.begin(),
         keypointEnd = keypoints.end(); keypoint != keypointEnd; ++keypoint)
    {
		// 调用IC_Angle 函数计算这个特征点的方向
        keypoint->angle = IC_Angle(image, 			//特征点所在的图层的图像
								   keypoint->pt, 	//特征点在这张图像中的坐标
								   umax);			//每个特征点所在图像区块的每行的边界 u_max 组成的vector
    }
}

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【设计模式】如何用C++实现依赖倒置

【设计模式】如何用C实现依赖倒置 一、什么是依赖倒置&#xff1f; 依赖倒置原则&#xff08;Dependency Inversion Principle&#xff0c;DIP&#xff09;是SOLID面向对象设计原则中的一项。它的核心思想是&#xff1a; 高层模块不应该依赖于低层模块&#xff0c;两者都应该…

‌植物神经紊乱患者,这些锻炼适合你!

植物神经紊乱是一种常见的心理疾病&#xff0c;其主要症状包括焦虑、抑郁、失眠等&#xff0c;严重时还可能出现心慌、气短、憋气、出汗异常等症状。然而&#xff0c;通过适量的锻炼&#xff0c;我们可以帮助调节自主神经系统&#xff0c;缓解这些症状。那么&#xff0c;植物神…

Golang | Leetcode Golang题解之第525题连续数组

题目&#xff1a; 题解&#xff1a; func findMaxLength(nums []int) (maxLength int) {mp : map[int]int{0: -1}counter : 0for i, num : range nums {if num 1 {counter} else {counter--}if prevIndex, has : mp[counter]; has {maxLength max(maxLength, i-prevIndex)} …

第十七届山东省职业院校技能大赛通知分享

近日&#xff0c;山东省教育厅联合相关部门发布了关于举办第十七届山东省职业院校技能大赛的通知&#xff0c;标志着这一旨在深化教育教学改革、推进产教融合与校企合作的重要赛事即将拉开帷幕。 据了解&#xff0c;本次大赛将设中等职业教育组和高等职业教育组&#xff0c;共包…

Angular实现gridview效果

说明&#xff1a;使用angular实现grid效果&#xff0c;支持文字图片多条数据展示 效果图: step1: <mat-grid-list cols"2" rowHeight"2:1"><mat-grid-tile *ngFor"let course of courses">{{ course }}</mat-grid-tile> &l…

web of sicence使用教程(研究生版)

学习视频链接 进入web of science 通过校园资料库进入进入&#xff0c;选择如下 核心检索规则 不区分字母大小写逻辑运算符 可以通过括号改变优先级 常用通配符 短语检索 检索界面 检索类型 选择数据库

2-8软件包管理

8.1 配置仓库 1.配置本地仓库 #进行代码安装前需要先进行仓库配置和挂载 [rootlocalhost ~]# cd /etc/yum.repos.d [rootlocalhost yum.repos.d]# vim base.repo [baseos] namebaseos baseurl/mnt/BaseOS gpgcheck0 [appstream] nameappstream baseurl/mnt/AppStream gp…

适配器模式:类适配器与对象适配器

适配器模式是一种结构性设计模式&#xff0c;旨在将一个接口转换成客户端所期望的另一种接口。它通常用于解决由于接口不兼容而导致的类之间的通信问题。适配器模式主要有两种实现方式&#xff1a;类适配器和对象适配器。下面&#xff0c;我们将详细探讨这两种方式的优缺点及适…

性能测试:性能测试流程与方法

性能测试流程是指在进行性能测试时所遵循的一系列步骤和阶段&#xff0c;以确保对系统的全面测试和评估。性能测试流程的具体步骤可能会因组织、项目和测试需求而有所不同。 性能测试流程 分析现状&#xff1a;首先需要对应用程序或系统进行详细的分析&#xff0c;了解其当前的…

使用WebStorm开发Vue3项目

记录一下使用WebStorm开发Vu3项目时的配置 现在WebStorm可以个人免费使用啦&#xff01;&#x1f929; 基本配置 打包工具&#xff1a;Vite 前端框架&#xff1a;ElementPlus 开发语言&#xff1a;Vue3、TypeScript、Sass 代码检查&#xff1a;ESLint、Prettier IDE&#xf…

Java已死,大模型才是未来?

作者&#xff1a;不惑_ 引言 在数字技术的浪潮中&#xff0c;编程语言始终扮演着至关重要的角色。Java&#xff0c;自1995年诞生以来&#xff0c;便以其跨平台的特性和丰富的生态系统&#xff0c;成为了全球范围内开发者们最为青睐的编程语言之一 然而&#xff0c;随着技术的…

Allegro: 开源的高级视频生成模型

我们很高兴地宣布 Allegro 的开源发布&#xff0c;这是 Rhymes AI 先进的文本到视频模型。Allegro 是一款功能强大的人工智能工具&#xff0c;能将简单的文字提示转化为高质量的视频短片&#xff0c;为人工智能生成视频领域的创作者、开发者和研究人员开辟了新的可能性。我们希…

【OD-支持在线评测】智能驾驶(200分)

📎 在线评测链接 https://app5938.acapp.acwing.com.cn/contest/11/problem/OD1073 🍓 OJ题目截图 🍿 最新机试E卷,全、新、准,题目覆盖率达 95% 以上,支持题目在线评测,专栏文章质量平均 94 分 🌍 评测功能需要 ⇒ 订阅专栏 ⇐ 后私信联系解锁~ 文章目录 📎…

SpringBoot【实用篇】- 配置高级

文章目录 目标&#xff1a;1.ConfigurationProperties2.宽松绑定/松散绑定3. 常用计量单位绑定4.数据校验 目标&#xff1a; ConfigurationProperties宽松绑定/松散绑定常用计量单位绑定数据校验 1.ConfigurationProperties ConfigurationProperties 在学习yml的时候我们了解…

构造小练习

一。 二。 构造函数的调用顺序&#xff1a; 先走全局&#xff0c;再main函数&#xff0c;而局部静态的函数是走到它那里才开始初始化。所以先构造C&#xff0c;再A,B&#xff0c;最后D。 析构函数的顺序&#xff1a; 先析构局部的&#xff0c;再析构全局的。后定义的先析构。…

openapi回调地址请求不通过

目录 1. 验证url接口get请求本地自测报错 2. 测试回调模式成功不返回结果 3. 测试回调模式返回结果带双引号 对接企业微信 产生会话回调事件 接口问题解决 1. 验证url接口get请求本地自测报错 java.lang.IllegalArgumentException: Last encoded character (before the pa…

探索Unity:从游戏引擎到元宇宙体验,聚焦内容创作

unity是实时3D互动内容创作和运营平台&#xff0c;包括游戏开发、美术、建筑、汽车设计、影视在内的所有创作者&#xff0c;借助Unity将创意变成现实。提供一整套完善的软件解决方案&#xff0c;可用于创作、运营和变现任何实时互动的2D和3D内容&#xff0c;支持平台包括手机、…

数据结构与算法实验练习(三)(排序及线性表的应用)

数据结构与算法分析课下实验练习&#xff0c;现记录一下解答过程&#xff0c;欢迎大家批评指正。 声明&#xff1a;本题目来源于西安交通大学电信学院原盛老师&#xff0c;任何单位或个人在使用、转载或引用本题目时&#xff0c;请务必标明出处为“西安交通大学电信学院原盛老…

mac|安装redis及RedisDesk可视化软件

一、安装 通过Homebrew安装 brew install redis 在安装过程可以得到以下信息&#xff1a; 1、启动redis或重新登陆redis brew services start redis 如果只想在前端运行&#xff0c;而不是在后端&#xff0c;则使用以下命令 /opt/homebrew/opt/redis/bin/redis-server /opt…

基于hive分析Flask为后端框架echarts为前端框架的招聘网站可视化大屏项目

基于hive分析Flask为后端框架echarts为前端框架的招聘网站可视化大屏项目 1. 项目概述 项目目标是构建一个大数据分析系统&#xff0c;包含以下核心模块&#xff1a; 1、数据爬取&#xff1a;通过request请求获取猎聘网的就业数据。 2、数据存储和分析&#xff1a;使用 Hive …