#图像处理_OpenCV# Harris角点检测原理及C++实现

本文介绍了Harris角点检测的基本概念、判断依据、数学推导和计算方法,并详细阐述了使用OpenCV进行C++实现的步骤,包括梯度计算、高斯滤波、特征值判断和非极大值抑制等关键环节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.Harris角点
1.1基本定义
首先,什么是角点,角点是指一个边缘轮廓的一角。角点可以在一个物体的边缘处,但是边缘不同于角点,简单来说角点就是同时是边缘和角的点。
1.2判断依据
计算机完成角点检测是通过一个小窗口逐步扫描过去来完成的,在移动过程中的灰度的变换则作为判断角点的依据:
①.当检测窗口移动时,灰度几乎没有发生变化 ->认为是“平整地带”;
②.当检测窗口移动时,灰度只在一个方向上发生突变 ->认为是“边缘地带”;
③.当检测窗口移动时,灰度在各个方向上均发生突变 ->认为是“角点地带”;
1.3数学推导
在这里插入图片描述
E(u,v)具体含义我也不知道,可以理解为沿着某个方向的变化大小的期望,配合之前的解释,沿着多个方向若灰度变化都很大则定义为角点。
化成矩阵的形式后记 M2 = [A, C; C, B]
A 是 图像在x方向上的二次偏导数;
B 是 图像在y方向上的二次偏导数;
C 是 图像在xy方向上的梯度乘积;
为了求A , C ,B我们需要首先计算两个方向上的梯度;梯度的计算表可以用sobel算子等相关算子进行计算。
这里需要注意的一点是,为了将中心像素对周围像素的影像考虑进来,对于求得的M2矩阵进行高斯滤波可以改善,最终得到M矩阵。
在这里插入图片描述
在这里插入图片描述
对于M矩阵特征值的判断来得出结论如下,
图像中的直线:一个特征值大,另一个特征值小,λ1≫λ2或λ2≫λ1。自相关函数值在某一方向上大,在其他方向上小。
图像中的平面:两个特征值都小,且近似相等;自相关函数数值在各个方向上都小。
图像中的角点:两个特征值都大,且近似相等,自相关函数在所有方向都增大。

1.4计算方法
得到的矩阵M并不需要直接去判断他的特征值,harris算法找到了一个更为简单的判断方式,那就是R; R = detM - k(trace(M))^2
其中:
det M = λ1λ2=A * C−B^2;
trace M = λ2 + λ2 = A + C;
k 取0.04-0.06;

角点处R为大数值正数;边缘处R为大数值复数;平坦区处R绝对值是小数值。

1.5 算法实现步骤
1.利用Soble或其他方式计算出XY方向的梯度值
2.计算出二阶偏导与梯度乘积
3.利用高斯函数对M矩阵进行滤波
4.计算局部特征结果矩阵M的特征值和响应函数R = det(M)-k(trace(M))^2 (0.04<=k<=0.06)
5.将计算出响应函数的值C进行非极大值抑制,滤除一些不是角点的点,同时要满足大于设定的阈值

2程序清单

2.1内部库函数学习
①、滑块拖动函数

    createTrackbar("Threshold", output_title, &thresh, max_count, Harris_Demo);
    Harris_Demo(0,0);

参数1:滑块名称;
参数2:滑块所在的窗口名称;
参数3:滑块改变的变量名称,注意要加 ’&‘,同样表示初始值大小;
参数4:滑块终点数字大小;
参数5:滑块操作的子函数名称,且下一行需要调用这个函数;

②、harris角点检测函数

cornerHarris(img_gray, dst, blockSize, ksize, k, BORDER_DEFAULT);

参数1:原始图像,必须是灰度;
参数2:操作后返回的图像;
参数3:blockSize特征值计算矩阵的维数 一般是2;
参数4:ksize平移扫过图像的矩阵块;
参数5:表示对图像边缘的处理,这里直接BORDER_DEFAULT表示默认;

③、像素大小标准化函数

//此处只使用了最大值最小值的标准化模式
normalize(dst, norm_dst, 0, 255, NORM_MINMAX, CV_32FC1
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值