【opencv学习】Fast算法进行角点检测

今天学习角点检测的一个Fast算法,顾名思义,很快!
FAST 算法
1: 在图像中选择一个像素点p,得到其灰度值I_p
2: 以半径r为半径画圆,覆盖p点周围M个像素点,通常设置r=3,则M=16,这个M个点是周围一圈的点,不是在半径内的哦,沿着半径的外面一圈的点哈!
另外说一下,这个16个点的顺序是连续挨着的的,绕着一圈逆时针或者是顺时针定义的。
3: 设置一个阈值t,如果这M个像素点内连续存在N个像素点的灰度值在[I_p - t, I_p + t]范围之外,那么这个点就是角点,N一般是12,记住哈,是这个范围之外。
4: 一个个对比太慢了,先对比横向俩点和纵向的俩点(90度垂直),如果p是角点,那么至少有3个点是符号要求的啊,
这个怎么理解呢,根据条件3,16个点存在连续12个点,那不就是270度范围都是要在那个范围之外么。
因此先看四个垂直的方向的四个像素点,这个四个点都不满足了直接过滤掉哈,满足了我们再看剩下的八个点进行进一步的确认。

方法的缺点:
1: 候选点有点多
2: 特征点的选取不是最优
3: 运行非特征点选择时,大量的点被丢弃。
4: 很多检测的点是相邻的,但是这个可以通过NMS(非极大抑制)

那前三个问题怎么解决呢?
前面讲述的方法是不是感觉很死板,过于简单啊?难道非得连续270度范围?连续200度不行么?一定非得连续?中间出点个别值不行么?
我们使用机器学习的方式来解决。步骤如下:
1: 选择一组跟业务相关的图片,找到图中的特征点,还是选择特征点周围的16个像素的存储构成一个向量P
2: 对这个16个像素点进行归类,灰度值大于I_p + t的、灰度值在[I_p - t, I_p + t]之间的、灰度值小于I_p - t的。于是这16个点的的取值可以化成三个值
3: 然后我们提前标注好,哪种情况下是属于角点的,设置为True,否则设置为FALSE
4: 通过机器学习算法来做这样的分类任务,很明显这个是个二分类的问题,输入数据x是离散值,输出数据也是离散值,那么就是用分类的算法,比如决策树试一试。
这样的话,角点检测很贴近我们的实际任务,和我们的任务匹配度就很高了。

第四个问题通过NMS解决,原理就是周围离我近的一些点,在一些计算数值上小于这个点的,就把这些点抑制掉,取最可信的。
那么这个周围是啥,那么就是某个半径范围r,就是周围16个点。在目标检测模型中就是IOU(交并比)
那么这个计算的可信数值是啥,就是中心p点和周围16个点的灰度值差值的绝对值的和,计算也是挺简单的哈,数值小的说明区分度不高,抑制掉。在目标检测模型中就是置信度confidence

import cv2
import numpy as np

def cv_show_image(name, img):
    cv2.imshow(name, img)
    cv2.waitKey(0)  # 等待时间,单位是毫秒,0代表任意键终止
    cv2.destroyAllWindows()

# 1: 读取图像
img = cv2.imread('images/build.jpeg')

# 定义一个fast算法的模型
fast = cv2.FastFeatureDetector_create(threshold=30)

# 进行检测
kps = fast.detect(img)

# 画出角点
img2 = cv2.drawKeypoints(image=img, keypoints=kps, outImage=None, color=(0, 0, 255))
cv_show_image("img2", img2)

# 打印出fast算法的关键的默认参数
print("Threshold: {}".format(fast.getThreshold()))
print("NMS(NonmaxSuppression): {}".format(fast.getNonmaxSuppression()))
print("the count of keypoints is: {}".format(len(kps)))

# 如果我们关闭NMS,我们再看看效果噻,可想而知,点肯定变多了。
fast.setNonmaxSuppression(0)

# 进行检测
kps = fast.detect(img)

# 画出角点
img3 = cv2.drawKeypoints(image=img, keypoints=kps, outImage=None, color=(0, 0, 255))

ret = np.hstack((img, img2, img3))
cv_show_image('Fast', ret)

效果如下:

你可能感兴趣的:(OpenCV,图像处理,opencv,计算机视觉,Fast算法,角点检测,FAST算法)