OpenCV(四十五):ORB特征点

简介: OpenCV(四十五):ORB特征点

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);
}

显示结果:

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

目录
相关文章
|
6月前
|
算法 计算机视觉 索引
OpenCV(四十六):特征点匹配
OpenCV(四十六):特征点匹配
142 0
|
6月前
|
存储 资源调度 算法
Opencv(C++)系列学习---SIFT、SURF、ORB算子特征检测
Opencv(C++)系列学习---SIFT、SURF、ORB算子特征检测
319 0
|
5月前
|
移动开发 算法 计算机视觉
技术笔记:openCV特征点识别与findHomography算法过滤
技术笔记:openCV特征点识别与findHomography算法过滤
97 0
|
6月前
|
存储 计算机视觉 C++
Opencv(C++)学习系列---特征点检测和匹配
Opencv(C++)学习系列---特征点检测和匹配
295 0
|
6月前
|
算法 计算机视觉
OpenCV(四十七):RANSAC优化特征点匹配
OpenCV(四十七):RANSAC优化特征点匹配
456 0
|
6月前
|
算法 计算机视觉
OpenCV中使用加速鲁棒特征检测SURF与图像降噪讲解与实战(附源码)
OpenCV中使用加速鲁棒特征检测SURF与图像降噪讲解与实战(附源码)
99 0
|
24天前
|
计算机视觉
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
这篇文章详细介绍了OpenCV库中的图像二值化函数`cv2.threshold`,包括二值化的概念、常见的阈值类型、函数的参数说明以及通过代码实例展示了如何应用该函数进行图像二值化处理,并展示了运行结果。
215 0
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
|
2月前
|
算法 计算机视觉
opencv图像形态学
图像形态学是一种基于数学形态学的图像处理技术,它主要用于分析和修改图像的形状和结构。
45 4
|
2月前
|
存储 计算机视觉
Opencv的基本操作(一)图像的读取显示存储及几何图形的绘制
本文介绍了使用OpenCV进行图像读取、显示和存储的基本操作,以及如何绘制直线、圆形、矩形和文本等几何图形的方法。
Opencv的基本操作(一)图像的读取显示存储及几何图形的绘制
|
3月前
|
算法 计算机视觉 Python
python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)
该文章详细介绍了使用Python和OpenCV进行相机标定以获取畸变参数,并提供了修正图像畸变的全部代码,包括生成棋盘图、拍摄标定图像、标定过程和畸变矫正等步骤。
python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)