opencv-python 基于ORB的特征检测和特征匹配(FAST+BRIEF+BF)笔记
FAST(Features from Accelerated Segment Test)角点检测:
首先选取一个像素点p,并判断p点是否为关键点。设ip为像素点p的灰度值。
选取适当的阈值t。
如图,对p点周围的16个像素点进行检测。
如果16个点当中存在n个连续的像素点都高于Ip+t或者都小于Ip−t,那么像素点p可看作一个角点。
上图中n为12,如虚线所示。
为了取得更快的速度,对于每个待检测的像素点,使用何种顺序去寻找周围的16个像素点也是有讲究的:
首先先找12点、3点、6点、9点钟方向的四个点,先检测12点和6点钟方向的点,然后是3点和9点钟方向的点。如果p点为角点,那么四个点至少有3个符合要求。如果小于3个,那么p点不是角点。
不过,上面的方法有如下的几条缺点:
1.当n<12时不会舍弃数量过多的候选点
2.像素的选取不是最优的,因为效果取决于问题的要求和角点的分布。
3.高速检测的结果被丢弃
4.检测到的特征点互相连接
前三个问题使用机器学习的手段解决,最后一个问题使用非极大值抑制的方法解决。
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('img/lena.jpg')
fast = cv2.FastFeatureDetector_create(threshold=40, nonmaxSuppression=True,
type=cv2.FAST_FEATURE_DETECTOR_TYPE_9_16)