OpenCV4.5.5学习笔记(二十):角点检测

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

笔者本科时候有幸接触了OpenCV3.2.0版本的学习,后因考研压力不得不暂时停下学习的脚步,现在考研任务结束了,未来的导师也是从事的该方向,笔者又开始了新一轮的学习。回来发现OpenCV已经出到了4.5.5版本,遂重新下载新版本并决定记录这一学习历程。由于笔者水平有限,可能有错误之处还请诸位大佬多多包涵并烦请指出,让我们一起学习,共同进步。
首先需要说明的是:我是按着毛星云前辈编写的OpenCV3编程入门进行学习的,我会尽力把星云前辈的程序转成符合OpenCV4.5.5版本的。毛星云前辈于2021年12月11日不幸过世,他是我非常敬仰的一位业内大佬,我也是看他的书才开始接触OpenCV。


一、角点是什么?

角点:在某一点任意方向的一个微小的变动都会引起灰度的很大变化
作为图像的特征点,角点常常包含着许多重要的图像信息,它们是可以精确定位的二维特征。

具体描述:

  1. 一阶导数(即灰度的梯度)的局部最大所对应的像素点
  2. 两条及两条以上边缘的交点
  3. 图像中梯度值和梯度方向的变化速率都很高的点
  4. 角点处的一阶导数最大,二阶导数为零,它指示了物体边缘变化不连续的方向

角点检测算法可归纳为以下第三类:

  1. 基于灰度图像的角点检测
  2. 基于二值图像的角点检测
  3. 基于轮廓曲线的角点检测

常用角点检测算法为:
Kitchen-Rosenfeld角点检测算法,Harris角点检测算法,KLT角点检测算法及SUSAN角点检测算法。


二、Harris角点检测算法:cornerHarris()

Harris角点检测算法是一种直接基于灰度图像的角点提取算法,稳定性高,尤其对于L型角点检测精度高。
但由于采用了高斯滤波,运算速度相对较慢,角点信息有丢失位置和位置偏移的现象,而且角点提取有聚簇的现象。
可以找到图像中的角点作为该响应图的局部最大值:
在这里插入图片描述

我们常用的是cornerHarris()函数
在OpenCV官方文档中是这么写的:
void cv::cornerHarris (
InputArray src,
OutputArray dst,
int blockSize,
int ksize,
double k,
int borderType = BORDER_DEFAULT
)
第一个参数是输入单通道 8 位或浮点图像,
第二个参数是用于存储 Harris 检测器响应的图像,
第三个参数是邻域大小,
第四个参数是Sobel 算子的孔径参数,
第五个参数是Harris检测器自由参数,
第六个参数是像素外推法


三、Shi-Tomasi角点检测算法:goodFeaturesToTrack()

Shi-Tomasi角点检测算法是Harris角点检测算法的改进,此算法最原始的定义是将矩阵M的行列式值与M的迹相减,再将差值同预先给定的阈值进行比较。后来改进为:若两个特征值中较小的一个大于最小阈值,则会得到强角点。
我们常用的是goodFeaturesToTrack()函数
在OpenCV官方文档中是这么写的:
void cv::cornerHarris (
InputArray src,
OutputArray dst,
int blockSize,
int ksize,
double k,
int borderType = BORDER_DEFAULT
)
第一个参数是输入单通道 8 位或浮点图像,
第二个参数是检测到的角的输出向量,
第三个参数是返回的最大角点数。如果角点多于找到的角点,则返回最强的角点,
第四个参数是角点检测图像的最低可接受质量的参数,
第五个参数是返回的角点之间可能的最小欧几里得距离,
第六个参数是可选的感兴趣区域,
第七个参数是用于计算每个像素邻域上的导数协变矩阵的平均块的大小,
第八个参数是指示是否使用Harris检测器
第九个参数是Harris检测器的自由参数


四、亚像素级角点检测:cornerSubPix()

优化拐角位置,得到实数坐标值。
该函数迭代以找到角点或径向鞍点的亚像素精确位置。
在这里插入图片描述
我们假设起始角点q在实际亚像素级角点的附近。检测所有的q-p向量。若点p位于一个均匀的区域,则点p处的梯度为0。若q-p向量的方向与边缘的方向一致,则此边缘上p点处的梯度与q-p向量正交。
在这里插入图片描述
p 点处的梯度与q-p向量的点积为0.状们可以在p点周围找到很多组梯度以及相关的向量q-p,令其点集为0,然后可以通过求解方程组,方程组的解即为角点q 的亚像素级精度的位置,也就是精确的角点位置。
在这里插入图片描述
我们常用的是cornerSubPix()函数
在OpenCV官方文档中是这么写的:
void cv::cornerSubPix (
InputArray image,
InputOutputArray corners,
Size winSize,
Size zeroZone,
TermCriteria criteria
)
第一个参数是输入单通道 8 位或浮点图像,
第二个参数是入角的初始坐标和为输出提供的细化坐标,
第三个参数是搜索窗口边长的一半,
第四个参数是搜索区域中间的死区大小的一半,在该区域上未进行以下公式中的求和,
第五个参数是角细化迭代过程的终止标准


总结

Harris角点检测算法运行结果(我那个图片没检测出来,只能使用例程图片了):
在这里插入图片描述
Shi-Tomasi角点检测算法运行结果:
在这里插入图片描述
亚像素级角点检测运行结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_43264167/article/details/124567925