OpenCV Fast角点检测

FAST是一种用于角点检测的算法,该算法的原理是取图像中检测点,以改点为圆心的周围邻域内像素点判断监测点是否为角点。
OpenCV中的FAST检测算法是用传统方法实现的。

实例化fast

fast = cv.FastFeatureDetector_create(threshold, nonmaxSuppression)

参数:

  • threshold:阀值t,有默认值10
  • nonmaxSuppression:是否进行非极大值抑制,默认值True

返回:

  • Fast:创建的FastFeatureDetector对象

利用fast.detect检测关键点,没有对应的关键点描述

kp = fast.detect(igrayImg, None)

参数:

  • gray:进行关键点检测的图像,注意是灰度图形

返回:

  • kp:关键点信息,包括位置,尺度,方向信息

将关键点检测结果绘制在图像上

cv.drawKeypoints(image, keypoints, outputimage, color, flags)

代码实现

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt

# 1.读取图像
img = cv.imread("./1.jpg")

# 2.Fast角点检测
# 2.1创建一个Fast对象,传入阀值,注意:可以处理彩色空间图像
fast = cv.FastFeatureDetector_create(threshold=30)

# 2.2检测图像上的关键点
kp = fast.detect(img, None)

# 2.3在图像上绘制关键点
img2 = cv.drawKeypoints(img, kp, None, color=(0, 0, 255))

# 2.4输出默认参数
print("Threshold:{}".format(fast.getThreshold()))
print("nonmaxSuppression:{}".format(fast.getNonmaxSuppression()))
print("neighborhood:{}".format(fast.getType()))
print("Total Keypoints with nonmaxSuppression:{}".format(len(kp)))

# 2.5关闭非极大值抑制
fast.setNonmaxSuppression(0)
kp = fast.detect(img, None)

print("Total Keypoints without nonmaxSuppression:{}".format(len(kp)))

# 2.6绘制为进行非极大值抑制效果
img3 = cv.drawKeypoints(img, kp, None, color=(0, 0, 255))

# 3.绘制图像
fig, axes = plt.subplots(nrows=1, ncols=3, figsize=(10, 8), dpi=100)
axes[0].imshow(img[:, :, ::-1])
axes[0].set_title("原图")
axes[1].imshow(img2[:, :, ::-1])
axes[1].set_title("加入非极大值抑制")
axes[2].imshow(img3[:, :, ::-1])
axes[2].set_title("未加入非极大值抑制")
plt.show()

OpenCV Fast角点检测_第1张图片
Fast算法:
若一个像素周围有一定数量的像素与该点像素值不同,则认为其为角点。

Fast算法的缺点:

  • 获取的候选点比较多
  • 特征点的选取不是最优的,因为它的效果取决于要解决的问题和角点的分布情况。
  • 进行非特征点判别时大量的点被丢弃
  • 检测到的很多特征点都是相邻的

前 3个问题可以通过机器学习的方法解决,最后一个问题可以使用非最大值抑制的方法解决。

Fast算法比其它角点的检测算法快,但是在噪声较高时不够稳定,这需要设置合适的阀值。

你可能感兴趣的:(OpenCV)