一文搞定opencv中常见的关键点检测算法(附代码)

引言

角点时图像中存在物体边缘角落位置的点或者一些特殊位置的点,角点检测(Corner Detection)是计算机视觉系统中获取图像特征的一种方法,是运动检测、图像匹配、视频跟踪、三维重建和目标识别的基础。
本篇文章将介绍opencv中常用的几种角点检测方法的原理和基于C++的实现。

Harris角点检测

Harris角点原理:设置一个矩形框,将这个矩形框放置在图像中,将矩形框内像素进行求和,然后移动矩形框,当相邻两次求和得到的值差别较大时,判定矩形框内存在Harris角点。
通常出现的位置:直线的端点处、直线的交点处、直线的拐点处。
但是如果按照上述检测原理检测,会很麻烦,很难确定矩形框移动的方向和当框内出现角点时,角点的具体位置。
因此,在程序中一般是用以下方式进行检测:1.定义Harris角点检测函数为:

在这里插入图片描述

其中M为梯度协方差矩阵,表示为以下公式:
3.然后使用Harris角点评价函数判断矩形框内是否存在角点:
在这里插入图片描述

其中det是矩阵的行列式,k是一个自定义的常数,tr是矩阵的迹。使用上述方式计算起来计算消耗比较大,因此换用以下方式进行评价:
在这里插入图片描述

其中λ是梯度协方差矩阵M的特征向量,根据这个评价系数,当评价系数值较大时矩形框内有可能存在角点,但当评价系数较小时举行框内一定不存在角点。具体原因如下图所示,当λ1和λ2都是一个较大的值时才能确定一定存在角点,而当其中一个值远远大于另一个时,也会使得R值很大,但这时很有可能位于“边缘”区域,而且评价精度也跟自定义的常数k有很大关系。
在这里插入图片描述

Harris角点检测的代码如下:

在这里插入图片描述

运行结果:

在这里插入图片描述

Shi-Tomas角点检测

在上一节中介绍的Harris角点计算方法中,最后我们发现存在一个问题:角点检测的精度跟自定义的常数k有很大关系,Shi-Tomas角点检测就是对于Harris角点中的这一问题作出了改善,它重新定义了评价系数计算方式:
在这里插入图片描述

根据这个评价函数,评价系数取值为λ1和λ2中的较小值,然后用R与自定义的阈值进行比较,当其中当较小的特征向量都满足条件时,则该点一定为角点。
如下图所示,当较小的特征向量都满足条件时,角点区域为图中绿色区域,一定为角点,而图中橙色区域可能位于边缘,灰色区域一定不是角点。

在这里插入图片描述

Shi-Tomas角点检测代码如下:
在这里插入图片描述

运行结果:

在这里插入图片描述

亚像素级别角位点位置优化

通过上面的角点检测算法,虽然能在原图像中检测出角点的位置,但仔细观察函数可以发现检测出的角点坐标都为整数值,这是因为图像是由像素构成的,是一个离散的数据类型,如果我们想要的到更精细的角点坐标,就需要对角点位置进行优化。
优化的原理如下图所示,当一个像素点q是角点时,它在自己的领域附近是一个局部最大值,以q为起点,周围一点p1或p0为终点组成一个向量,并求梯度,此时向量与梯度的积应该是0。
在这里插入图片描述

当在opencv中检测出角点后(此时的角点位置时不精确的),我们就根据这个原理不断调整角点q的位置,直到达到一定的精度或迭代次数。
而在实际的计算过程中,通常是通过以下公式进行计算:
在这里插入图片描述

就是对q与周围点组成向量与梯度的积求和,当这个和小于一定值时,就判定为达到一定的精度。
亚像素级别角点位置优化代码如下:

在这里插入图片描述

运行结果:

可以看到优化后的角点位置出现了小数,说明对其位置进行了优化。

FAST角点检测

相比于其他的角点检测方法,FAST角点检测的方法精度比较低,但FAST的优点也非常明显,就像它的名字一样–FAST,就是快,它计算速度快,资源消耗少,在具有有限计算资源的情况下(如基于嵌入式设备的SLAM机器人)应用非常广泛。
FAST角点检测的原理如下:
1.在图像中任选一点p, 假定其像素值为Ip
2.以3为半径画圆,覆盖p点周围的16个像素,如下图所示
3.设定阈值t,如果这周围的16个像素中有连续的n个像素的像素值都小于(Ip−t)或大于(Ip+t),那么就判断点p为角点。在OpenCV的实现中n取值为12(16个像素周长的 3/4).
4.一种更加快的改进是:首先检测p点周围的四个点,即1,5,9,12四个点中是否有三个点满足超过Ip+t,如果不满足,则直接跳过,如果满足,则继续使用前面的算法,全部判断16个点中是否有12个满足条件
在这里插入图片描述

FAST角点检测代码如下:

在这里插入图片描述

运行结果如下:

在这里插入图片描述

FAST的缺点也很明显:
1.不具备尺度不变性
2.不具备旋转不变性
3.容易受到噪声影响
ORB特征点检测中专门针对上述缺点做了改进,使得FAST在保持运算速度快的优势下,更加鲁棒。
ORB特征带点检测
ORB的全称是ORiented Brief,它是将FAST角点检测与BRIEF特征描述结合并进行了改进:
(1)由于要解决BRIEF算法的旋转不变性,则需要计算特征点的主方向。ORB中利用重心来计算,如下(其中(x,y)是特征邻域内的点):
1.计算图像的矩

2.计算矩形区域的质心
在这里插入图片描述

3.连接FAST角点与质心得到方向向量
在这里插入图片描述

得到的θ值就是FAST特征点的主方向.
(2) BRIEF描述子,它是一种二进制编码的描述子,摈弃了利用区域灰度直方图描述特征点的传统方法,大大的加快了特征描述符建立的速度。
以特征点为中心,取SxS的邻域窗口。在窗口内随机选取一对(两个)点,比较二者像素的大小,进行如下二进制赋值。

在窗口中随机选取n对随机点,将其进行旋转,后进行判别,然后重复上述步骤的二进制赋值,形成一个二进制编码,这个编码就是对特征点的描述,即特征描述子。(一般N=256)
ORB特征点检测代码如下:

在这里插入图片描述

运行结果:

在这里插入图片描述

总结

非常常用且经典的特征检测算法还有SIFT和SUFT算法,这两种算法都是申请专利的,不能商用,在opencv中实现时需要先配置opencv_contrib拓展包,然后包含头文件,然后初始化方式与ORB检测类似Ptrsift = SIFT::create。
关于SIFT特征点检测可以看一下这篇文章(https://blog.csdn.net/wuzhongqiang/article/details/123969628?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168786332316800186532255%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=168786332316800186532255&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v1~rank_v31_ecpm-2-123969628-null-null.142%5Ev88%5Econtrol_2,239%5Ev2%5Einsert_chatgpt&utm_term=opencv%20sift%E7%89%B9%E5%BE%81%E7%82%B9%E5%8C%B9%E9%85%8Dc%2B%2B&spm=1018.2226.3001.4187)
其他的检测方法就不过多展开,大家可以在网上自己找一下资料进行学习。

转自微信计算机视觉工坊公众号

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值