编程学习
🖼️C++OpenCV(15):图像角点检测
00 分钟
2023-8-28
2023-11-23
type
status
date
slug
summary
tags
category
icon
password
Email
💡
水寒江静,满目青山,载月明归。——黄庭坚《诉衷情》
🔆
文章首发于我的个人博客:欢迎大佬们来逛逛

opencv图像角点检测

角点检测是计算机视觉系统中用来获取图像特征的一种方法,广泛应用于运动检测、图像匹配、视频跟踪、三维建模和目标识别等领域中,也称为特征点检测。角点检测被定义为两条边的交点,更严格的说法是,角点的局部领域应该具有两个不同区域的不同方向的边界。而实际应用中,大多数所谓的角点检测方法检测的是拥有特定特征的图像点,而不仅仅是“角点”。这些特征点在图像中有具体的坐标,并具有某些数学特征,如局部最大或最小灰度、某些梯度特征等。

Harris角点检测

计算过程

notion image
角点检测中使E(u,v)E(uv)的值最大。利用一阶泰勒展开有:
可用sobel算子计算,推导过程如下:
M矩阵决定了E(u,v)的取值,下面我们利用M来求角点,M是关于x和 y方向导数的二次项函数,可以表示成椭圆的形状,椭圆的长短半轴由MM的特征值λ1和λ2决定,方向由特征矢量决定,如下图所示:
椭圆函数特征值与图像中的角点、直线(边缘)和平面之间的关系如下:
  • 图像中的直线:一个特征值大,另一个特征值小
  • 图像中的平面:两个特征值都小,且近似相等
  • 图像中的角点:两个特征值都大,且近似相等
Harris给出的角点计算方法并不需要计算具体的特征值,而是计算一个角点响应值R来判断角点。R的计算公式为
  • detM:矩阵M的行列式,即λ1*λ2
  • traceM:为矩阵M的迹,即λ1+λ2
  • α:常数,取值范围为0.04~0.06
R与图像中的角点、直线(边缘)和平面之间的关系如下:
  • 当R为大数值的正数时是角点
  • 当R为大数值的负数时是边界
  • 当R为小数是认为是平坦区域
notion image

API介绍

Tomasi角点检测

notion image

亚像素级角点检测

数字图像通常是离散化成像素;每个像素对应一个整数坐标位置;整数坐标位置对于很多应用并不精确,比如跟踪、相机标定、图像配准、图像拼接以及三维重构;为达到有些应用的精确性,需要精确到浮点坐标位置;所以亚像素定位问题。亚像素定位就是计算特征所在图像中的真实位置,而真实位置有时候并不在像素所在整数坐标位置上,而是在像素的内部。

计算过程

  • 插值
  • 基于图像矩阵计算
  • 曲线拟合
左图中点p附近的图像是均匀的,其梯度为0,右图中边缘的梯度与沿边缘方向的q-p向量正交,p点梯度与q-p向量的点积均为0
我们假设起始角点q在实际亚像素角点的附近。检测所有的q-p向量。若点p位于一个均匀区域,则点p的梯度为0。若q-p向量的方向与边缘的方向一致,则此边缘上p点处的梯度与q-p向量正交,在这两种情况下,p点处的梯度与q-p向量的点积为0.我们可以在p点周围找到很多组梯度以及相关的向量q-p,令其点集为0,然后可以通过求解方程组,方程组的解即为角点q的亚像素级精度的位置,即精确的角点位置。

API介绍

notion image

评论
  • Twikoo
  • Valine