手写ORB图像特征(附代码)

图像特征算法(三)——ORB算法简述及Python中ORB特征匹配实践 计算机视觉专栏传送 上一篇:图像特征算法(一)——SURF算法简述及Python标记SURF特征检测实践 下一篇:持续创作中… 目录计算机视觉专栏传送一、ORB算法1.算法简介2.FAST寻找特征点3.BRIEF 算法生成图像特征描述符4.满足缩放旋转不变性的改进(1)缩放不变性(2)旋转不变性(3)rBRIEF二、Python代码实践1.测试环境2.测试代码3.核心函数4.测试结果 一、ORB算法 1.算法简介 ORB 是 Oriented Fast and Rotated Brief 的简称,可以用来对 阅读详情

ORB特征由key points和descriptor两部分组成,也就是找出代表性的点,而且给出一个向量来表示点周围像素的信息。

它的keypoint称为"Oriented FAST",是一种改进的FAST角点(FAST不在这里介绍)
它的descriptor称为BRIFF,是一种二进制的描述方式,在后面的代码里有体现。

ORB特征提取有以下2步:

  1. FAST角点提取,相比于原版FAST,它加入了特征点的主方向,也就是方向信息,为BRIFF描述子提供了旋转不变性。
  2. BRIFF描述子,就是在前一步key point的周围提取有描述信息的向量。

第一步的FAST角点提取不在这里介绍,会直接调用opencv。

第二步简单介绍下BRIFF描述子:
它是一种二进制描述子,就是说特征向量里面只有0和1,怎么确定是0还是1?
这时取key point(计算FAST角点得到)附近的随机的两个像素点p和q,如果p<q就是1,反之是0。只取2个点肯定不足以表达特征吧,于是代码中对每个key point附近随机取256个点,就得到256维的0,1向量。
由于是二进制,所以用一个整型就能储存。

再说旋转不变性,这里在一个小的图像块中找到质心,图像块的几何中心O与质心C会形成一个向量,这个向量就代表了一个方向角theta。
还记得旋转变换么,
( x ′ y ′ ) = ( c o s θ − s i n θ s i n θ c o s θ ) ( x y ) \begin{pmatrix} x^{'} \\ y^{'} \\ \end{pmatrix} = \begin{pmatrix} cos\theta&-sin\theta \\ sin\theta&cos\theta \\ \end{pmatrix}\begin{pmatrix} x\\y\\ \end{pmatrix} (x′y′​)=(cosθsinθ​−sinθcosθ​)(xy​)

对每个随机的256个p,q做旋转,加到keypoint上(p,q是以keypoint为中心的(x,y), 可理解成keypoint的随机偏移向量),这样会得到旋转后的256个随机点形成的01特征向量,这就是旋转之后的"Steer BRIFF"特征,具有较好的旋转不变性。

下面在代码里体现以上步骤

//输入参数:图像,FAST角点,保存描述子的vector
void computeORB(const Mat &img, vector<KeyPoint> &keypoints, vector<DescType> &descriptors) {
    const int half_patch_size = 8;
    const int half_boundary = 16; //设的一圈边界
    int bad_points = 0;
    for(auto &kp : keypoints) { //auto &获取集合中数据的引用,不会copy数据,for中修改数据会反映到原数据
        //keypoint中的pt指(x,y)坐标
        if(kp.pt.x < half_boundary || kp.pt.y < half_boundary ||
        kp.pt.x >= img.cols - half_boundary || kp.pt.y >= img.rows - half_boundary) {
            //outside
            bad_points ++;
            descriptors.push_back({});
            continue;
        }
        float m01 = 0, m10 = 0;  //质心
        //以keypoint为中心
        for(int dx = -half_patch_size; dx < half_patch_size; dx++) {
            for(int dy = -half_patch_size; dy < half_patch_size; dy++) {
                uchar pixel = img.at<uchar>(kp.pt.y + dy, kp.pt.x + dx);
                m01 += dx * pixel;
                m10 += dy * pixel;
            }
        }

        //angle = arc tan(m01/m10);
        float m_sqrt = sqrt(m01 * m01 + m10 * m10);
        float sin_theta = m01 / m_sqrt;
        float cos_theta = m10 / m_sqrt;

        //描述子8x256
        DescType desc(8, 0);
        for(int i = 0; i < 8; i++) {
            uint32_t d = 0;
            for(int k = 0; k < 32; k++) {
                int idx_pq = i*32 + k;
                //随机选两个偏移量p, q, 其中p,q为点(x,y)格式,为可重复性,定义在pattern
                Point2f p(ORB_pattern[idx_pq * 4], ORB_pattern[idx_pq * 4 + 1]);
                Point2f q(ORB_pattern[idx_pq * 4 + 2], ORB_pattern[idx_pq * 4 + 3]);

                //对偏移量p,q做旋转变换,旋转角度为theta,加到keypoint上得到随机的两点pp, qq
                Point2f pp = Point2f(cos_theta * p.x - sin_theta * p.y, sin_theta * p.x + cos_theta * p.y) + kp.pt;
                Point2f qq = Point2f(cos_theta * q.x - sin_theta * q.y, sin_theta * q.x + cos_theta * q.y) + kp.pt;
                //比较pp, qq处的像素大小,决定0 or 1
                if(img.at<uchar>(pp.y, pp.x) < img.at<uchar>(qq.y, qq.x)) {
                    d |= 1 << k;  //第k位设为1
                }
            }
            desc[i] = d;  //每个i 对应32位的0,1特征
        }
        descriptors.push_back(desc);
    }
    cout << "bad/total: " << bad_points << "/" << keypoints.size() << endl;
}

描述子,也就是特征向量,会保存在descriptor里面,如果输入两幅图,会得到两个descriptor,下面对两个descriptor中的特征做matching

void BfMatch(
    const vector<DescType> &desc1, const vector<DescType> &desc2, vector<DMatch> &matches
        ) {
    const int d_max = 40;

    for(size_t i1 = 0; i1 < desc1.size(); i1++) {
        if(desc1[i1].empty()) continue;
        //每个i1对应一个最小距离的i2
        //DMatch包含queryIdx(特征1的idx),trainIdx(与特征1相匹配的特征2的idx),distance(特征1与特征2的距离)
        DMatch m{(int)i1, 0 ,256};
        for(size_t i2 = 0; i2 < desc2.size(); i2++) {
            if(desc2[i2].empty()) continue;
            int distance = 0;
            for(int k = 0; k < 8; k++) {    //特征为8x32
                //统计两个distance中不同bit的个数
                distance += _mm_popcnt_u32((unsigned int)(desc1[i1][k] ^ desc2[i2][k]));
            }
            //找出最小距离和对应的desc2的index
            if(distance < d_max && distance < m.distance) {
                m.distance = distance;
                m.trainIdx = i2;
            }
            if(m.distance < d_max) {
                matches.push_back(m);
            }

        }
    }
}

测试代码:

void ORB_test() {
    Mat first_image = imread("../imgs/1.png", 0); //灰度图
    Mat second_image = imread("../imgs/2.png", 0);
    assert(first_image.data != nullptr && second_image.data != nullptr);

    //detect Fast keypoints using thres=40
    vector<KeyPoint> keypoints1;
    FAST(first_image, keypoints1, 40);
    vector<DescType> descriptor1;
    //计算ORB特征
    computeORB(first_image, keypoints1, descriptor1);

    //same for the second
    vector<KeyPoint> keypoints2;
    vector<DescType> descriptor2;
    FAST(second_image, keypoints2, 40);
    computeORB(second_image, keypoints2, descriptor2);

    //find matches
    vector<DMatch> matches;
    BfMatch(descriptor1, descriptor2, matches);

    //plot matches
    Mat image_show;
    drawMatches(first_image, keypoints1, second_image, keypoints2, matches, image_show);
    imshow("matches", image_show);
    waitKey();
}

参考链接

ORB特征点匹配 文章目录特征点ORB特征oFAST角点提取BRIEF 描述子(Binary robust independent elementary feature)特征匹配实践参考 特征点 特征点是图像中具有代表性的点,这些点在图像发生变化时,比如图像的旋转、缩放,将保持不变。图像中的角点和边缘相对来说更加“特别”,因为它们在不同的图像中辨识度更强。因此一种直观的提取特征的方式就是在图像之间辨认角点,并确定... 阅读详情

相关推荐

[图像特征匹配]SIFT、SURF、ORB算法笔记以及代码实现

SIFT算法学习笔记 尺度不变特征转换(Scale-invariant feature transform)是一种用来侦测与描述影像中的局部性特征的视觉算法,即通过求一幅图中的特征点及其有关尺度和方向的描述子得到特征,并进行图像特征点匹配。SIFT所查找到的关键点是一些十分突出,不会因光照,仿射变换和噪音等因素而变化的点,如角点、边缘点、暗区的亮点及亮区的暗点等,噪声也保持一定程度的稳定性,除此...

Ah丶Weii 4441

《视觉SLAM十四讲》-7.2 手写ORB特征

// // Created by xiang on 18-11-25. // #include <opencv2/opencv.hpp> #include <string> #include <nmmintrin.h> #include <chrono> using namespace std; // global variables定义图片路径全局变量 string first_file = "./1.png"; string second_file.

u012177450的博客 1264

ORB算法——特征提取&特征匹配

ORB(Oriented Fast and Rotated Brief),可以用来对图像中的关键点快速创建特征向量,这些特征向量可以用来识别图像中的对象。 其中,Fast 和 Brief 分别是特征检测算法和向量创建算法。ORB 首先会从图像中查找特殊区域,称为关键点。关键点即图像中突出的小区域,角点然后 ORB 会根据特定关键点和其周围的像素区域为每个关键点计算相应的二元特征向量。ORB 的特点是速度超快,而且在一定程度上不受噪点和图像变换的影响,例如旋转和缩放变换等。...

weixin_46026998的博客 4425

Slambook14讲第二版 CH7手写orb的代码解析

4、进行画图,这里的匹配点存储着描述子的Index,描述子的index对应着关键点的index,所以可以根据关键点进行画图。3、根据汉明距离,并利用暴力匹配的方式,得到描述子的最佳匹配点,定义最小匹配距离,比较是否满足定义,满足即添加到匹配点中。2、根据关键点计算方向向量,并根据像素点对坐标,求其在方向向量上的坐标,并添加上平移量,然后根据像素点的比较,获得描述子。具体的解析参考代码注释,特别是实现的函数。1、FAST获取关键点。

m0_49885363的博客 290

orb-slam中的orb特征

ORB是Oriented FAST and Rotated BRIEF(oFAST and rBRIEF)的简称,ORB的名字已经说明了其来源。ORB特征是采用FAST方法来检测提取特征,但FAST特征本身是不具有方向性的,所以在ORB特征中添加对特征方向的计算;另外,ORB采用BRIEF方法计算特征描述子,BRIEF的优点在于速度,orb针对BRIEF描绘子不具备旋转不变性和对噪声敏感的问题进行了修正。

Fishmemory的博客 7234

遥感新手别纠结!实测ENVI 5.3、5.6、6.0三个免费版,教你混搭安装避坑

本文为遥感新手提供ENVI 5.3、5.6、6.0三个免费版的实测对比与混搭安装指南,帮助用户构建零成本高效工作流。详细解析各版本功能差异、共存安装技巧及常见问题解决方案,特别适合课程作业、毕业论文分析和遥感入门练习。

weixin_30819085的博客 471

ORB-SLAM2 ---- computeOrbDescriptor函数

ORB-SLAM2 ---- computeOrbDescriptor函数解析

qq_41694024的博客 935

【最全选型攻略-盘点篇】市面上有哪些靠谱的工业3D相机品牌?(双目、结构光、TOF、激光三角)

选工业3D相机,选最靠谱的品牌,选最Match你的产品,看这一篇就够了!

jiqishijueyingdi的博客 1万+

详细解读ORBSLAM中的描述子提取过程

一直都在基于ORBSLAM做一些相关的开发,只知道进来的图片会直接提取出BRIEF描述子,但是都没有详细地看过它具体的提取过程,今天仔细研究了一下代码和相关理论,弄清楚之后感觉神清气爽,部分内容查找有些费劲,所以特此整理出来,希望对需要的人有所帮助。 1. 前言 ORBSLAM中使用的ORB特征是FAST特征和BRIEF描述子的集合,详细的FAST特征的提取过程这里大概说一下,方便后面对描述子的理解; FAST特征的提取过程: 1. 构建高斯金字塔:ComputePyramid()​  第一层.

3464

jetson agx orin开箱及接口介绍

jetson agx orin开箱及接口介绍

qq_58728069的博客 1万+

Python处理高光谱数据#3 降维

基于Python的高光谱降维操作 高光谱数据:点击此处可下载 用到的库:matplotlib、scipy、spectral 主要内容:主成分分析(PCA)与线性判别(LDA) 欢迎有兴趣的朋友交流指点。最后,废话不多说直接上代码???? import matplotlib.pyplot as plt from scipy.io import loadmat import spectral as spy

qq_273058791的博客 6936

视觉slam学习笔记以及课后习题《第五讲特征点法视觉里程计》

这篇博客主要记录了我在深蓝学院视觉slam课程中的课后习题,因为是为了统计知识点来方便自己以后查阅,所以有部分知识可能不太严谨,如果给大家造成了困扰请见谅,大家发现了问题也可以私信或者评论给我及时改正,欢迎大家一起探讨。其他章的笔记可以在我的首页文章中查看。 整个作业的代码和文档都可以参考我的GitHub存储库GitHub - 1481588643/vslam 如果想要了解视觉slam其他章节的内容,也可以查阅以下链接视觉slam学习笔记以及课后习题《第三讲李群李代数》_m0_61238051的博客..

m0_61238051的博客 1094

Windows 10 下 Nacos 3.0.2 单机版保姆级安装教程(含JDK 17配置与MySQL 8.0连接避坑)

本文提供Windows 10下Nacos 3.0.2单机版的详细安装教程,涵盖JDK 17配置、MySQL 8.0连接优化及生产级安全设置。通过步骤详解和常见问题解决方案,帮助开发者快速完成Nacos的安装与配置,确保服务发现与配置管理的高效运行。

weixin_29237635的博客 318

图像特征点—ORB特征点

图像特征点—ORB特征点 参考文章:https://mp.weixin.qq.com/s/u5gSCwQ3XahF0fe19biAyQ ORB特征包括特征点和描述子。特征点用于筛选比较“特殊”的点,而描述子用来描述某个点周围的特征。接下来将分别介绍这两部分。 1.特征点检测 图像的特征点可以简单的理解为图像中比较显著显著的点,如轮廓点,较暗区域中的亮点,较亮区域中的暗点等。 ORB特征点采用FA...

Mr.Andy的博客 1万+

从农田到城市:如何利用NDVI和缨帽变换提升遥感图像分类精度?

本文深入探讨了如何利用NDVI(归一化差值植被指数)和缨帽变换(Tasseled Cap Transformation)两大关键技术,有效提升从农田到城市等复杂场景的遥感图像分类精度。文章通过剖析地物光谱特征,对比了原始波段与衍生特征的优劣,并提供了在ENVI、ArcGIS及Python环境中的具体操作指南与实战策略,旨在帮助从业者构建更鲁棒的特征工程流程,从而解决地物混淆、边界模糊等常见分类难题。

redis7keeper的博客 865

25 - GRACE Mascon数据缺失月份数据插值

本篇基于文章的相关内容和文章公开的奇异谱分析(SSA)插值算法程序包,对grace Mascon数据种缺失的月份进行 插值 ,总结了使用程序包的相关过程,可以将该程序应用到其他数据处理插值计算中。

weixin_43339605的博客 1842

ORB特征

ORB(Oriented FAST and Rotated BRIEF)特征是一种常用的图像特征,其最大的优点是提取速度快,按业界的说法,ORB特征提取速度臂SURF快10倍,比SIFT快100倍。ORB特征由关键点和描述子两部分组成。他的关键点称为“Oriented FAST”,是一种改进的FAST角点。ORB提取速度快就得益于采用了FAST角点。它的描述子称为BRIEF(Binary Robust Independent Elementary Feature),是一种速度极快的二进制描述子。

qq_34493401的博客 6365

ST03N 里看不到 SE38 / SA38?别急,这不是没记录,而是被换了名字

摘要:SAP系统中SE38/SA38事务码在ST03N统计中可能"隐身",因其对话步骤被归集到对应的程序名(如SE38→RSABAPPROGRAM)。ST03N侧重工作负载聚合统计,而STAD提供短期明细记录。正确排查方法是:在ST03N中搜索程序名而非事务码,再通过STAD验证具体使用情况。这一现象在权限整改和审计中易造成误判,建议将程序名纳入常规监控,并区分ST03N(趋势分析)与STAD(事实校验)的不同用途。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 953

图像特征之ORB特征详解

1 特征点 特征点是图像中一些特别的地方。一般而言,人工设计的特征点(比如SIFT、SURF、ORB等)都具有如下的性质: 可重复性:即相同的“区域“可以在不同的图像中找到(比如将特征点比作一只猫,在图一和图二中都能找到这只猫)。 可区别性:即不同的”区域“有不同的表达。 高效率:在同一副图像中,特征点的数量应该远小于像素的数量。 本地性:特征仅与一小片图像区域相关。 特征点由关键点和描述子两部分组成。 关键点通常是指该特征点在图像中的位置,有的特征点还具有朝向、大小等信息。描述子通常是一个向

sky的博客 8561

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

ORB特征检测原理(含使用代码)

本文为原创文章,转载请注明出处:http://blog.youkuaiyun.com/yang843061497/article/details/38553765 绪论 假如我有2张美女图片,我想确认这2张图片中美女是否是同一个人。这太简单了,以我专研岛国动作片锤炼出来的火眼金睛只需轻轻扫过2张图片就可以得出结论。但是,如果我想让计算机来完成这个功能就困难重重了:再性感的美女在计算机眼中也只是0-1组成的数据...

weixin_43046653的博客 1万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

图像特征检测描述(一):SIFT、SURF、ORB、HOG、LBP特征的原理概述及OpenCV代码实现

什么叫特征检测?就是检测图像中目标的特征呗,所谓特征,不管你怎么旋转目标,离目标远近,它的特征都应不变才对,这两个特性称为叫旋转不变性和尺度不变性。当然还有其它特征,如光照不一样,也不应该变化嘛,只是旋转不变性和尺度不变性是最基本的两个要求。 对特征的描述有很多种方法和算子,常见的有SIFT特征描述算子、SURF特征描述算子、ORB特征描述算子、HOG特征描述、LBP特征描述以及Harr特征描述...

昊虹AI笔记 2万+

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

基于特征的图像对齐(SIFT或ORB)

一. 效果图 什么是图像对齐或者图像配准? 图像对齐(或者图像配准)可以扭曲旋转(其实是仿射变换)一张图使它和另一个图可以很完美的对齐。 下图为SIFT特征匹配的图。 下图为上面左变图矫正的结果。 二. 基于特征的图像对齐步骤 下面以ORB特征为例说明,SIFT特征的步骤与ORB几乎相同。 1. 读取图片到内存 2. 检测特征点 为两张图检测ORB特征点。为了计算单应性矩阵4个就够了,但是一般会检测到成百上千的特征点。可以使用参数MAX_FEATURES 来控制检测的特征点的数量。检测特征点

guopeiAI 8398

图像特征描述子之ORB

原文站点:https://senitco.github.io/2017/07/09/image-feature-orb/  ORB(Oriented FAST and Rotated BRIEF)算法是对FAST特征点检测和BRIEF特征描述子的一种结合,在原有的基础上做了改进与优化,使得ORB特征具备多种局部不变性,并为实时计算提供了可能。 特征点检测  ORB首先利用FAST算法检测特征点,然

Zachary_Co的博客 4271

【特征描述】ORB详解(附python实例代码)

文章目录特征描述 ORBORB特征描述ORB的基本思路AST角点检测的缺点BRIEF的缺点BRIEFORB对BRIEF的改进完整代码如下 特征描述 ORB ORB 算法创建的特征向量只包含 1 和 0,称为二元特征向量。1 和 0 的顺序会根据特定关键点和其周围的像素区域而变化。该向量表示关键点周围的强度模式,因此多个特征向量可以用来识别更大的区域,甚至图像中的特定对象。 ORB 的特点是速度超快,而且在一定程度上不受噪点和图像变换的影响,例如旋转和缩放变换等。 ORB特征描述 ORB特征基于FAST角点的

零碎@流年絮语 的博客 5191

ORB特征匹配实战:用OpenCV实现图像拼接(附完整代码)

本文详细介绍了ORB特征匹配在图像拼接中的应用,从ORB算法的核心原理到OpenCV实战实现。通过FAST关键点检测和BRIEF描述子结合,ORB实现了高效的特征提取与匹配。文章提供了完整的图像拼接代码示例,涵盖特征检测、匹配策略、误匹配剔除和图像融合优化等关键技术,帮助开发者快速掌握3D视觉中的特征匹配应用。

ss78901的博客 900
上一篇: 解决error: inlining failed in call to always_inline ‘int _mm_popcnt_u32(unsigned int)’
下一篇: ubuntu 如何git本地代码到gitee
蓝羽飞鸟
博客等级 码龄8年 1万+粉丝 727原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝羽飞鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值