主要内容

壶穴检测

这个例子扩展了使用双边滤波生成卡通形象例子包括计算质心和覆盖一个重心标记和文本标签检测到坑洞。

道路危险或壶穴检测任何自动驾驶系统的一个重要组成部分。以前的工作[1]在自动化的壶穴检测壶穴定义为一个椭圆区域的路面有较暗的亮度水平和不同的口感比周围的路面。检测凹坑使用图像处理的任务就变成了寻找地区路面的形象符合选择标准。您可以使用任何或所有的椭圆形,暗亮度或纹理标准。

测量椭圆形状可以使用投票算法如踝关节圆,或者模板匹配算法,线性algebra-based方法,如最小二乘匹配。测量亮度水平简单图像处理通过选择亮度细分值。纹理可以通过计算评估一个地区的空间频率使用技术,如FFT。

这个示例使用亮度分割面积指标,这样较小的缺陷不会检测到。为了找到缺陷的中心,这个设计计算质心。模型覆盖一个标志中心的缺陷和图像上叠加一个文本标签。

输入文件下载

下面的例子使用了potholes2。avi文件作为输入。大约50 MB的文件。从MathWorks网站和下载的文件解压下载的文件。

potholeZipFile = matlab.internal.examples.downloadSupportFile (“visionhdl”,“potholes2.zip”);[outputFolder, ~, ~] = fileparts (potholeZipFile);解压缩(potholeZipFile outputFolder);potholeVideoFile = fullfile (outputFolder,“potholes2”);目录(potholeVideoFile);

介绍

PotHoleHDLDetector.slx系统如下所示。PotHoleHDL子系统包含壶穴探测器和覆盖算法和支持HDL代码生成。有四个输入参数控制算法。ProcessorBehavioral子系统写入字符映射到内存用作覆盖标签。

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

FPGA子系统的概述

PotHoleHDL子系统将RGB输入视频转换为强度,然后执行双边滤波和边缘检测。TrapezoidalMask子系统选择道路区域。然后设计应用形态学关闭所有潜在的凹坑和计算质心坐标。探测器选择每一帧中最大的洞穴和保存中心坐标。像素流对准器匹配的时间坐标的输入流。最后,Fiducial31x31和Overlay32x32子系统应用α频道覆盖在框架上添加一个坑中心标记和一个文本标签。

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

输入参数值

子系统四个输入参数,可以改变系统运行时。

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

卡通RGB参数覆盖的颜色变化,也就是说,基准标记和文本。

面积阈值参数设置最小数量的标记在检测窗口中像素为了列为一个坑。如果这个值太低,那么线性裂纹和其它缺陷不会发现道路上的危险。如果它太高那只最大的危害将被检测到。

最后一个参数,显示原始,允许你更容易调试系统。切换显示的图像的RGB输入之间的覆盖是视频和探测器看到的二进制图像。将这个参数设置为1,看看探测器是有效的。

所有这些参数工作最好只允许更改视频帧边界。FrameBoundary子系统寄存器参数只在一个有效的帧的开始。

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

RGB,强度

模型将RGB输入像素流这一份RGB流持续向覆盖块。探测器的第一步是把从RGB到强度。由于RGB输入数据类型uint8,RGB亮度块自动选择uint8作为输出数据类型。

双边滤波器

该算法的下一步是减少高视觉频率噪音和较小的缺陷。有很多方法可以实现这但使用双边滤波器的优点是保留边缘,同时减少噪音和较小的地区。

附近的双边过滤块参数大小和两个标准差,一个用于空间滤波器的一部分,一个用于强度滤波器的一部分。对于这个应用程序一个相对较大的社区9 x9行之有效。这个模型使用3和0.75个标准差。以后你可以用这些值实验。

Sobel边缘检测

然后过滤图像发送到Sobel边缘检测块发现图像中的边缘和回报那些比边缘梯度阈值参数。输出是一个二进制图像。在你最后的应用程序中,这个阈值可以设置基于变量如路况、天气、图像亮度,等等。这个模型,阈值是PotHoleHDL子系统的输入参数。

梯形的面具

从二进制图像边缘,您需要删除任何不相关的壶穴检测的边缘。一个好的策略是使用面具,选择一个感兴趣的多边形区域,使区域外的黑色。不使用普通的ROI模型块因为这将消除质心的位置上下文之后,你需要计算和标签。

操作的顺序也很重要因为如果使用面具边缘检测之前,面具的边缘将变得强大行,导致探测器误报。

输入视频中,该地区的车辆可能会遇到一个障碍就是局限于道路立即在前面和巷道的梯形截面。确切的坐标取决于相机和镜头。这个示例使用固定坐标左,右,左,和右底部的角落。视频,顶部和底部的梯形面积不平行,所以这不是一个真正的梯形。

面具由直线之间的角落,连接左,右,上,下。

ltc——rtc / \ / \ / \ lbc - - - - - - - - - - - -加拿大皇家银行

这个示例使用polyfit确定对角直线合适。为了便于实现,设计要求polyfit与垂直方向的独立变量。这种用法计算x = f (y)而不是更通常的y = f (x)。使用polyfit这种方式允许您使用一个y方向行计数器的输入地址坐标的查找表开始(左)和结束(右)感兴趣的领域的每一行。

查找表通常是在布拉姆在FPGA中实现,所以它应该解决基于寻址。从基于MATLAB的寻址模型转换到基于寻址就在附近地区。为了进一步减少查找表的大小,地址是梯形的起跑线所抵消。为了获得良好的综合结果,典型的块匹配内存注册在fpga查找后通过使用一个注册表。这个寄存器还增加了一些温和的流水线设计。

320年x180图片:

光栅= [320180];ltc = (155、66);lbc = [1140];rtc = (155、66);加拿大皇家银行= [285179];%适合x = f (y)为方便附近地区索引abl = polyfit ([lbc (2) ltc (2)]、[lbc (1) ltc (1)), 1);%左abr = polyfit([红细胞(2),清债信托公司(2)]、[红细胞(1),清债信托公司(1)),1);%的右边leftxstart = max(1、圆(ltc(2):红细胞(2))* abl (1) + abl (2)));rightxend = min(光栅(1)轮((ltc(2):红细胞(2))* abr (1) + abr (2)));startline = min (ltc(2),清债信托公司(2));红细胞endline = max (lbc (2), (2));%从零开始的正确处理leftxstart = leftxstart - 1;rightxend = rightxend - 1;startline = startline - 1;endline = endline - 1;open_system ([modelname“/ PotHoleHDL / TrapezoidalMask”),“力”);

形态学关闭

下一个设计使用形态学关闭块删除或关闭小的特性。关闭工作先做扩张侵蚀,并帮助消除小特性不可能坑坑洼洼。指定一个社区决定小或大的块面具你想删除一个特征。这个模型使用一个5 x5街区,类似于一个磁盘,这样小的特性。

重心

质心计算发现一个活跃的中心区域。的设计不断计算重心标志着每个31 x31像素区域面积。它只存储中心坐标,当检测到面积大于一个输入参数。这是一个常见的硬件和软件系统之间的区别:在设计硬件fpga常常容易计算连续但只有商店答案当你需要它,而不是调用函数需在软件。

质心计算,你需要计算区域图像的三件事:像素的加权和在水平方向,垂直方向的加权和,和整体的和对应的所有像素的面积显著的部分地区。线缓冲区选择地区31 x31像素,并返回一个列。算法使用列计算垂直权重,和总重量。水平权重的设计结合了列获得31 x31内核。你可以选择你想要的重量取决于“中心”的意思。这个示例使用15:15这31 x31的中心地区(0,0)的计算结果。

愿景HDL工具箱力输出数据块为零输出无效时,表明pixelcontrol总线输出。虽然没有严格的要求,这一行为使得更容易测试和调试。完成这一行为的重心的结果,模型使用开关块固定块设置为0。

因为你想要检测的中心地区相对于整个图像坐标系,将水平和垂直像素计数添加到质心计算。

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

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

检测并保存

探测器作用于质心的面积总和。探测器本身非常简单:重心区域价值阈值参数进行比较,并找到最大的区域大于阈值。模型逻辑比较存储面积值与当前值和存储新领域当输入大于当前存储的值。通过使用>> =你可以选择最早的值在阈值或最新的阈值。模型商店最新的价值因为后来值更接近相机和车辆。当探测器商店新赢得区域价值,它还更新X和Y质心值对应于这个领域。这些坐标然后传递到校准和覆盖的部分子系统。

通过X, Y,和有效的指示对齐算法,包成一个23-bit字的值。模型解包他们一旦在时间与输入帧叠加一致。

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

像素流对准器

像素流对准器块从探测器采用流媒体信息并发送它和原始RGB像素流覆盖子系统。对准器补偿的处理延迟增加了检测算法的前面部分,而无需了解这些块的延迟。如果你以后改变社区大小或添加更多的处理,调整器可以补偿。如果总延迟超过最大行数像素流对准器块的参数,调整参数。

基准的叠加

基准标记是一个广场十字线表示为一系列31-element的31位定点数字。这表示是方便的,因为一个读取返回整词覆盖像素的每一行。

图表显示了叠加将定点数据转换为二进制模式。这种模式可以是您希望的任何名称在31日x31尺寸设计。

负载fiducialROM31x31.mat十字=本(fiducialROM);十字丝(十字= =' 0 ')=' '变化百分比为更好的显示“0”空间
十字= 31日×31 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 1”“11111111111111111111111”' 1 ' ' 1 ' ' 1 ' ' 1 '

基准覆盖子系统有一个水平和垂直的柜台和一组四个比较器,使用检测区域的中心为标志的中心地区。标记数据作为二进制开关打开alpha通道覆盖。α的值是一个固定的透明度参数应用作为获得二进制检测信号打开时,在ExpandData子系统。

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

字符叠加

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

由于字符数据通常是由一个CPU在ASCII,写的最简单的方法是在8位ASCII字符数据地址存储在一个双端口RAM。字体罗店33 ASCII字符(“!”)到122 (“z”)。设计由33个偏移地址。

字体罗是由公共领域固定宽度字体和几个编辑来提高可读性。在基准标记,性格ROM数据作为二进制开关打开alpha通道覆盖。字符alpha值是一个固定的透明度参数应用作为一个获得检测信号打开时,在ExpandData子系统。

可视化的字符B在字体ROM,显示它在二进制。

负载charROM16x16.matletterB =本(charROM16x16 (529:544));%字符数组letterB (letterB = =' 0 ')=' '%删除' 0 '识字课更好的显示
letterB = 16×16字符数组的“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代码,使用下面的命令。

makehdl (“PotHoleHDLDetector / PotHoleHDL”)

生成测试台上,使用下面的命令。注意,试验台一代需要很长时间由于大数据的大小。你可能想要减少仿真时间生成试验台。

makehdltb (“PotHoleHDLDetector / PotHoleHDL”)

这个模型的一部分,您可以在一个FPGA实现之间的部分像素和像素帧块。子系统称为PotHoleHDL,其中包括探测器的所有元素。

在一个高密度脂蛋白模拟器模拟

现在您已经HDL代码,你可以模拟高密度脂蛋白模拟器。自动生成的试验台可以证明仿真软件模拟和高密度脂蛋白模拟比赛。

合成为一个FPGA

你也可以合成生成的HDL代码在一个FPGA合成工具,比如Xilinx Vivado。Virtex-7 FPGA (xc7v585tffg1157-1),设计实现了时钟频率为150 MHz。

利用报告表明,双边滤波器,像素流对准器和质心函数消耗大部分的资源在这个设计。双边滤波器需要需求方。重心实现非常有效,只使用两个需求方。质心计算也需要相应的查找表和使用大量的附近地区作为记忆。

要进一步

这个例子展示了一个可能的实现一个算法检测凹坑。这个设计可以延长在以下方式:

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

  • 梯形屏蔽块可以通过查看“可操纵的”汽车车轮位置和调整线性适合在斜坡的面具。

  • 探测器可以通过观察更加健壮的平均亮度RGB或强度图像相对于周围的路面坑洞通常深色以来强度比周围地区。

  • 壶穴的视觉频率谱图也可以用来寻找特定类型的表面凹坑。

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

  • 可以检测到多个凹坑在一帧存储前N反应而不是只最大的检测响应。基准标记子系统需要重新设计略允许重叠的标记。

结论

这个模型显示了一个深坑检测算法可以在一个FPGA实现。这个探测器的许多有用的部分可以在其他应用程序中重用,如质心块和基准和字符叠加块。

引用

[1]科赫、基督教和Ioannis Brilakis。“壶穴检测沥青路面图像中。”先进的工程信息25岁,没有。3 (2011):507 - 15。doi: 10.1016 / j.aei.2011.01.002。

[2]Omanovic萨米尔,埃米尔Buza,艾尔文Huseinovic。“壶穴检测与图像处理和谱聚类”。2nd International Conference on Information Technology and Computer Networks (ICTN '13), Antalya, Turkey. October 2013.

Baidu
map