0037-OpenCV环境下用算法moravec、harris、Shi-Tomasi进行角点检测

角点的定义
“如果某一点在任意方向的一个微小变动都会引起灰度很大的变化,那么我们就把它称之为角点”。角点一般反应的是图像中局部最大值或最小值的孤立点,以角点为中心点的窗口向图像中的任意方向滑动,都会引起较大的灰度变化。

角点检测(Corner Detection)是计算机视觉系统中用来获得图像特征的一种方法,广泛应用于运动检测、图像匹配、视频跟踪、三维建模和目标识别等领域中。

关于角点的具体描述还有以下几种:
一阶导数(即灰度的梯度)的局部最大所对应的像素点;
两条及两条以上边缘的交点;
图像中梯度值和梯度方向的变化速率都很高的点;
角点处的一阶导数最大,二阶导数为零,指示物体边缘变化不连续的方向。

本文给出在OpenCV环境下用算法moravec、harris、Shi-Tomasi进行角点检测的示例程序,具体算法的原理请大家自行查阅相关文档,这里不讲原理。

moravec角点检测:
代码如下

代码请加Q2034196302获取
代码请加Q2034196302获取
代码请加Q2034196302获取

运行结果截图如下



harris角点检测:
OpenCV提供了函数cornerHarris进行harris角点检测。
函数cornerHarris()原型如下:
C++: void cornerHarris(InputArray src, OutputArray dst, int blockSize, int ksize, double k, int borderType=BORDER_DEFAULT )
参数意义如下:
src:源图像,类要求是single-channel 8-bit 或 floating-point image.
dst:存储角点检测结果。数据类型是CV_32FC1,大小和源图像相同。
blockSize:算法涉及到的邻域大小。
ksize:Sobel核算子大小。
k:Harris算法参数,具体什么意义,请参考下面的公式。
borderType:边界处理方法,具体的说明加Q2034196302获取
这个函数在计算harris角点时,对于每一个像素点(x,y),计算2×2的梯度方差矩阵M^(x,y),计算时的邻域为blockSize×blockSize,然后通过下面的公式计算出角点

使用cornerHarris函数进行harris角点检测的代码如下

代码请加Q2034196302获取
代码请加Q2034196302获取
代码请加Q2034196302获取

运行结果截图如下:


Shi-Tomasi角点检测
OpenCV提供了函数goodFeaturesToTrack进行Shi-Tomasi角点检测。
函数原型如下:
C++: void goodFeaturesToTrack(InputArray image, OutputArray corners, int maxCorners, double qualityLevel, double minDistance, InputArray mask=noArray(), int blockSize=3, bool useHarrisDetector=false, double k=0.04 )
参数意义如下:
image:源图像,图像类型为8-bit或floating-point 32-bit的单通道图像。
corners:角点检测输出。
maxCorners:返回的最大角点数。
qualityLevel:可接受的最少角点数的比例因子。如果检测到角点数小于最佳角点数乘以qualityLevel的值,则结果被拒绝。比如如果最佳角点数为1500,qualityLevel=0.01,则当结果小于15时,这个结果被拒绝。
minDistance:对于初选出的角点而言,如果在其周围minDistance范围内存在其他更强角点,则将此角点删除
mask:掩码阵列。掩码中的非0元素对应的图像元素将会被计算,0元素则被屏蔽不参与计算,可选参数。
blockSize:算协方差矩阵时的窗口大小
useHarrisDetector:是否使用Harris算法函数或cornerMinEigenVal检测角点。
k:Harris角点检测需要的k值.

使用函数goodFeaturesToTrack进行Shi-Tomasi角点检测的代码如下:

代码请加Q2034196302获取
代码请加Q2034196302获取
代码请加Q2034196302获取

运行结果截图如下

猜你喜欢

转载自blog.csdn.net/opencv_source/article/details/78863822