十五天掌握OpenCV——FAST算法.角点检测

魏老师学生——Cecil:学习OpenCV-机器视觉之旅

  • 使用FAST算法进行特征提取
  • 机器学习的角点检测器
  • 非极大值抑制
  • 总结
  • opencv中FAST特征检测器
    • 代码演示

原理
SLAM(同步定位与地图构建)用于移动机器人,但是计算资源有限,需要快速的算法提供支持。

使用FAST算法进行特征提取

  1. 在图中选取像素点p,判断其是不是关键点。Ip=像素点p灰度值。
  2. 选择适当阈值t。
  3. 在像素点p周围选择16个像素点测试。
  4. 若16个像素点中存在n个连续像素点灰度值 > Ip+t,或 < Ip+t,则认为像素点p是一角点。n取值12.
  5. 采取额外加速办法获取更快效果。先对候选点周围90度点测试(1,5,9,13)。若p是角点,至少3个符合阈值要求;否则不是角点。通过上述步骤的点继续测试。此方法有几个缺点:
    一:n < 12时它不会丢弃很多候选点;
    二:像素的选取不是最优,其效果取决于要解决的问题和角点分布情况。
    三:高速测试的结果被抛弃;
    四:检测到的很多特征点连在一起。
    一、二、三可以通过机器学习方式解决;使用非极大值抑制方法解决。

机器学习的角点检测器

  1. 选择一组训练图片。图片相关度高。
  2. 使用FAST算法找出每张图片特征点。
  3. 对每个特征点,将周围16像素存储构成一个向量,所有图像的向量构成特征向量P。
  4. 每个特征点的16像素点属于下列种类:1
  5. 特征向量P有3子集:Pd,Ps,Pb。
  6. 定义新的布尔变量Kp,p是角点为True,否则为False。
  7. 使用ID3算法(决策树分类器)来查询每个子集利用变量Kp来获取真实类的信息。通过判断Kp的值来选择x,包含了关于候选点是否为角点的大部分信息。
  8. 对所有的子集不断应用,直到为0.
  9. 将构建好的决策树应用于其他图像的快速检测。

非极大值抑制

目的:处理检测到的相连的特征点。

  1. 对所有检测到的特征点构建打分函数V。V=像素点p与周围16个像素点差值的绝对值的和。
  2. 计算邻近两个特征点的打分函数V。
  3. 忽略V值最低的特征点。

总结

FAST算法比其他角点检测算法快。但是由于阈值原因,噪声高时不稳定。

opencv中FAST特征检测器

邻域设置:

  1. cv2.FAST_FEATURE_DETECTOR_TYPE_5_8
  2. cv2.FAST_FEATURE_DETECTOR_TYPE_7_12
  3. cv2.FAST_FEATURE_DETECTOR_TYPE_9_16

代码演示

#coding=utf-8
import cv2
import numpy as np
from matplotlib import pyplot as plt

img=cv2.imread('./image2/mario.jpg')
fast=cv2.FastFeatureDetector()

kp=fast.detect(img,None)
img2=cv2.drawKeypoints(img,kp,color=(255,0,0))

print("Threshold:",fast.getInt('threshold'))
print("nonmaxSuppression:",fast.getBool('nonmaxSuppression'))
print("neighborhood:",fast.getInt('type'))
print("Total Keyponts with nonmaxSuppression:",len(kp))

cv2.imshow('fast_true',img2)

fast.setBool('nonmaxSuppression',0)
kp=fast.detect(img,None)

print("Total Keypoints without nonmaxSuppression:",len(kp))

img3=cv2.drawKeypoints(img,kp,color=(255,0,0))
cv2.imshow('fast-false',img3)

你可能感兴趣的:(机器视觉)