基于C++OpenCV实现的Harris角点特征检测

资源下载地址:https://download.csdn.net/download/sheziqiong/85627241

实验内容和要求

读入摄像头,可以实时回放视频。键盘交互,空格键暂停,并对当前帧图像做一次 Harris Corner 检测,并将检测的结果叠加在原图上。

  • Harris Corner 算法自己实现。
  • 显示中间结果与最终结果,并保存:最大特征值图,最小特征值图,R 图,彩色 R 图,原图上叠加结果等。

实验器材

C++ OpenCV 4.5.0

开发平台:Visual Studio 2019 Debug x64

具体实现

3.1 摄像头读取

摄像头读取利用 OpenCV 的 VideoCapture 类,初始化一个默认对象 capture(0) 即可调用系统摄像头。设置 delay 为 30ms,用 waitkey()函数来判断键盘交互。

在这里插入图片描述

3.2 Harris Corner 检测算法实现

Harris Corner 算法在一个窗内计算期望 E(x,y)。对于期望大于某个阈值的点,可以被视作角点。公式如下:

在这里插入图片描述

其中选择 w(x,y)窗函数为高斯函数。对于很小的 u、v 移动,可以近似将这个期望写作线性方程:

梯度计算(Ix、Iy)

梯度计算利用 Sobel 算子实现,上次实验中自己写边缘检测的时候已经用过了一次,稍加改写即可。

扫描二维码关注公众号,回复: 14267489 查看本文章

需要注意掩膜与原图像之间的关系,先对原图像进行一次行和列的扩展,尽量减少在 Sobel 滤波过程中的损失。扩展过程中保存原图像在中间部分,赋值上下左右最边缘的像素到外围。

在这里插入图片描述

对扩展图像分别用 SobelX 和 SobleY 算子卷积,得到 Ix 和 Iy,即原图在 x 和 y 方向上的梯度。

定义像素点矩阵 M

M的定义如下:

在这里插入图片描述

根据公式计算即可。

在这里插入图片描述

计算每个像素的角点响应,即 R 值响应值

R 的公式如下:

构建两个特征值图 Max_lambda 和 Min_lambda,用相应的λ来绘制。

在这里插入图片描述

非极大值抑制与可视化

构建 R 图后,在一个限定的窗口内,只取最大且大于阈值的点。设置 windowSize 为 30,对大于阈值且大于记录的域内最大值的点进行记录,否则就重置为 0。由于 windowSize 的大小,需要特别做边缘处理,否则会在最右一列和最下一行以及右下角出现大量的检测点。

最后遍历 R 图,根据 R 图的检测结果来显示角点。

实验结果与分析

使用课件中的样图进行测试,经调试与修改结果基本符合预期。

实时调用摄像头,可以对人脸与环境的特征点进行检测。

效果基本符合预期。中间输出的最大最小特征值图与 R 图储存在 result 文件夹里。可以看出最大特征值图基本勾勒出图像的边缘,最小特征值图已经能够对 corner 点有基本的描绘。

心得与体会

这次实验总体比较顺利,顺便对于 Release 格式下的发布做了一些实验。对于 R 图的绘制和彩色 R 图的绘制还有一些问题,现在的彩色 R 图比较难看,不是很了解课件中的彩色图是如何调整通道值画出来的。

下来也会考虑 Harris-Laplace,可以更加灵活地设置 kernel 的大小并对各种形态和大小的图片做检测。

资源下载地址:https://download.csdn.net/download/sheziqiong/85627241

猜你喜欢

转载自blog.csdn.net/newlw/article/details/125257242