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