OpenCV(23)角点检测2 -- fast算法(实时)(佳)

目录

一、基础理论

1、前言

2、原理

3、过程

4、让机器学习一个角检测器

5、非极大值抑制

二、API

1、实例化fast(FastFeatureDetector_create函数 )

2、利用fast.detect检测关键点(fast.detect函数)

3、在图像上描绘关键点

三、代码

1、fast模块代码

2、总代码

四、效果

1、关闭非极大值抑制

2、开启非极大值抑制

参考资料


一、基础理论

1、前言

        我们看到了几个特征检测器,其中很多真的很棒。但是,从实时应用程序的角度来看,它们不够快。最好的例子是计算资源有限的SLAM(同时定位和制图)移动机器人。

        作为对此的解决方案,Edward Rosten和Tom Drummond在2006年的论文“用于高速拐角检测的机器学习”中提出了FAST(加速分段测试的特征)算法。

2、原理

        FAST(全称Features from accelerated segment test)是一种用于角点检测的算法,该算法的原理是:取图像中检测点,以该点为圆心的周围邻域内像素点判断检测点是否为角点,通俗的讲就是若一个像素周围有一定数量的像素与该点像素值不同,则认为其为角点

3、过程

1、选择图像中是否要识别为兴趣点的像素p,使其强度为Ip。

2、考虑被测像素周围有16个像素的圆圈。

OpenCV(23)角点检测2 -- fast算法(实时)(佳)_第1张图片

 3、设置阈值t,如果圆中存在一组(共16个像素)n个连续的像素,它们均比Ip+t亮,或者比Ip−t暗,则像素p是一个角(在上图中显示为白色虚线)。n一般取值12。

4、建议使用高速测试以排除大量的非角区域。此测试仅检查1、9、5和13处的四个像素(即上下左右)(如果第一个1和9太亮或太暗,则对其进行测试。如果是,则检查5和13)。如果p是一个角,则其中至少三个必须全部比Ip+t亮或比Ip−t暗。如果以上两种情况都不是,则p不能为角。然后,可以通过检查圆中的所有像素,将完整的分段测试标准应用于通过的候选项。

该检测器本身具有很高的性能。但有几个缺点

  1. 它不会拒绝n <12的候选对象。
  2. 像素的选择不是最佳的,因为其效率取决于问题的顺序和角落外观的分布。
  3. 高速测试的结果被丢弃了。
  4. 彼此相邻地检测到多个特征。

机器学习的方法能解决前三点。最后一点得用非最大值抑制

4、让机器学习一个角检测器

1、选择一组训练图片(最好跟最后的应用相关

2、使用FAST算法找到每幅图像的特征点对于每个特征点将其周围的16个像素存储为矢量P对所有图像执行此操作以获得每个图像的特征向量P

OpenCV(23)角点检测2 -- fast算法(实时)(佳)_第2张图片

3、这16个像素中的每个像素(例如xx)可以具有以下三种状态之一:(较暗普通较亮

OpenCV(23)角点检测2 -- fast算法(实时)(佳)_第3张图片

  1. 取决于这些状态,特征矢量P被细分为3个子集,Pd, Ps, Pb。(

  2. 获得目标值:定义一个新的布尔变量Kp,如果p是一个角点,则为true,否则为false。

  3. 利用特征值向量p,目标值是$K_p$,训练ID3树决策树分类器)。

  4. 将构建好的决策树运用于其他图像的快速的检测

5、非极大值抑制

相邻位置检测多个兴趣点是另一个问题。通过使用非极大抑制来解决。

  1. 计算所有检测到的特征点的得分函数V。VIp与16个周围像素值之间的绝对差之和
  2. 考虑两个相邻的关键点计算它们的V值,丢弃较低V值的那个。6、

二、API

1、实例化fast(FastFeatureDetector_create函数 )

fast = cv.FastFeatureDetector_create( threshold,nonmaxSuppression)

参数:

threshold:阈值t,有默认值10
nonmaxSuppression是否进行非极大值抑制,默认值True

返回:

创建的FastFeatureDetector对象

fast = cv.FastFeatureDetector_create(10, True)      #开启极大值抑制
fast = cv.FastFeatureDetector_create(10, False)     #关闭极大值抑制

2、利用fast.detect检测关键点(fast.detect函数)

kp = fast.detect(Img, None)

参数
Img:进行关键点检测的图像
返回
kp:关键点信息,包括位置,尺度,方向信息

kp = fast.detect(img)

3、在图像上描绘关键点

cv.drawKeypoints (image,keypoints,outputimage,color,flags)

参数

keypoints:关键点信息,将其绘制在图像上(kp

flags:绘图功能的标识设置:
        1.cv2.DRAW_MATCHES_FLAGS_DEFAULT︰创建输出图像矩阵,使用现存的输出图像绘制匹配对和特征点,对每一个关键点只绘制中陶点
        2.cv2.DRAW_MATCHES_FLAGS_DRAW_OVER_OUTIMG:不创建输出图像矩阵,而是在输出图像上绘制匹配对
        3.cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS:对每一个特征点绘制带大小和方向的关键点图形
        4.cv2.DRAW_MATCHES_FLAGS_NOT_DRAW_SINGLE_POINTS:单点的特征点不被绘制

img2 = cv.drawKeypoints(img, kp, None, color=(255, 0, 0))

三、代码

1、fast模块代码

# fast角点检测
def Fast():
    # 1、用默认值初始化FAST对象
    fast = cv.FastFeatureDetector_create(10, True)      #开启极大值抑制
    # fast = cv.FastFeatureDetector_create(10, False)     #关闭极大值抑制

    # 2、寻找并绘制关键点
    kp = fast.detect(img)
    img2 = cv.drawKeypoints(img, kp, None, color=(255, 0, 0))

    # 3、显示
    cv.imshow('Fast', img2)

2、总代码

# fast角点检测
import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt

# fast角点检测
def Fast():
    # 1、用默认值初始化FAST对象
    fast = cv.FastFeatureDetector_create(10, True)      #开启极大值抑制
    # fast = cv.FastFeatureDetector_create(10, False)     #关闭极大值抑制

    # 2、寻找并绘制关键点
    kp = fast.detect(img)
    img2 = cv.drawKeypoints(img, kp, None, color=(255, 0, 0))

    # 3、显示
    cv.imshow('Fast', img2)


if __name__ == '__main__':
    img = cv.imread('Resource/1.jpg')

    Fast()          #fast角点检测

    cv.waitKey(0)

四、效果

1、关闭非极大值抑制

OpenCV(23)角点检测2 -- fast算法(实时)(佳)_第4张图片

OpenCV(23)角点检测2 -- fast算法(实时)(佳)_第5张图片

OpenCV(23)角点检测2 -- fast算法(实时)(佳)_第6张图片

2、开启非极大值抑制

OpenCV(23)角点检测2 -- fast算法(实时)(佳)_第7张图片

OpenCV(23)角点检测2 -- fast算法(实时)(佳)_第8张图片

OpenCV(23)角点检测2 -- fast算法(实时)(佳)_第9张图片

参考资料

https://www.bilibili.com/video/BV1Fo4y1d7JL?p=54&spm_id_from=pageDriver

你可能感兴趣的:(#,OpenCV,python,opencv,计算机视觉,人工智能,图像处理)