<图像处理> Fast角点检测

Fast角点检测

基本原理是使用圆周长为N个像素的圆来判定其圆心像素P是否为角点,如下图所示为圆周长为16个像素的圆(半径为3);OpenCV还提供圆周长为12和8个像素的圆来检测角点。

相对中心像素的位置信息

cpp 复制代码
//圆周长为16
static const int offsets16[][2] =
{
    {0,  3}, { 1,  3}, { 2,  2}, { 3,  1}, { 3, 0}, { 3, -1}, { 2, -2}, { 1, -3},
    {0, -3}, {-1, -3}, {-2, -2}, {-3, -1}, {-3, 0}, {-3,  1}, {-2,  2}, {-1,  3}
};

//圆周长为12
static const int offsets12[][2] =
{
    {0,  2}, { 1,  2}, { 2,  1}, { 2, 0}, { 2, -1}, { 1, -2},
    {0, -2}, {-1, -2}, {-2, -1}, {-2, 0}, {-2,  1}, {-1,  2}
};

//圆周长为8
static const int offsets8[][2] =
{
    {0,  1}, { 1,  1}, { 1, 0}, { 1, -1},
    {0, -1}, {-1, -1}, {-1, 0}, {-1,  1}
};

角点判定条件

在圆周上顺时针从顺时针方向从1到N的顺序对圆周像素点进行连续编号。如果在圆周上有M个连续的像素的亮度都比圆心像素的亮度还要亮,或者比圆心像素的亮度还要暗,并且亮度差都大于设置的阈值t,则圆心像素被确定为角点。因此,成为角点必须满足下列两个条件之一。

  • 条件1:集合S由圆周上M个连续的像素x组成,该集合的任意像素x都满足 I x > I p + t I_x>I_p+t Ix>Ip+t
  • 条件2:集合S由圆周上M个连续的像素x组成,该集合的任意像素x都满足 I x < I p − t I_x<I_p-t Ix<Ip−t

在OpenCV中有三种模式,如下:

  • TYPE_9_16,表示圆周上16个像素点/连续9个像素点满足条件
  • TYPE_7_12,表示圆周上12个像素点/连续7个像素点满足条件
  • TYPE_5_8,表示圆周上8个像素点/连续5个像素点满足条件

非角点检测

在一副图像中,非角点往往是占多数。而非角点检测比角点检测容易很多,因此首先剔除非角点将大大提高角点检测速度。例如,当圆周长N为16个像素,连续像素M为12,所以编号为1,5,9,13的这4个圆周像素点中应该至少有3个满足条件。在OpenCV中,采用了另一种方法来判断非角点,即同时检测任意直径上两个端点像素的像素值。

非极大值抑制

如果N一定,我们把使P仍然是角点的最大阈值 t t t定义为P的角点响应值,通过迭代,每次迭代比较8个连续的圆周像素与圆心像素之间的绝对差值,得到8个绝对差值中的最小值 d d d,与这8个连续像素两端相邻的两个圆周像素与圆心像素的绝对差值分别为 d 0 d_0 d0和 d 9 d_9 d9,则此次迭代所得到的角点响应值 v i v_i vi为
v i = m a x ( t , m i n ( d , d 0 ) , m i n ( d , d 9 ) ) v_i=max(t,min(d,d_0),min(d,d_9)) vi=max(t,min(d,d0),min(d,d9))

16个圆周像素需要迭代16次,则最终的角点响应值V为:
V = m a x ( v i ) V=max(v_i) V=max(vi)

角点响应 V V V得到后,需要在 3 ∗ 3 3*3 3∗3的邻域内比较 V V V,只保留那些比其8邻域都大的像素作为最终的角点。非角点的响应值定义为0。

Fast角点检测步骤

  1. 对被检测像素的16个圆周像素的部分像素点进行非角点检测;
  2. 如果初步判断为角点,则对圆周上的全部像素进行角点检测;
  3. 对角点进行非极大值抑制,最终得到角点;

OpenCV函数

复制代码
void cv::FAST(InputArray image, std::vector<KeyPoint>& keypoints, int threshold, bool nonmaxSuppression = true)	

void cv::FAST(InputArray image, std::vector<KeyPoint>& keypoints, int threshold, bool nonmaxSuppression, FastFeatureDetector::DetectorType type)	

Parameters
image					输入图像,灰度图像;
keypoints				检测的关键角点;
threshold				中心像素与围绕该像素的圆形像素之间强度差的阈值;
nonmaxSuppression		如果为true, 则对检测到的角点(关键点)进行非极大值抑制;
type					三种选择:FastFeatureDetector::TYPE_9_16, FastFeatureDetector::TYPE_7_12, FastFeatureDetector::TYPE_5_8
相关推荐
兵慌码乱10 天前
基于 MediaPipe 与 PySide2 的手势交互音乐控制系统实现:轻量化视觉交互全流程解析
python·opencv·计算机视觉·人机交互·手势识别·mediapipe·pyside2
梦想三三14 天前
OpenCV银行卡数字识别项目(图像预处理与字符分割)
人工智能·opencv·计算机视觉
武子康14 天前
调查研究-180 roboflow/supervision:计算机视觉工程里的“胶水层“,为什么值得关注?
人工智能·opencv·计算机视觉·chatgpt·llm·向量化
m沐沐14 天前
【计算机视觉】OpenCV 模板匹配银行卡数字识别---下
人工智能·python·opencv·计算机视觉·pycharm·numpy
fie888914 天前
SSR / MSR 图像增强
人工智能·opencv·计算机视觉
sali-tec14 天前
C# 基于OpenCv的视觉工作流-章85-包胶不良检测
图像处理·人工智能·opencv·算法·计算机视觉
FL162386312915 天前
[cmake]基于C++使用纯opencv部署ppocrv5v6的onnx模型
开发语言·c++·opencv
搏博15 天前
多传感器融合基础之一图像空间(Image Space)全面解析
图像处理·python·图像空间·融合感知
2401_8856651915 天前
基于OpenCV的模板匹配OCR实战:银行卡与身份证数字识别完整教程
人工智能·python·opencv·计算机视觉·ocr
Robot_Nav15 天前
在非均匀相机抖动去模糊中用IMU辅助的精确模糊核重新估计【文献分析】
图像处理·去运动模糊·imu辅助非盲去卷积