Harris角点检测
这个例子展示了如何使用边缘检测作为角落检测的第一步。该算法适用于fpga。
角点检测在计算机视觉系统中用于发现图像中的特征。它通常是运动检测、跟踪、图像配准和目标识别等应用程序的第一步。
角直观地定义为两条边的交点。本例使用Harris & Stephens算法[1],其中计算使用Harris矩阵特征值的近似来简化。关于fpga的另一个角落检测算法,请参见快速角点检测的例子。
该示例模型提供了一种硬件兼容的算法。您可以使用Xilinx™Zynq™参考设计在板上实现此算法。看到基于zynq硬件的角落检测和图像覆盖(Xilinx zynq硬件的Vision HDL工具箱支持包).
简介
的CornerDetectionHDL.slx系统如下所示。HDL角点算法子系统包含一个角点检测器块方法参数设置为哈里斯
.
第一步:找到渐变
Harris算法的第一步是找到图像中的边缘。角检测器块使用两个带有系数的梯度图像滤波器而且产生渐变而且.平方和交叉相乘形成,而且.
第二步:循环过滤
算法的第二步是对均值进行高斯滤波,而且在一个圆形的窗户上。圆形窗口的大小决定了检测到的角的尺度。该块使用5x5窗口。对于三个组件,块使用三个具有相同过滤系数的过滤器。
最后一步:形成哈里斯矩阵
算法的最后一步是估计Harris矩阵的特征值。哈里斯矩阵是一个类似于协方差矩阵的对称矩阵。主对角线由梯度的两个平均值的平方组成而且.非对角元素是梯度叉乘的平均值.哈里斯矩阵是:
根据哈里斯矩阵计算响应
Harris算法简化的关键是将Harris矩阵的特征值估计为行列式减去缩放迹的平方。
在哪里是一个常数,通常为0.04。
角度规响应,,用梯度表示为:
当响应大于预定义的阈值时,检测到拐角处:
定点设置
从输入图像到输出角度响应的整体函数是一个四阶多项式。这就导致了为计算的每一步确定定点缩放的一些挑战。由于我们的目标是具有内置乘数的fpga,所以最好的策略是允许比特增长,直到达到乘数大小,然后开始有选择地量化结果,使其保持在所提供的乘数的范围内。
输入像素流为8位灰度像素数据。计算梯度不会增加太多比特增长,因为滤波器核只有+1和-1系数。结果是一个全精度9位有符号定点类型。
梯度的平方和交叉相乘产生带符号的18位结果,仍然具有完全的精度。许多常见的FPGA乘法器都有18位或20位的输入字长,因此您必须在下一步进行量化。
下一步是使用三个具有高斯系数的图像过滤器对三个组件应用一个圆形窗口。系数被量化为18位无符号数,以适应FPGA乘法器。为了找到系数的最佳分数精度,使用fi()函数创建一个定点数,但只指定字长。在这种情况下,21位的分数比例是最好的,因为系数矩阵中的最大值在1/8到1/16之间。
多项式系数= fi (fspecial (“高斯”, 5个,5个,1.5),0,18)
coeffs = 0.0144 0.0281 0.0547 0.0683 0.0547 0.0281 0.0351 0.0683 0.0853 0.0683 0.0351 0.0281 0.0547 0.0683 0.0547 0.0281 0.0144 0.0281 0.0281 0.0281 0.0281 0.0351 0.0281 0.0144 DataTypeMode: Fixed-point: Fixed-point: binary point scaling signness: Unsigned WordLength: 18 FractionLength: 21
模拟结果
您可以看到模拟得到的图像非常相似,但并不完全相同。仿真结果差异较小的原因是行为模型采用C整数算术规则,量化与HDL-ready角点检测块不同。
使用Simulink,您可以理解这些差异,并决定您的应用程序是否允许这些错误。如果它们不可接受,您可以增加运算符的位宽,尽管这会增加FPGA中使用的区域。
HDL代码生成
要检查和生成本例中引用的HDL代码,您必须拥有HDL Coder™许可证。
要生成HDL代码,使用以下命令。
makehdl (“CornerDetectionHDL / HDL角落算法”)
要生成测试工作台,使用以下命令。注意,由于数据量大,生成测试台架需要很长时间。您可能希望在生成测试台架之前减少模拟时间。
makehdltb (“CornerDetectionHDL / HDL角落算法”)
您可以在FPGA上实现的这个模型的部分是帧到像素和像素到帧块之间的部分。这就是被称为HDL角算法的子系统,它包括上面看到的角检测算法的所有元素。模型的其余部分,包括行为角算法和源和汇,形成了我们的Simulink测试台架。
要进一步
Harris & Stephens算法是基于逼近上面所示的Harris矩阵的特征值。哈里斯算法使用了作为一个度量,避免任何除法或平方根运算。另一种角检测的方法是计算实际的特征值。
2x2矩阵特征值的解析解是众所周知的,也可以用于角点检测。当特征值在相同尺度下均为正且较大时,发现了一个角。
用在我们的值我们得到:
对于FPGA实现,重要的是要注意的重复值.我们可以计算这个值一次,然后平方结合.这意味着特征值算法只需要两个乘数,但要牺牲更多的加数和减数器,以及一个平方根函数,而平方根函数本身需要几个乘数。
然后,您必须将两个特征值与一个常数值进行比较,以确保它们较大。由于特征值随着图像强度的增大而增大,您还需要确保它们都在相同的大小附近。您可以通过减法来做到这一点,并确保结果小于某个预定义的阈值。注意,在这个减法中,第一项消去了,剩下:
你可以重新排列它使它与哈里斯度规非常相似上图:
将矩阵展开得到:
特征值的差和哈里斯值之间的相似性度规显示了哈里斯近似是如何工作的。如果您重新排列平方根下的项并交换符号,那么结果必须大于或等于预先定义的阈值,就会得到具有一定比例的哈里斯度规。
参考文献
C.哈里斯和M.斯蒂芬斯(1988)。“角和边缘的组合探测器”。第四届阿尔维视觉会议论文集。147 - 151页。