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博客