OpenCV(四十五):ORB特征点

2023-09-15 16:11:05

1.特征点的组成

特征点由关键点描述子两部分组成:

  • 关键点是在图像中检测到的具有显著变化的位置坐标。
  • 描述子是用于表示关键点周围局部区域特征的向量或特征向量。

2.ORB特征点原理

ORB特征点由关键点FAST角点 和描述子BRIEF组成。

2.1提取FAST角点的算法

      FAST算法的思想:通过比较像素相对于中心像素有较大差别(过亮、过暗)时,则快速地检测出角点。步骤如下:

  • 选择某个像素点作为中心点P,其像素值为I
  • 设置判定FAST角点的像素闻值,例如=20%*1
  • 比较中心点的像素值与半径为3的圆周上所有像素的像素值进行比较,如果存在连续N个像素的像素值大于或者小于 ,则像素点p为角点。
  • 遍历图像中每个像素点,重复上述步骤
2.2方向分配:

       为每个检测到的角点分配一个主方向。为了实现旋转不变性,采用灰度质心算法(Intensity Centroid)进行实现。对特征点附近的图像灰度质心进行计算,所谓质心是指图像块灰度值作为权值的中心,计算方式如下:

2.3生成BRIEF描述子的算法

       BRIEF描述子生成算法的思想:是通过比较两个像素点对之间的灰度差异,并将比较结果编码为二进制字符串。具体描述BRIEF描述子的步骤如下:

  • 选择一组固定的采样点对
  • 计算采样点对的像素差值
  • 对于每对采样点的像素差值,将其与阈值进行比较,得到一个二进制的比较结果。通常,如果第一个像素的灰度值大于第二个像素的灰度值,就将对应位置的二进制位设为1;否则,置为0。
  • 将所有的二进制比较结果组合成一个二进制字符串,作为BRIEF描述子。
2.4描述子匹配

        对于图像中的两个特征点,使用描述子之间的距离或相似度度量进行匹配。最常见的方法是计算描述子之间的汉明距离(Hamming Distance)或欧氏距离,并根据预设的阈值来判断是否匹配成功。也可以使用快速匹配算法(如KD树或近似最近邻算法)来加速匹配过程。

3.ORB特征点提取函数 create()

static Ptr<ORB> cV::ORB::create ( int   nfeatures = 500,

float    scaleFactor = 1.2f,

int          nlevels = 8,

int          edgeThreshold = 31,

int           firstLevel = 0,

int          WTA K = 2,

ORB::ScoreType  scoreType = ORB: :HARRIS_SCORE,

int         patchSize = 31,

int         fastThreshold = 20

)

  • nfeatures:检测ORB特征点的数目
  • scaleFactor:金字塔尺寸缩小的比例
  • nlevels:金字塔层数
  • edgeThreshold:边缘阙值
  • firstLevel:将原图像放入金字塔中的等级
  • WTA K:生成每位描述子时需要用的像素点数目
  • scoreType:检测关键点时关键点评价方法
  • patchSize:生成描述子时关键点周围邻域的尺寸
  • fastThreshold:计算FAST角点时像素值差值的阅值

4.示例代码

void ORB_f(Mat mat){
    //创建ORB特征点类变量
    Ptr<ORB> orb=ORB::create(500,//特征点数目
                             1.2f,//金字塔层级之间的缩放比例
                             8,//金字塔图像层级系数
                             31,//边缘阈值
                             0,//原图在金字塔中的层数
                             2,//生成描述子时需要用的像素点数目
                             ORB::HARRIS_SCORE,//使用Harris方法评价特征点
                             31,//生成描述子时关键点周围邻域的尺寸
                             20//计算FAST角点时像素值差值的阈值
            );
    //计算ORB关键点
    vector<KeyPoint> Keypoints;
    orb->detect(mat,Keypoints);//确定关键点

    //计算ORB描述子
    Mat descriptions;
    orb->compute(mat,Keypoints,descriptions);//计算描述子

    //绘制特征点
    Mat mat2;
    mat.copyTo(mat2);
    //绘制不含角度和大小的结果
    drawKeypoints(mat,Keypoints,mat,Scalar(255,255,255,255));
    //绘制不含角度和大小的结果
    drawKeypoints(mat,Keypoints,mat2,Scalar(255,255,255,255),DrawMatchesFlags::DRAW_RICH_KEYPOINTS);
    //显示结果
    imwrite("/sdcard/DCIM/mat.png",mat);
    imwrite("/sdcard/DCIM/mat2.png",mat2);

}

显示结果:

      (绘制不含角度和大小的结果)                           (绘制含角度和大小的结果)

更多推荐

Jmeter常用线程组设置策略

一、前言​在JMeter压力测试中,我们时常见到的几个场景有:单场景基准测试、单场景并发测试、单场景容量测试、混合场景容量测试、混合场景并发测试以及混合场景稳定性测试在本篇文章中,我们会用到一些插件,在这边先给大家列出:​CustomThreadGroups插件PS:在我们正式测试中,统一使用非GUI界面运行,只有在调

对比接口测试工具在自动化测试优缺点:Jmeter、Python、Postman

一、JMeter总结:适合对代码不敏感的使用人员,不会代码也可以完成接口自动化,设计框架。适合紧急迭代的项目。JMeter接口测试的优势小巧轻量级,并且开源免费,社区接受度高,比较容易入门支持多协议,并提供了比较高级的扩展能力,允许自己定义和扩展新的协议支持,比如扩展支持阿里提供的Dubbo协议的JMeter插件等学习

JMeter 常见函数讲解

当使用JMeter进行性能测试或负载测试时,函数是一个非常有用的工具,可以帮助生成动态的测试数据或处理测试结果。下面是一些常用的JMeter函数的详细讲解和并列示例:1、__threadNum:返回当前线程的编号。可以在测试过程中用于生成唯一的标识符或动态数据。生成唯一的用户名:${__threadNum}-user动

MySQL

数据库分两大类:关系型数据SQL非关系型数据库NoSQL关系型数据库典型代表:MySQLMariaDBPostgreSQL(pgsql)OracleSQLServerDB2国产数据库:阿里云RDB华为高斯阿里Oceanbase腾讯TDBA1.SQLSQL(StructuredQueryLanguage)是具有数据操纵和

Spring-动态代理深入了解

😀前言本篇的Spring-AOP系类文章第二篇扩展了Spring-动态代理然后开发了简易的AOP类🏠个人主页:尘觉主页🧑个人简介:大家好,我是尘觉,希望我的文章可以帮助到大家,您的满意是我的动力😉😉在csdn获奖荣誉:🏆csdn城市之星2名⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣💓

Nginx服务优化措施、网页安全与配置防盗链

目录一.优化Nginx二.隐藏/查看版本号隐藏版本号方法一:修改配置文件,关闭版本号隐藏版本号方法二:修改源码文件中的版本号,重新编译安装三.修改用户与组四.设置缓存时间五.日志切割脚本六.设置连接超时控制连接访问时间七.开启多进程八.配置网页压缩九.配置防盗链9.1.配置web源主机(192.168.47.103)9

【Python】PySpark 数据计算 ① ( RDD#map 方法 | RDD#map 语法 | 传入普通函数 | 传入 lambda 匿名函数 | 链式调用 )

文章目录一、RDD#map方法1、RDD#map方法引入2、RDD#map语法3、RDD#map用法4、代码示例-RDD#map数值计算(传入普通函数)5、代码示例-RDD#map数值计算(传入lambda匿名函数)6、代码示例-RDD#map数值计算(链式调用)一、RDD#map方法1、RDD#map方法引入在PyS

API网关是如何提升API接口安全管控能力的

API安全的重要性近几年,越来越多的企业开始数字化转型之路。数字化转型的核心是将企业的服务、资产和能力打包成服务(服务的形式通常为API,API又称接口,下文中提到的API和接口意思相同),从而让资源之间形成更强的连接和互动关系,释放原有资产的价值,提升企业的服务能力。企业数字化转型使得基于API的业务系统剧增,随之而

RK3568笔记分享之“如何挂载SPI FRAM铁电存储芯片”——飞凌嵌入式

对于做快速存储采集数据类产品的用户来说,在处理突发掉电情况时需要保存现有数据并避免数据丢失,这种情况下有很多种解决方案,铁电存储器(FRAM)就是个很好的选择。FRAM是一种具有快速写入速度的非易失性存储器,既可以进行非易失性数据存储,又可以像RAM一样操作。本文将借助飞凌嵌入式OK3568-C开发板来为大家介绍一种采

周界警戒AI算法+视频智能分析在安全生产场景中的应用

长期以来,周界防范安防系统在大型园区、工厂、社区、机场、火车站站台、重点单位等领域应用较为广泛和常见。随着AI人工智能等新兴技术的快速发展与落地应用,通过AI智能检测与视频智能分析技术,现代化的周界安防系统可以做到全天候快速、准确地发现入侵等异常事件,并及时报警遏制。今天我们来介绍下旭帆科技安全生产周界警戒AI算法的具

[2023.09.18]: Rust中类型转换在错误处理中的应用解析

随着项目的进展,关于Rust的故事又翻开了新的一页,今天来到了服务器端的开发场景,发现错误处理中的错误类型转换有必要分享一下。Rust抽象出来了Result<T,E>,T是返回值的类型,E是错误类型。只要函数的返回值的类型被定义为Resut<T,E>,那么作为开发人员就有责任来处理调用这个函数可能发生的错误。通过Res

热文推荐