openCV中如何使用角点检测快速算法FAST
openCV中如何使用角点检测快速算法FAST
这篇文章主要为大家展示了“openCV中如何使用角点检测快速算法FAST”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“openCV中如何使用角点检测快速算法FAST”这篇文章吧。
原理
我们看到了几个特性检测器,其中很多都非常好. 但是从实时应用的角度来看,它们还不够快. 一个很好的例子:比如要在计算资源有限的移动机器人上应用SLAM技术 (即使定位和地图构建技术) 将出现问题。一个解决方案就是采用FAST算法。算法的基本总结如下。
使用 FAST来检测特征
选择图像中的像素p作为兴趣点或不作为兴趣点。让它的强度I p.
选择合适的阈值t.
围绕测试中的像素考虑一个由16个像素组成的圆圈 (如下图所示)
那么像素p是一个角点,如果圆圈中有一组相邻的n个像素(为16个像素中的n个),它们的亮度都大于Ip+t, 或者比Ip−t暗. (在上图中白色虚线表示). n 为12.
提出了一种排除大量非转角的高速试验方法。这个测试只检查1,9,5和13处的4个像素(先测试1和9处的像素看是否它们太亮或太暗,如果是,那么再检查5和13)。如果p是一个角,那么其中至少三个点的亮度必须大于Ip+t或比Ip - t暗。如果这两者都不是,那么p就不能是角。然后通过对圆形中所有像素的检测,将全段测试准则应用到通过的候选对象上。该探测器本身表现出高性能,但有几个弱点:
该算法不会拒绝大量 n < 12 的候选点.
像素的选择不是最优的,因为它的效率取决于问题的排序和角的分布。
快速测试的结果可能被丢弃。
多个特征相邻检测。
前3点是用机器学习方法解决的。最后一个是使用非最大抑制。
机器学习角检测器
选择一组用于培训的图像 (最好来自检测目标范围的图像)
对每一张图像运用 FAST 算法找到特点.
对于每个特征点,将其周围的16个像素存储为一个向量。对所有的图像都这样做,得到特征向量P。
这16个像素中的每个像素(比如x)都可以有以下三种状态之一:
5. 根据这些状态,特征向量P被细分为三个子集,Pd, Ps, Pb.
6. 定义一个新的布尔变量Kp,如果p是一个角,则为真,否则为假。
7. 使用ID3算法(决策树分类器)查询每个子集,使用变量Kp查询关于真类。它选择产生最多信息量的x作为是否是角的候选,可以 通过计算Kp的熵来度量。
8. 递归地应用于所有子集,直到它的熵为零。
9. 所建立的决策树用于其他图像的快速检测。
非最大值抑制
在相邻位置检测多个兴趣点是另一个问题。采用非最大抑制法求解。
计算一个分数函数,V代表所有检测到的特征点。V是p和周围16个像素值的绝对差值之和。
考虑两个相邻的关键点并计算它们的V值。
Discard t丢弃V值较低的那个。
总结
它比其他现有的角探测器快几倍。
但它对高噪点的图像效果并不好,依赖于阈值设定。
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函数检测和绘制特征点。
importnumpyasnpimportcv2ascvfrommatplotlibimportpyplotaspltimg=cv.imread('simple.jpg',0)#InitiateFASTobjectwithdefaultvaluesfast=cv.FastFeatureDetector_create()#findanddrawthekeypointskp=fast.detect(img,None)img2=cv.drawKeypoints(img,kp,None,color=(255,0,0))#Printalldefaultparamsprint("Threshold:{}".format(fast.getThreshold()))print("nonmaxSuppression:{}".format(fast.getNonmaxSuppression()))print("neighborhood:{}".format(fast.getType()))print("TotalKeypointswithnonmaxSuppression:{}".format(len(kp)))cv.imwrite('fast_true.png',img2)#DisablenonmaxSuppressionfast.setNonmaxSuppression(0)kp=fast.detect(img,None)print("TotalKeypointswithoutnonmaxSuppression:{}".format(len(kp)))img3=cv.drawKeypoints(img,kp,None,color=(255,0,0))cv.imwrite('fast_false.png',img3)
看结果,左边和右边分别显示开启和不开起非最大值抑制的效果:
以上是“openCV中如何使用角点检测快速算法FAST”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注恰卡编程网行业资讯频道!
推荐阅读
-
迅捷路由器fwr310的管理员密码(fast fwr310无线路由器的pin是多少)
fastfwr310无线路由器的pin是多少?答::fastfwr310无线路由器的pin是admin,路由器具体设置如下:1...
-
搭建个人使用PHP框架~引入nikic/fast-route实现路由功能
-
Python OpenCV基本功能怎么用
-
C++中怎么用OpenCV实现手势识别
-
python+opencv+selenium自动化登录邮箱并实现滑动验证功能
-
怎么使用opencv实现车道线检测
-
如何使用OpenCV和Python构建人员计数器
-
如何使用OpenCV-Python实现识别答题卡判卷功能
-
OpenCV中怎么使用图像像素
-
OpenCV学习方框滤波如何实现图像处理