这个例子展示了如何使用边缘检测作为角点检测的第一步。该算法适用于fpga。
角点检测用于计算机视觉系统中寻找图像的特征。它通常是运动检测、跟踪、图像配准和目标识别等应用程序的第一步。
角直观地定义为两条边的交点。这个例子使用了Harris & Stephens算法[1],该算法使用Harris矩阵特征值的近似来简化计算。对于fpga的另一种角点检测算法,请参见快速角点检测的例子。
这个示例模型提供了一个硬件兼容的算法。您可以使用Xilinx™Zynq™参考设计在板上实现此算法。看到基于zynq硬件的角点检测和图像叠加(基于Xilinx zynq硬件的Vis金宝appion 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)
DataTypeMode: Fixed-point: binary point scaling signed: Unsigned WordLength: 18 FractionLength: 21 . DataTypeMode: Fixed-point: binary point scaling . signed: Unsigned WordLength: 18
你可以看到模拟得到的图像非常相似,但并不完全相同。仿真结果的微小差异是由于行为模型采用C整数算法规则,量化与hdl ready角点检测块不同。
使用Simu金宝applink,您可以理解这些差异,并决定应用程序是否允许这些错误。如果不能接受,可以增加操作符的位宽,尽管这会增加FPGA中使用的面积。
要检查和生成本例中引用的HDL代码,您必须具有HDL Coder™许可证。
要生成HDL代码,请使用以下命令。
makehdl (“CornerDetectionHDL / HDL角落算法”)
要生成测试工作台,请使用以下命令。注意,由于数据量大,测试台生成需要很长时间。您可能希望在生成测试台之前减少模拟时间。
makehdltb (“CornerDetectionHDL / HDL角落算法”)
该模型中可以在FPGA上实现的部分是帧到像素和像素到帧块之间的部分。这个子系统叫做HDL角点算法,它包含了上面提到的角点检测算法的所有元素。模型的其余部分,包括行为角算法和源和汇,形成了我们的Simulink测试平台。金宝app
Harris & Stephens算法是基于如上所示的Harris矩阵特征值的逼近。哈里斯算法使用作为一个度规,避免任何除法或平方根运算。另一种进行角点检测的方法是计算实际的特征值。
一个2x2矩阵的特征值的解析解是众所周知的,也可以用于角点检测。当特征值在相同尺度下都为正且较大时,就会发现一个角。
用在我们的值我们得到:
对于FPGA实现来说,注意到的重复值是很重要的.我们可以计算这个值一次,然后平方并与之结合.这意味着特征值算法只需要两个乘数,但代价是更多的加法器和减法器以及一个平方根函数,它本身需要几个乘数。
然后,您必须将两个特征值与一个常数值进行比较,以确保它们很大。由于特征值会随着图像强度的增大而增大,因此还需要确保它们的大小都是相同的。您可以通过用一个减去另一个,并确保结果小于某个预定义的阈值来实现这一点。注意,在这个减法中,第一项约掉了,剩下:
你可以重新排列它,使它非常类似于哈里斯度规上图:
将矩阵展开如下:
特征值的差与哈里斯值之间的相似性度规显示了哈里斯近似是如何工作的。如果你重新安排平方根下的项并交换符号,那么结果一定大于或等于一个预定义的阈值,你就得到了哈里斯度规。
C. Harris和M. Stephens(1988)。“一个角和边缘的组合检测器”。第四届Alvey Vision会议论文集。147 - 151页。