• 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 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.示例代码

    1. void ORB_f(Mat mat){
    2. //创建ORB特征点类变量
    3. Ptr<ORB> orb=ORB::create(500,//特征点数目
    4. 1.2f,//金字塔层级之间的缩放比例
    5. 8,//金字塔图像层级系数
    6. 31,//边缘阈值
    7. 0,//原图在金字塔中的层数
    8. 2,//生成描述子时需要用的像素点数目
    9. ORB::HARRIS_SCORE,//使用Harris方法评价特征点
    10. 31,//生成描述子时关键点周围邻域的尺寸
    11. 20//计算FAST角点时像素值差值的阈值
    12. );
    13. //计算ORB关键点
    14. vector<KeyPoint> Keypoints;
    15. orb->detect(mat,Keypoints);//确定关键点
    16. //计算ORB描述子
    17. Mat descriptions;
    18. orb->compute(mat,Keypoints,descriptions);//计算描述子
    19. //绘制特征点
    20. Mat mat2;
    21. mat.copyTo(mat2);
    22. //绘制不含角度和大小的结果
    23. drawKeypoints(mat,Keypoints,mat,Scalar(255,255,255,255));
    24. //绘制不含角度和大小的结果
    25. drawKeypoints(mat,Keypoints,mat2,Scalar(255,255,255,255),DrawMatchesFlags::DRAW_RICH_KEYPOINTS);
    26. //显示结果
    27. imwrite("/sdcard/DCIM/mat.png",mat);
    28. imwrite("/sdcard/DCIM/mat2.png",mat2);
    29. }

    显示结果:

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

  • 相关阅读:
    Golang gorm manytomany 多对多 更新、删除、替换
    【数据结构】单链表经典面试题10道及详细思路代码
    @Configuration和@Component注解的区别
    【torch】张量乘法:matmul,einsum
    MFC Windows 程序设计[244]之简单的偏好(附源码)
    A1048 Find Coins(测试点1)
    手把手教你使用Tensorflow2.0搭建循环神经网络
    经典面试题-volatile的作用
    Qt多线程http下载器之二:仿迅雷新建下载任务
    车载通信与DDS标准解读系列(1):DDS-RPC
  • 原文地址:https://blog.csdn.net/weixin_63357306/article/details/132902974