• OpenCV实现FAST算法角点检测 、ORB算法特征点检测


    目录

    1 Fast算法

    1.1 Fast算法原理

    1.2  实现办法

    1.2.1  机器学习的角点检测器

    1.2.2  非极大值抑制

    1.3  代码实现

    1.4  结果展示

    2 ,ORB算法

    2.1代码实现

    2.2 结果展示


    1. FAST算法角点检测原理:

    FAST算法(Features from Accelerated Segment Test)是一种快速的角点检测算法,用于检测图像中的关键点。该算法的核心思想是在像素周围的三个环内寻找连续的n个像素点,如果这些像素点中有x个像素点的灰度值比当前像素点的灰度值都要大或小,则当前像素点被认为是一个角点。

    FAST算法的计算速度较快,适用于实时应用和嵌入式系统等场景。

    1. ORB算法特征点检测原理:

    ORB算法(Oriented FAST and Rotated BRIEF)是一种基于FAST角点检测和BRIEF描述符的特征点检测方法。它不仅可以检测出关键点,还可以描述关键点的方向。

    ORB算法的主要步骤如下:

    (1)FAST角点检测:使用FAST算法检测出图像中的所有角点。

    (2)计算关键点方向:计算每个关键点的方向,以使后续的特征描述符具有旋转不变性。ORB算法使用灰度质心法来计算每个角点的方向。

    (3)BRIEF描述符生成:对每个关键点生成一个二进制字符串,称为BRIEF描述符。BRIEF描述符通过比较两个像素的亮度值,得到二进制码,并将所有二进制码组成一个字符串。

    (4)特征点匹配:使用BRIEF描述符将两幅图像中的关键点进行匹配,从而实现图像的配准和目标识别。

    ORB算法不仅具有较好的性能,而且具有很好的鲁棒性和旋转不变性。它在计算机视觉领域中被广泛应用于图像处理、目标识别等方面。

    总结来说,FAST算法和ORB算法都是常用的特征点检测方法。FAST算法通过快速的像素比较实现对图像中角点的检测,速度较快,但精度较低。ORB算法则基于FAST算法和BRIEF描述符,既可以检测出关键点,又可以描述关键点的方向和特征,具有较好的鲁棒性和旋转不变性。这些算法的应用使得计算机可以更加准确地处理和识别图像,为计算机视觉和人工智能领域的发展提供了重要支持。

    FAST算法的核心思想是通过像素的灰度值比较来判断一个像素是否为角点。它选择了三个环(半径为3)上的16个像素点,如果其中有连续n个像素点的灰度值都比当前像素点的灰度值加上一个阈值t要大或小,则当前像素点被认为是一个角点。这里的阈值t通常取10。

    为了提高检测速度,FAST算法使用了一种加速方式——积分图像。通过计算积分图像,可以在常数时间内获取图像中任意矩形区域内像素值的和。这样,对于每个像素,只需计算一次该像素周围矩形区域内的和,在进行像素灰度值比较时,可以快速地获得所需的像素值,大幅提高了算法的效率。

    而ORB算法则是在FAST算法的基础上进一步发展而来的。它引入了方向抑制,即为每个关键点计算其主要方向。ORB算法使用灰度质心法来计算关键点的方向,找到与该关键点灰度质心距离最近的点作为关键点的方向。

    另外,ORB算法还采用了BRIEF(Binary Robust Independent Elementary Features)描述符来描述关键点的特征。BRIEF描述符是一种二进制描述符,它通过在一个预定义的像素对上进行亮度比较,生成一个固定长度的二进制码。这些比较对被选择为具有较大方差的像素对,这样可以保证描述符在旋转、尺度变化下具有良好的不变性。

    通过计算图像中的FAST角点并提取它们的方向和BRIEF描述符,ORB算法能够高效地对图像进行特征检测和匹配,实现图像配准、目标识别等应用。

    综上所述,FAST算法通过像素灰度值比较实现角点检测,而ORB算法在FAST算法的基础上引入了方向抑制和BRIEF描述符,提高了特征点的鲁棒性和不变性。这些算法的原理和设计思想为计算机视觉领域的图像处理和目标识别提供了重要方法和工具。

    1 Fast算法

    1.1 Fast算法原理

    1.2  实现办法

    1.2.1  机器学习的角点检测器

    1.2.2  非极大值抑制

    1.3  代码实现

    1. import cv2 as cv
    2. import matplotlib.pyplot as plt
    3. import numpy as np
    4. from pylab import mpl
    5. mpl.rcParams['font.sans-serif'] = ['SimHei']
    6. img = cv.imread("corner.png")
    7. #Fast 角点检测
    8. '''创建一个fast对象,传入阈值, 注意: 可以处理彩色空间图像'''
    9. fast = cv.FastFeatureDetector_create(threshold=30)
    10. #检测图像上的关键点
    11. kp = fast.detect(img , None)
    12. #在图像上绘制关键点
    13. img2 = cv.drawKeypoints(img , kp , None ,color=(0,0,255))
    14. #输出默认参数
    15. '''打印默认参数的值,包括阈值、是否使用非极大值抑制、邻域大小以及检测到的关键点数量'''
    16. print("Threshold: {}".format(fast.getThreshold()))
    17. print("nonmaxSuppression:{}".format(fast.getNonmaxSuppression()))
    18. print("neighborhood: {}".format(fast.getType()))
    19. print("Total Keypoints with nonmaxSuppression".format(len(kp)))
    20. # 关闭非极大值抑制
    21. fast.setNonmaxSuppression(0)
    22. kp = fast.detect(img , None)
    23. print("Total Keypoints without nonmaxSuppression :{}".format(len(kp)))
    24. #绘制未 加入 非极大值抑制的结果
    25. img3 = cv.drawKeypoints(img , kp,None ,color=(0,0,255))
    26. #绘制图像
    27. fig , axes = plt.subplots(nrows=1 , ncols=2,figsize=(5,4),dpi=100)
    28. axes[0].imshow(img2[:,:,::-1])
    29. axes[0].set_title("加入非极大值抑制")
    30. axes[1].imshow(img3[:,:,::-1])
    31. axes[1].set_title("未加入非极大值抑制")
    32. plt.show()

    1.4  结果展示

    2 ,ORB算法

    2.1代码实现

    1. import cv2 as cv
    2. import matplotlib.pyplot as plt
    3. import numpy as np
    4. from pylab import mpl
    5. mpl.rcParams['font.sans-serif'] = ['SimHei']
    6. img = cv.imread("corner.png")
    7. #2 ORB算法角点检测
    8. #2.1 实例化ORB对象
    9. '''创建了一个ORB(Oriented FAST and Rotated BRIEF)特征检测器对象,并设置了最大特征点数为500。'''
    10. orb = cv.ORB_create(nfeatures=500)
    11. #2.2 检测关键点,并计算特征描述符
    12. kp , des = orb.detectAndCompute(img ,None)
    13. print(des.shape)
    14. '''
    15. orb.detectAndCompute()函数接受两个参数:图像(img)和掩码(None)。它将返回两个结果:关键点(kp)和描述子(des)。
    16. 关键点(kp)是一个包含检测到的关键点信息的列表。每个关键点包含其在图像中的位置、尺度、方向等属性。
    17. 描述子(des)是一个二维数组,形状为(N, 32),其中N是检测到的关键点数量。每一行代表一个关键点的描述子,描述子是一个长度为32的二进制向量。
    18. 通过打印des.shape,可以输出描述子的形状。这里的输出表示检测到的关键点数量为N,每个关键点的描述子长度为32。'''
    19. #将关键点绘制在图像上
    20. img2 = cv.drawKeypoints(img , kp ,None ,color=(0,0,255),flags=0)
    21. #绘制图像
    22. plt.figure(figsize=(5,4),dpi=100)
    23. plt.imshow(img2[:,:,::-1])
    24. plt.xticks([]),plt.yticks([])
    25. plt.show()

    2.2 结果展示

  • 相关阅读:
    【Note】CNN与现代卷积神经网络part4(附PyTorch代码)
    2022 年夏招 Java 面试题,看到必进。
    keil5——安装教程附资源包
    2022年前端面试题整理,持续更新中
    10 【Express基本使用】
    【算法05】合并两个有序链表
    uniapp如何应用onNeedPrivacyAuthorization实现微信小程序隐私政策
    Pthread 并发编程(二)——自底向上深入理解线程
    【计算机网络】你真的懂学校的校园网吗?
    python给一行数据绘制饼图
  • 原文地址:https://blog.csdn.net/qq_53545309/article/details/133315751