资源下载地址: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 算子实现,上次实验中自己写边缘检测的时候已经用过了一次,稍加改写即可。
需要注意掩膜与原图像之间的关系,先对原图像进行一次行和列的扩展,尽量减少在 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