首页 > 人工智能 > 人工智能 > openCV - 角点检测快速算法 FAST
目标
在这个章节,
原理
我们看到了几个特性检测器,其中很多都非常好. 但是从实时应用的角度来看,它们还不够快. 一个很好的例子:比如要在计算资源有限的移动机器人上应用SLAM技术 (即使定位和地图构建技术) 将出现问题。一个解决方案就是采用FAST算法,由Edward Rosten和Tom Drummond在他们2006年的论文《机器学习用于高速拐角检测》中提出(后来在2010年进行了修订)。算法的基本总结如下。
使用 FAST来检测特征
前3点是用机器学习方法解决的。最后一个是使用非最大抑制。
机器学习角检测器
5. 根据这些状态,特征向量 P 被细分为三个子集, Pd, Ps, Pb.
6. 定义一个新的布尔变量 Kp ,如果 p 是一个角,则为真,否则为假。
7. 使用ID3算法(决策树分类器)查询每个子集,使用变量 Kp 查询关于真类。它选择产生最多信息量的x作为是否是角的候选,可以 通过计算 Kp 的熵来度量。
8. 递归地应用于所有子集,直到它的熵为零。
9. 所建立的决策树用于其他图像的快速检测。
非最大值抑制
在相邻位置检测多个兴趣点是另一个问题。采用非最大抑制法求解。
总结
它比其他现有的角探测器快几倍。
但它对高噪点的图像效果并不好,依赖于阈值设定。
OpenCV中应用FAST
和其它特征检测器一样。假如你想,你可以指定阈值,不管非最大值抑制用不用,邻域都开启。邻域定义了3个标签,cv.FAST_FEATURE_DETECTOR_TYPE_5_8, cv.FAST_FEATURE_DETECTOR_TYPE_7_12 and cv.FAST_FEATURE_DETECTOR_TYPE_9_16. 下面简单的几行代码展示如何使用FAST函数检测和绘制特征点。
import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
img = cv.imread('simple.jpg',0)
# Initiate FAST object with default values
fast = cv.FastFeatureDetector_create()
# find and draw the keypoints
kp = fast.detect(img,None)
img2 = cv.drawKeypoints(img, kp, None, color=(255,0,0))
# Print all default params
print( "Threshold: {}".format(fast.getThreshold()) )
print( "nonmaxSuppression:{}".format(fast.getNonmaxSuppression()) )
print( "neighborhood: {}".format(fast.getType()) )
print( "Total Keypoints with nonmaxSuppression: {}".format(len(kp)) )
cv.imwrite('fast_true.png',img2)
# Disable nonmaxSuppression
fast.setNonmaxSuppression(0)
kp = fast.detect(img,None)
print( "Total Keypoints without nonmaxSuppression: {}".format(len(kp)) )
img3 = cv.drawKeypoints(img, kp, None, color=(255,0,0))
cv.imwrite('fast_false.png',img3)
看结果,左边和右边分别显示开启和不开起非最大值抑制的效果:
https://www.toutiao.com/a6719320602823377420/
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29829936/viewspace-2652297/ ,如需转载,请注明出处,否则将追究法律责任。