目录
一、基础理论
1、前言
2、原理
3、过程
4、让机器学习一个角检测器
5、非极大值抑制
二、API
1、实例化fast(FastFeatureDetector_create函数 )
2、利用fast.detect检测关键点(fast.detect函数)
3、在图像上描绘关键点
三、代码
1、fast模块代码
2、总代码
四、效果
1、关闭非极大值抑制
2、开启非极大值抑制
参考资料
我们看到了几个特征检测器,其中很多真的很棒。但是,从实时应用程序的角度来看,它们不够快。最好的例子是计算资源有限的SLAM(同时定位和制图)移动机器人。
作为对此的解决方案,Edward Rosten和Tom Drummond在2006年的论文“用于高速拐角检测的机器学习”中提出了FAST(加速分段测试的特征)算法。
FAST(全称Features from accelerated segment test)是一种用于角点检测的算法,该算法的原理是:取图像中检测点,以该点为圆心的周围邻域内像素点判断检测点是否为角点,通俗的讲就是若一个像素周围有一定数量的像素与该点像素值不同,则认为其为角点。
1、选择图像中是否要识别为兴趣点的像素p,使其强度为Ip。
2、考虑被测像素周围有16个像素的圆圈。
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不能为角。然后,可以通过检查圆中的所有像素,将完整的分段测试标准应用于通过的候选项。
该检测器本身具有很高的性能。但有几个缺点:
- 它不会拒绝n <12的候选对象。
- 像素的选择不是最佳的,因为其效率取决于问题的顺序和角落外观的分布。
- 高速测试的结果被丢弃了。
- 彼此相邻地检测到多个特征。
机器学习的方法能解决前三点。最后一点得用非最大值抑制。
1、选择一组训练图片(最好跟最后的应用相关)
2、使用FAST算法找到每幅图像的特征点。对于每个特征点,将其周围的16个像素存储为矢量P。对所有图像执行此操作以获得每个图像的特征向量P。
3、这16个像素中的每个像素(例如xx)可以具有以下三种状态之一:(较暗、普通、较亮)
取决于这些状态,特征矢量P被细分为3个子集,Pd, Ps, Pb。(暗、普、亮)
获得目标值:定义一个新的布尔变量Kp,如果p是一个角点,则为true,否则为false。
利用特征值向量p,目标值是$K_p$,训练ID3树(决策树分类器)。
将构建好的决策树运用于其他图像的快速的检测。
在相邻位置检测多个兴趣点是另一个问题。通过使用非极大抑制来解决。
fast = cv.FastFeatureDetector_create( threshold,nonmaxSuppression)
参数:
threshold:阈值t,有默认值10
nonmaxSuppression:是否进行非极大值抑制,默认值True返回:
创建的FastFeatureDetector对象
fast = cv.FastFeatureDetector_create(10, True) #开启极大值抑制
fast = cv.FastFeatureDetector_create(10, False) #关闭极大值抑制
kp = fast.detect(Img, None)
参数:
Img:进行关键点检测的图像
返回:
kp:关键点信息,包括位置,尺度,方向信息kp = fast.detect(img)
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))
# 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)
# 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)
https://www.bilibili.com/video/BV1Fo4y1d7JL?p=54&spm_id_from=pageDriver