这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 企业专区 » OpenVINO生态社区 » 【原创】OpenCV-Python系列之FAST算法(五十二)

共4条 1/1 1 跳转至

【原创】OpenCV-Python系列之FAST算法(五十二)

高工
2020-08-02 15:41:19     打赏

OpenCV-Python系列之FAST算法

我们已经学习带走几个特征检测器,它们都really good , 但是从实时的角度来说,它们的速度还不够快.作为解决方案,FAST(加速段测试的特征)算法由Edward RostenTom Drummond2006年的论文“Machine learning for high-speed corner detection”中提出(后来在2010年修订)。

FAST 全称 Features from accelerated segment test,一种用于角点检测的算法,该算法的原理是取图像中检测点,以该点为圆心的周围的16个像素点判断检测点是否为角点,通俗的讲就是中心的的像素值比大部分周围的像素值要亮一个阈值或者暗一个阈值则为角点:

image.png

实现步骤:

1.        一个以像素p为中心,半径为3的圆上,有16个像素点(p1p2...p16

2.        定义一个阈值,计算p1p9与中心p的像素差,若它们绝对值都小于阈值,则p点不可能是特征点,直接pass掉,否则,当做候选点

3.        p是候选点,则计算p1p9p5p13与中心p的像素差,若它们的绝对值有至少3个超过阈值,则当做候选点,否则,直接pass

4.        p是候选点,则计算p1p1616个点与中心p的像素差,若它们有至少9个超过阈值,则是特征点,否则,直接pass

5.        对图像进行非极大值抑制:计算特征点出的FAST得分值(即score值,也即s值),判断以特征点p为中心的一个邻域(如3x35x5)内,计算若有多个特征点,则判断每个特征点的s值(16个点与中心差值的绝对值总和),若p是邻域所有特征点中响应值最大的,则保留;否则,抑制。若邻域内只有一个特征点(角点),则保留,得分计算公式如下(公式中用V表示得分,t表示阈值):

image.png

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

  • 它不会拒绝n < 12的候选对象。

  • 像素的选择不是最佳的,因为其效率取决于问题的顺序和角落外观的分布。

  • 高速测试的结果被丢弃了。

  • 彼此相邻地检测到多个特征。

机器学习的方法解决了前三点。使用非最大抑制来解决最后一个问题。

让机器学习一个角检测器

1.选择一组图像进行训练(最好从目标应用范围内)

2.运行FAST算法来对每个图像进行特征点查找

3.对每个特征点,存下周围的16个像素作为向量。所有图像做完以后得到特征向量P

4.16个像素里的每个像素(设为x)可以有下面的三个状态:

image.png

5.根据这些状态,特征向量P被分成3个子集,Pd, Ps, Pb.

6.定义个新的布尔变量Kp,如果p是角就是真反之为假。

7.使用ID3算法(决策树分类)来查询每个子集,对于每个true类用变量Kp,它选择x来得出一个备选像素是否是角的信息。

8.对所有子集迭代直到为0

9.创建的决策树用来对其他图形做fast检测

非极大值抑制

在临近位置检测多个兴趣点是另一个问题,可以使用非极大值抑制来解决。

1.计算一个分数函数,V是所有检测到的特征点,Vp16个围着的像素值得绝对差。

2.计算两个相邻关键点的V

3.丢掉V值低的那个

现在我们开始进行试验:

image.png

来看代码:

def FAST(img):
     fast = cv2.FastFeatureDetector_create()
 
     # find and draw the keypoints
     kp = fast.detect(img, None)
     img2 = cv2.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)))
 
     cv2.imshow('fast_true', img2)
 
     # Disable nonmaxSuppression
     fast.setNonmaxSuppression(0)
     kp = fast.detect(img, None)
 
     print("Total Keypoints without nonmaxSuppression: {}".format(len(kp)))
 
     img3 = cv2.drawKeypoints(img, kp, None, color=(255, 0, 0))
 
     cv2.imshow('fast_false', img3)
 
     cv2.waitKey()

我们先来看看没有使用非极大值抑制的结果:

image.png

可以看到,特征点检测过多,现在我们来看看采用了非极大值抑制的方法输出的结果:

image.png

效果好的多。

最后总结:

  1FAST算法比其他现有的角点探测器快几倍

  2、它对高水平的噪音并不鲁棒,效果取决于阈值的选择

 


对计算机视觉感兴趣?这个社区推荐给你~

>>点击了解OpenVINO生态开发社区



工程师
2020-08-02 23:06:33     打赏
2楼

十分感谢你的分享


工程师
2020-08-02 23:19:45     打赏
3楼

期待下一次的更新


菜鸟
2020-08-03 11:17:36     打赏
4楼



共4条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]