您的位置:首页 > 运维架构

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

2017-12-21 14:56 281 查看
本文转载自 http://opencv66.net/thread-41-1-1.html
角点的定义:

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

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

关于角点的具体描述还有以下几种:

一阶导数(即灰度的梯度)的局部最大所对应的像素点;

两条及两条以上边缘的交点;

图像中梯度值和梯度方向的变化速率都很高的点;

角点处的一阶导数最大,二阶导数为零,指示物体边缘变化不连续的方向。

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

moravec角点检测:
代码如下:
具体的代码请访问原帖查看,原帖链接  http://opencv66.net/thread-41-1-1.html

具体的代码请访问原帖查看,原帖链接  http://opencv66.net/thread-41-1-1.html

具体的代码请访问原帖查看,原帖链接  http://opencv66.net/thread-41-1-1.html

运行结果截图如下:



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:边界处理方法,具体的详见帖子http://opencv66.net/thread-26-1-1.html

这个函数在计算harris角点时,对于每一个像素点(x,y),计算2×2的梯度方差矩阵M^(x,y),计算时的邻域为blockSize×blockSize,然后通过下面的公式计算出角点。



使用cornerHarris函数进行harris角点检测的代码如下:
具体的代码请访问原帖查看,原帖链接  http://opencv66.net/thread-41-1-1.html

具体的代码请访问原帖查看,原帖链接  http://opencv66.net/thread-41-1-1.html

具体的代码请访问原帖查看,原帖链接  http://opencv66.net/thread-41-1-1.html

运行结果截图如下:





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角点检测的代码如下:
具体的代码请访问原帖查看,原帖链接  http://opencv66.net/thread-41-1-1.html

具体的代码请访问原帖查看,原帖链接  http://opencv66.net/thread-41-1-1.html

具体的代码请访问原帖查看,原帖链接  http://opencv66.net/thread-41-1-1.html

运行结果截图如下:





本文转载自 http://opencv66.net/thread-41-1-1.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: