ORB算法及C++实现

本文介绍了ORB算法,一种结合FAST检测、图像金字塔、方向确定和BRIEF描述子的计算机视觉技术,强调其计算效率和在实时应用中的适用性。通过C++和OpenCV实例展示了如何实现ORB特征检测和描述子计算。
摘要由CSDN通过智能技术生成

1.ORB算法简介

ORB(Oriented FAST and Rotated BRIEF)是一种流行的计算机视觉算法,用于在图像中检测和描述局部特征。ORB特征提取器结合了FAST关键点检测、图像金字塔生成、关键点方向的确定和BRIEF描述子计算等多种技术。ORB算法的一个主要优点是它的计算效率,它非常适合实时或计算资源受限的应用。然而,相比于SIFT或SURF等其他特征提取器,ORB的特征描述子可能在某些情况下不够鲁棒,特别是在图像内容变化较大或图像质量较低的情况下。

2.ORB算法原理

这里只简要介绍一下ORB算法原理。

2.1 FAST关键点检测

ORB算法使用FAST(Features from Accelerated Segment Test)来快速检测角点。FAST检测器通过检测一个像素及其周围的一圈像素,来判断该像素点是否为角点。常用的是FAST-12来检测角点.

2.2 图像金字塔

为了检测不同尺度的关键点,ORB算法构建图像的金字塔。每一层图像都是上一层图像的降采样版本,这允许算法检测到不同尺寸的特征。

2.3 关键点方向的确定

为了使检测到的关键点更具有区分性,ORB为每个关键点分配一个主方向。这是通过计算关键点周围的梯度方向并选择出现次数最多的方向来实现的。

2.4 BRIEF描述子计算

ORB使用BRIEF(Binary Robust Independent Elementary Features)算法来计算关键点的局部描述子。BRIEF通过关键点周围的随机选取的像素对,并比较它们的强度,生成一个二进制字符描述串作为描述子。

2.5 旋转不变性

由于为每个关键点分配了主方向,ORB生成的描述子对图像旋转具有不变性。

3.C++实现

以下代码在ubuntu 20.04上验证通过,使用的OpenCV版本是3.4.5。

在一个文件夹中创建3个子文件夹,分别为build(存放cmake的中间文件),images(存放图片),src(存放源程序),然后在创建一个CMakeLists.txt文件。具体如下:

3.1 源代码

#include<opencv2/opencv.hpp>
#include<iostream>

using namespace std;
int main(int argc,char **argv)
{
    //检查图片路径是否已作为参数传递
    if(argc < 2)
    {
        cout<<"Usage: DisplayImage <Image_Path>"<<endl;
        return -1;
    }

    cv::Mat image, gray_image;
    image = cv::imread(argv[1],cv::IMREAD_GRAYSCALE);  //读取图片
    if (image.empty())  //当图像为空时
    {
        cout<<"Cloud not open or find the image"<<endl;
        return -1;
    }
    //如果不是灰度图,则转换为灰度图
    if(image.channels() > 1){
        cv::cvtColor(image,gray_image,cv::COLOR_BGR2GRAY);
    }
    else
    {
        gray_image = image;
    }
    
    //创建ORB对象
    cv::Ptr<cv::ORB> orb = cv::ORB::create();
    vector<cv::KeyPoint> keypoints;  //定义一个关键点向量
    cv::Mat descriptors;  //定义一个描述子矩阵

    //使用ORB检测器检测关键点
    orb -> detect(gray_image, keypoints);
    //计算关键点的描述子
    orb -> compute(gray_image, keypoints, descriptors);
    cv::Mat image_keypoints;
    cv::drawKeypoints(image, keypoints,image_keypoints, cv::Scalar::all(-1), cv::DrawMatchesFlags::DEFAULT);

    //显示图片
    cv::imshow("ORB",image_keypoints);
    cv::waitKey(0);

    return 0;

} 

3.2 编写cmake

#当前运行需要的最低版本
cmake_minimum_required(VERSION 3.2)

#项目的名字为ORB_123
project(ORB_123)

#设置C++的标准为11
set(CMAKE_CXX_STANDARD 11)

#找到OpenCV包
find_package(OpenCV REQUIRED)

#找到OpenCV的头文件
include_directories(${OpenCV_INCLUDE_DIRS})

#添加可执行文件
add_executable(orb src/ORB.cpp)

#链接到OpenCV库上
target_link_libraries(orb ${OpenCV_LIBS})

3.3 编译运行

在build文件夹下,打开终端,运行以下命令

cmake ..
make

编译成功的界面如下:

使用ls命令查看生成的可执行文件,其中orb(绿色的)就是我们的可执行文件,和3.2中CMakeLists.txtx最后两行相对应。

接着在build文件夹下运行我们的可执行文件

./orb ./../images/left01.jpg

结果如下:

更多具体情况可参考Opencv(C++)系列学习---SIFT、SURF、ORB算子特征检测_c++ 提取特征sift surf-CSDN博客

ORB(Oriented FAST and Rotated BRIEF)是一种基于FAST算法和BRIEF算法的特征点检测和描述子生成算法ORB算法在FAST算法的基础上,增加了方向角度信息,使得ORB算法能够处理旋转、尺度变化等情况下的特征点匹配。ORB算法具有以下几个特点: 1. 速度快。ORB算法实现非常简单,计算量小,能够实现实时特征点检测和匹配。 2. 鲁棒性好。ORB算法能够处理尺度变化、旋转、光照变化等情况下的特征点匹配。 3. 描述子维度小。ORB算法生成的描述子维度比SIFT和SURF算法的描述子维度小很多,具有更好的匹配速度和效率。 下面是ORB算法的主要步骤: 1. 使用FAST算法检测图像中的特征点。 2. 对每个特征点计算其方向角度。 3. 使用BRIEF算法计算每个特征点的描述子。 4. 对描述子进行归一化和压缩,得到最终的特征向量。 5. 在一个图像中匹配特征点与另一个图像中的特征点,使用最近邻和次近邻的方法进行匹配。 下面是一个简单的MATLAB示例代码,展示了如何使用ORB算法检测图像中的特征点: ```matlab % 加载图像 img = imread('image.jpg'); gray = rgb2gray(img); % 创建ORB对象 orb = cv.ORB(); % 检测图像中的特征点 kp = orb.detect(gray); % 绘制特征点 imshow(img); hold on; plot(cat(1, kp.pt), 'r.'); ``` 需要注意的是,这只是一个简单的示例代码,实际运行中可能需要根据具体情况进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值