主要内容

快速角点检测

这个例子展示了如何使用特征加速分割测试(FAST)算法进行角点检测。该算法适用于fpga。

角点检测用于计算机视觉系统中寻找图像的特征。它通常是运动检测、跟踪、图像配准和目标识别等应用程序的第一步。

FAST算法通过测试转角潜在中心周围的圆形区域来确定转角是否存在。如果连续的部分像素比中心加一个阈值亮或比中心减一个阈值暗,测试就会检测到一个角。对于fpga的另一种角点检测算法,请参见Harris角点检测的例子。

在一个软件实现中,FAST算法允许快速测试,只沿着轴测试四个像素,以排除潜在的角。如果快速测试通过,软件算法只执行完整测试。硬件实现可以很容易地并行执行所有测试,因此快速测试不是特别有利,本例中也没有包含。

FAST算法可以用于许多大小或规模。这个例子使用一个16像素的圆来检测角。在这16个像素中,如果任意9个连续像素满足亮或暗的限制,则检测到一个角。

MATLAB快速角点检测

计算机视觉系统工具箱™中包含一个软件FAST角点检测算法detectFASTFeatures函数。本例使用此函数作为行为模型,与Simulink®中硬件的FAST算法设计进行比较。金宝app该功能具有设置最小对比度和最小质量的参数。

最小对比度参数是在中心像素值与像素环进行比较之前加或减的阈值。

检测到的角的最小质量参数控制是“强”到足以被标记为实际角。原FAST文章中的强度度量是基于圆形区域像素与中心像素[2]的差值之和。该算法的后续版本使用了不同的强度度量,基于像素值的最小变化,这将使检测不再是一个角。detectFastFeatures使用最小变化度规。

这段代码读取第一帧视频,将其转换为灰度,然后调用detectFASTFeatures.结果是一个角位置向量。若要显示角点位置,请使用矢量在输出帧的角点像素上绘制亮绿色圆点。

v = VideoReader (“rhinos.avi”);我= rgb2gray (readFrame (v));%创建输出RGB帧Y = repmat(I,[1 1 3]);角落= detectFASTFeatures(我“minContrast”, 15/255,“minQuality”, 1/255);loc = corners.Location;2 = 1:尺寸(loc, 1) Y(地板(loc(2, 2)),地板(loc) (2, 1), 2) = 255;%绿点结束imshow (Y)

FAST算法的局限性

其他角点检测方法的工作方式与FAST方法非常不同,一个令人惊讶的结果是,FAST不检测计算机生成的图像上的角点,完全对齐xy轴。由于检测到的角必须有一个较暗或较亮的像素值环围绕中心,包括角的两个边缘,清晰的图像不能很好地工作。例如,在Harris中使用的输入图像上尝试FAST算法Harris角点检测的例子。

我= imread (“cornerboxes.png”);Ig = rgb2gray(我);角落= detectFASTFeatures(搞笑,“minContrast”, 15/255,“minQuality”, 1/255)
角= 0x1角点数组的属性:位置:[0x2单]度量:[0x1单]计数:0

可以看到函数检测到零角。这是因为FAST算法需要一个大于圆心一半的对比像素环。在计算机生成的图像中,一个角落的盒子的两条边都在所使用的像素环中,因此对一个角落的测试失败。一个解决这个问题的方法是在图像上添加模糊(通过应用高斯滤波器),这样角落就不那么精确了,但是可以被检测到。在模糊之后,FAST算法现在可以检测到超过100个角。

h = fspecial (“高斯”5);Ig = imfilter(搞笑,h);角落= detectFASTFeatures(搞笑,“minContrast”, 15/255,“minQuality”,1/255) locs = corners.Location;2 = 1:尺寸(loc, 1)我(地板(loc(2, 2)),地板(loc) (2, 1), 2) = 255;%绿点结束imshow(我)
角= 136x1角点数组的属性:位置:[136x2 single]度量:[136x1 single]数量:136

验证行为模型

Simu金宝applink模型使用detectFASTFeatures作为行为模型来验证硬件算法的结果。你可以在Simulink中使用MATLAB函数块来运行MATLAB代码。金宝app

modelname =“FASTCornerHDL”;open_system (modelname);set_param (modelname“SampleTimeColors”“上”);set_param (modelname“SimulationCommand”“更新”);set_param (modelname“开放”“上”);集(allchild (0)“可见”“关闭”);

MATLAB函数块中的代码必须要么生成C代码,要么在外部声明。一个外部声明允许指定的函数在MATLAB中运行,而MATLAB函数块的其余部分在Simulink中运行。金宝app的detectFASTFeatures函数不支持代码生成,因此MATLAB金宝app函数块必须使用一个外部辅助函数。

为了逐帧视觉比较,以及改变对比度参数的能力,helper函数将输入图像和最小对比度作为输入。它返回带有绿色圆点的输出图像,标记检测到的角。

函数Y = FASTHelper(I,minContrast);角落= detectFASTFeatures(我(:,:1),“minContrast”、双(minContrast) / 255,“minQuality”, 1/255);loc = corners.Location;2 = 1:尺寸(loc, 1) Y(地板(loc(2, 2)),地板(loc) (2, 1), 2) = 255;%绿点结束结束

MATLAB函数块必须定义输出数组的大小。定义输出大小的一种快速方法是在调用helper函数之前将输入复制到输出。这是MATLAB函数块中的代码:

函数Y = fcn(I,minContrast) code .extrinsic(“FASTHelper”);Y =我;Y = FASTHelper(我minContrast);结束

实现高密度脂蛋白

该模型中Vision HDL工具箱角落检测器块中实现的FAST算法测试一个16像素环中的9个连续像素,并将它们的值与中心像素值进行比较。一个内核的7 x7每个测试像素周围的像素包括16像素环。图表显示了用于测试的中心像素和围绕它的16个像素环。从上到中顺时针方向的环形像素是

指数= [22 29 37 45 46 47 41 35 28 21 13 5 4 3 9 15];

这些像素指数用于选择和比较。顺序必须是连续的,但是环可以从任何一点开始。

该算法利用这些像素环计算角点度量后,确定每个区域的最大角点度量,并抑制其他检测到的角点。然后,模型将未抑制的角标记覆盖到原始输入图像上。

硬件算法在fastthdlalgorithm子系统中。这个子系统支持HDL代码生成。金宝app

open_system ([modelname' / FASTHDLAlgorithm '],“力”);

检测角点

为了确定角落的存在,寻找所有可能的9像素连续的环的值大于或小于阈值的段。

在硬件中,您可以并行地执行所有这些比较。每个比较器块扩展到16个比较器。块的输出是16个二进制决定,代表环的每一段。

非最大抑制

FAST算法识别了许多潜在的角。为了减少后续处理,可以去除或抑制特定区域中除角度最大的角外的所有角。针对非最大抑制的算法有很多,适合于软件实现,但适合于硬件实现的算法很少。在软件中,使用了基于梯度的方法,这在硬件中可能是资源密集型的。在这个模型中,一个简单但非常有效的技术是比较a5 x5内核并产生一个布尔结果。如果内核中心的角度量值大于零(即它是一个角),并且它也是所有其他角度量值的最大值,则布尔输出为真5 x5地区。大于零的条件匹配设置minQuality1detectFASTFeatures函数。

由于像素流的处理是从左到右,从上到下,结果包含一些方向性影响,如检测到的角并不总是与目标完全对齐。NonMaxSuppress子系统包括一个常量块,允许您禁用抑制并可视化完整的结果。

open_system ([modelname“/ FASTHDLAlgorithm / NonMaxSuppress”],“力”);

对齐和覆盖

在NonMaxSuppress子系统的输出中,像素流包括每个5x5区域中最强角落的标记。接下来,模型使用像素流对齐块将检测到的角与原始像素流重新对齐。在原始流和标记按时间对齐后,模型在角上覆盖一个绿色点。覆盖子系统包含一个alpha混频器,包含用于颜色和alpha值的常量。

输出查看器显示被检测到的角的覆盖的绿色圆点。行为视频查看器显示的输出detectFastFeatures函数,HDL视频查看器显示HDL算法的输出。

要进一步

非最大抑制算法可以通过遵循梯度和使用多通道策略进行改进,但这也会占用更多的硬件资源。

结论

这个例子展示了如何开始使用detectFASTFeatures在MATLAB中,然后转到Simulink进行FPGA金宝app部分的设计。角点检测模块的硬件算法包括对核中中心像素周围的环的测试和角点强度度量。该模型使用非最大抑制函数去除所有最强的检测角。然后设计将角位置叠加到原始视频输入上,用绿色突出角。

参考文献

E. Rosten和T. Drummond。“融合点和线的高性能跟踪”,IEEE计算机视觉国际会议论文集,第2卷(2005年10月):1508-1511页。

E. Rosten和T. Drummond。“高速角点检测的机器学习”,计算机视觉- ECCV 2006 Lecture Notes of Computer Science, 2006, 430-43。doi: 10.1007 / 11744023 _34。