主要内容

壶穴检测

这个例子扩展了使用双边滤波生成卡通图像示例包括计算质心和在检测到的凹坑上覆盖质心标记和文本标签。

道路危险或坑洞检测是任何自动驾驶系统的重要组成部分。之前[1]在自动路面凹坑检测上的工作将凹坑定义为路面上的一个椭圆形区域,其亮度级别较暗,纹理与周围路面不同。利用图像处理检测坑洞的任务是在路面图像中找到符合所选标准的区域。你可以使用任何或所有的椭圆形状,较暗的亮度或纹理标准。

要测量椭圆形状,可以使用霍夫圆等投票算法,或模板匹配算法,或基于线性代数的方法,如最小二乘拟合。在图像处理中,通过选择一个亮度分割值来测量亮度水平是一种简单的方法。纹理可以通过使用FFT等技术计算区域的空间频率来评估。

这个例子使用一个面积度量的亮度分割,这样较小的缺陷不会被检测到。为了找到缺陷的中心,本设计计算了质心。模型在缺陷的中心覆盖一个标记,并在图像上覆盖一个文本标签。

介绍

PotHoleHDLDetector.slx系统如下所示。pothololhdl子系统包含坑洞检测器和覆盖算法,并支持HDL代码生成。金宝app有四个输入参数控制算法。ProcessorBehavioral子系统将字符映射写入RAM中作为叠加标签使用。

modelname =“洞穴探测器”;open_system (modelname);set_param (modelname“SampleTimeColors”“上”);set_param (modelname“SimulationCommand”“更新”);set_param (modelname“开放”“上”);集(allchild (0)“可见”“关闭”);

FPGA子系统概述

pothololhdl子系统将RGB输入视频转换为强度,然后进行双边滤波和边缘检测。梯形掩模子系统选择巷道区域。然后,该设计应用形态关闭,并计算所有潜在的凹坑的质心坐标。检测器在每一帧中选择最大的凹坑并保存中心坐标。像素流对齐器将坐标的时间与输入流匹配。最后,Fiducial31x31和Overlay32x32子系统在框架上应用alpha通道覆盖,添加凹坑中心标记和文本标签。

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

输入参数值

子系统有四个可以在系统运行时更改的输入参数。

梯度强度参数,梯度阈值,控制算法的边缘检测部分。

Cartoon RGB参数改变覆盖层的颜色,即基准标记和文本。

区域阈值参数设置检测窗口中标记像素的最小数量,以便将其分类为凹坑。如果该值过低,则会检测到线形裂缝和其他不属于道路危害的缺陷。如果它太高,那么只有最大的危险才会被检测到。

最后一个参数Show Raw允许您更容易地调试系统。它在RGB输入视频和检测器看到的二值图像之间切换绘制覆盖的显示图像。将此参数设置为1,查看探测器工作情况。

如果只允许在视频帧边界上更改,那么所有这些参数都能发挥最佳效果。FrameBoundary子系统只在帧的有效开始时注册参数。

open_system ([modelname“/ PotHoleHDL / FrameBoundary”],“力”);

RGB,强度

该模型分割输入的RGB像素流,以便RGB流的副本继续朝向覆盖块。探测器的第一步是将RGB转换为强度。由于RGB的输入数据类型为uint8, RGB到强度块自动选择uint8作为输出数据类型。

双边滤波器

该算法的下一步是降低高视觉频率噪声和更小的道路缺陷。有许多方法可以实现这一点,但使用双边滤波器具有在减少噪声和更小的区域的同时保留边缘的优点。

双边滤波器块具有邻域大小和两个标准差的参数,一个用于滤波器的空间部分,一个用于滤波器的强度部分。对于这个应用程序,一个相对较大的9x9区域就可以了。该模型使用3和0.75作为标准差。您可以稍后使用这些值进行试验。

Sobel边缘检测

然后将过滤后的图像发送给Sobel边缘检测块,该块找到图像中的边缘,并返回那些比梯度阈值参数更强的边缘。输出是一个二值图像。在最后的应用程序中,可以根据道路状况、天气、图像亮度等变量设置这个阈值。对于这个模型,阈值是pothololhdl子系统的输入参数。

梯形的面具

从二值边缘图像中,您需要删除任何与凹坑检测无关的边缘。一个好的策略是使用蒙版,选择一个感兴趣的多边形区域,并使该区域之外的黑色。该模型不使用正常的ROI块,因为那样会删除稍后用于质心计算和标记所需的位置上下文。

操作的顺序在这里也很重要,因为如果在边缘检测之前使用掩码,掩码的边缘将变成强线,这将导致检测器的误报。

在输入视频中,车辆可能遇到凹坑的区域被限制在其正前方的道路和前方的梯形段道路上。精确的坐标取决于相机的安装和镜头。本例对区域的左侧上角、右侧上角、左侧下角和右侧下角使用固定坐标。在这个视频中,梯形区域的顶部和底部不是平行的所以这不是一个真正的梯形。

面具由角之间的直线组成,连接左、右和上、下。

——rtc / \ / \ lbc-------------rbc

这个示例使用polyfit以确定从角到角的直线拟合。为了易于实现,设计调用polyfit以垂直方向为自变量。这种用法可以计算x = f (y)而不是更平常的y = f (x).使用polyfit这种方式允许您使用y方向的行计数器作为查找表的输入地址,该查找表包含每一行感兴趣的区域的起始(左)和结束(右)的x坐标。

查询表通常是在FPGA中的BRAM中实现的,因此应该使用基于0的寻址。该模型将基于MATLAB 1的寻址转换为仅在lut之前的基于0的寻址。为了进一步减小查找表的大小,该地址被梯形的起始行偏移。为了得到较好的综合结果,在fpga中使用查找表后的寄存器匹配典型块RAM寄存器。这个寄存器还在设计中添加了一些适度的流水线操作。

对于320x180映像:

光栅= [320180];LTC = [155,66];LBC = [1,140];RTC = [155,66];加拿大皇家银行= [285179];%适合于x = f(y)方便的LUT索引abl = polyfit ([lbc (2) ltc(2)]、[lbc (1) ltc (1)), 1);%左abr=polyfit([rbc(2),rtc(2)],[rbc(1),rtc(1)],1);%的右边leftxstart=max(1,圆形)(ltc(2):rbc(2))*abl(1)+abl(2));rightxend=min(光栅(1),圆形((ltc(2):rbc(2))*abr(1)+abr(2));startline=min(ltc(2),rtc(2));终点线=最大值(lbc(2),rbc(2));%基于零的正确寻址Leftxstart = Leftxstart - 1;Rightxend = Rightxend - 1;Startline = Startline - 1;Endline = Endline - 1;open_system ([modelname“/PotHoleHDL/梯形图”],“力”);

形态学关闭

接下来的设计使用形态学关闭块来删除或关闭小特征。关闭工作首先做膨胀,然后侵蚀,并帮助删除小特征,不太可能是坑。指定块掩码上的邻域,该邻域决定要删除的特征的大小。这个模型使用了一个5x5的邻域,类似于一个磁盘,这样小的特征就被封闭起来了。

重心

质心计算找到活动区域的中心。设计在每个31x31像素区域连续计算标记区域的质心。它只存储检测区域大于输入参数时的中心坐标。这是硬件和软件系统之间的一个共同区别:在为fpga设计硬件时,通常更容易连续计算,但只在需要时存储答案,而不是在软件中根据需要调用函数。

质心计算,你需要计算区域图像的三件事:像素的加权和在水平方向,垂直方向的加权和,和整体的和对应的所有像素的面积显著的部分地区。Line Buffer选择31x31像素的区域,每次返回一列。该算法使用列来计算垂直权重和总权重。对于水平权重,设计组合列以获得31x31的内核。您可以根据您想要的“中心”的含义来选择权重。这个示例使用15:15所以31x31区域的中心是(0,0)在计算结果中。

当输出无效时,Vision HDL工具箱块强制输出数据为零,如pixelcontrol总线输出所示。虽然不是严格要求,但这种行为使测试和调试更加容易。为了实现质心结果的这种行为,模型使用Switch块,并将Constant块设置为0。

由于希望检测区域的中心相对于整个图像坐标系,请将水平和垂直像素计数添加到计算的质心。

open_system ([modelname“/PotHoleHDL/Centroid31”],“力”);

open_system ([modelname“/PotHoleHDL/Centroid31/CentroidKernel”],“力”);

检测并保存

检测器作用于从质心开始的总面积和。检测器本身很简单:将质心面积值与阈值参数进行比较,找出大于阈值的最大面积。模型逻辑将存储的区域值与当前区域值进行比较,并在输入大于当前存储值时存储一个新区域。通过使用>>=您可以选择超过阈值的时间最早的值或超过阈值的时间最近的值。模型存储最新的值,因为后面的值更接近相机和车辆。当检测器存储一个新的获胜区域值时,它还会更新对应于该区域的X和Y质心值。然后将这些坐标传递给子系统的对齐和覆盖部分。

要将X、Y和有效指示传递给对齐算法,请将值打包到一个23位的单词中。一旦它们与用于叠加的输入帧及时对齐,模型就会将它们解压缩。

open_system ([modelname“/ PotHoleHDL / DetectAndHold”],“力”);

像素流对准器

像素流对齐块从检测器获取流信息并将其和原始RGB像素流发送到覆盖子系统。对齐器补偿由检测算法的所有前面部分所增加的处理延迟,而不需要知道任何关于这些块的延迟。如果稍后更改邻域大小或添加更多处理,对准器可以进行补偿。如果总延迟超过最大行数参数,请调整参数。

基准的叠加

基准标记是一个方形十字线,表示为31位定点数字的31元素数组。这种表示法很方便,因为一次读取会返回每行覆盖像素的整个字。

该图通过将定点数据转换为二进制显示了覆盖模式。这个图案可以是任何你想要的31x31尺寸。

负载fiducialROM31x31.mat十字=本(fiducialROM);十字丝(十字= =' 0 ') =' '将'0'改为空格,以便更好地显示
十字= 31 x31 char数组' 1 ' ' 1 ' ' 1 ' ' 1 '“11111111111111111111111”“1 1 1”“1 1 1”“1 1 1”“1 1 1”“1 1 1”“1 1 1”“1 1 1”“1 1”“1 1”“1 1”“111111111111 111111111111”“1 1”“1 1”“1 1”“1 1 1”“1 1 1”“1 1 1”“1 1 1”“1 1 1”“1 1”的1 1 1 ' 11111111111111111111111 ' ' 1 ' ' 1 ' ' 1 ' ' 1 '

基准叠加子系统有一个水平和垂直计数器,其中有一组四个比较器,比较器使用被检测区域的中心作为区域的中心作为标记。标记数据被用作开启alpha通道覆盖的二进制开关。alpha值是一个固定的透明参数,在ExpandData子系统中,当二进制Detect信号被解包时,它作为增益应用于该信号。

open_system ([modelname“/PotHoleHDL/Fiducial31x31”],“力”);

字符叠加

用于屏幕显示的字符字体ROM以类似于上述基准ROM的方式存储数据。每个16位定点数字表示16个连续的水平像素。字符映射为16x16。

由于字符数据通常是由CPU以ASCII格式写入的,所以最简单的方法是将字符数据以8位ASCII地址存储在双端口RAM中。字体ROM存储ASCII字符33(“!”)到122(“z”)。该设计使地址偏移33。

字体ROM是由公共领域的固定宽度字体构建的,经过几次编辑以提高可读性。在基准标记中,字符ROM数据被用作开启alpha通道覆盖的二进制开关。字符alpha值是一个固定的透明度参数,在ExpandData子系统中,当Detect信号被解包时,它作为增益应用于该信号。

将字符形象化B在字体ROM中,以二进制显示它。

负载charROM16x16.matletterB =本(charROM16x16 (529:544));%字符数组letterB (letterB = =' 0 ')=' '%删除'0'字符以更好地显示
letterB = 16 x16 char数组的“111111111”“11111111111”“111 111年的111 111年的111 111年的111 111年的“1111111111”“111111111”“111 111年的111 111年的111 111年的111 111年的111 1111年的“11111111111”“111111111”
open_system ([modelname“/ PotHoleHDL / Overlay32x32”],“力”);

查看探测器原始图像

当您处理复杂的算法时,查看处理过程中的中间步骤对调试和探索非常有帮助。在这个模型中,您可以设置布尔值显示原始参数至1 (真正的)显示二值图像的形态学闭合结果,并将检测结果叠加。为了转换使用8位RGB叠加的二进制图像,模型将二进制值乘以255,并在所有三个颜色通道上使用该值。

HDL代码生成

要检查和生成本例中引用的HDL代码,您必须具有HDL Coder™许可证。

要生成HDL代码,请使用以下命令。

makehdl (“PotHoleHDLDetector / PotHoleHDL”

要生成测试工作台,请使用以下命令。注意,由于数据量大,测试台生成需要很长时间。您可能希望在生成测试台之前减少模拟时间。

makehdltb (“PotHoleHDLDetector / PotHoleHDL”

该模型中可以在FPGA上实现的部分是帧到像素和像素到帧块之间的部分。这个子系统叫做pothololhdl,它包含检测器的所有元素。

在HDL模拟器中的仿真

现在有了HDL代码,就可以在HDL模拟器中模拟它了。自动生成的测试台允许您证明Simulink仿真和HDL仿真匹配。金宝app

FPGA的综合

还可以在FPGA合成工具(如Xilinx Vivado)中合成生成的HDL代码。在Virtex-7 FPGA (xc7v585tffg1157-1)中,该设计实现了超过150 MHz的时钟速率。

利用报告显示,双边滤波器、像素流对准器和质心函数消耗了本设计的大部分资源。双边滤波器需要最多的dsp。质心实现非常高效,只使用两个dsp。质心计算还需要一个对等的查找表,因此使用大量的lut作为内存。

要进一步

这个例子展示了一种检测凹坑的算法的可能实现。本设计可以通过以下方式进行扩展:

  • 梯度阈值可以用灰色世界模型从平均亮度计算。

  • 梯形遮罩块可以通过查看车辆车轮位置和调整线性适合的坡面遮罩,使“可操纵”。

  • 检测器可以通过查看相对于周围路面的RGB或强度图像的平均亮度,使其更加健壮,因为坑洞的强度通常比周围区域更暗。

  • 壶穴的视觉频率谱图也可用于寻找壶穴中特定类型的表面。

  • 可使用梯形道路区域的平均强度计算检测区域阈值。

  • 通过存储前N个响应而不是仅存储最大检测响应,可以在一帧中检测多个凹坑。基准标记子系统需要稍微重新设计,以允许重叠标记。

结论

该模型展示了如何在FPGA中实现坑洞检测算法。该检测器的许多有用部分可以在其他应用程序中重用,如质心块、基准块和字符覆盖块。

工具书类

[1]科赫,克里斯蒂安和伊阿尼斯·布里拉基斯。“沥青路面图像中的坑洞检测”。先进的工程信息2011年第3期第25期:507-15页。内政部:10.1016/j.aei.2011.01.002。

Omanovic, Samir, Emir Buza和Alvin Huseinovic。基于图像处理和光谱聚类的坑洞检测。第二届信息技术和计算机网络国际会议(ICTN’13),土耳其安塔利亚。2013年10月。