文档

MATLAB视觉算法,用于模拟硬件目标模型工作流程金宝app

此示例显示了如何在Simulink®中创建针对硬件的设计,该设计实现了与MATLAB®参考设计相同的行为。金宝app

工作流程

图像处理工具箱™和计算机视觉工具箱™功能可在框架,浮点和整数数据上运行,并提供出色的行为参考。硬件设计必须使用流布尔值或固定点数据。

此示例显示了如何在MATLAB中执行框架图像处理操作,然后使用流数据在Simulink模型中实现相同的操作。金宝appSimu金宝applink模型将输入视频转换为像素流以进行硬件友好设计。同样的数据应用于Simulink中的硬件算法和MATLAB中的行为算法。金宝appSimu金宝applink模型将输出像素流转换为帧,并将这些帧导出到MATLAB,以与行为结果进行比较。

该示例的MATLAB部分加载输入视频,运行行为代码,运行Simulink模型以导入视频帧和导出修改的视频帧,并将MATLAB行为结果与Simulink输出帧进行比较。金宝app

视频来源

创建一个视频文件读取器对象,以将视频文件导入MATLAB工作区。视频源文件为240p格式。创建一个视频播放器对象以显示输入框架,Simulink过滤框架和MATLAB参考框架。金宝app

videoin = vision.videfilereader(...'文件名',,,,'rhinos.avi',,,,...“ ImageColorspace”,,,,'强度',,,,...“ videooututputdatatype”,,,,'uint8');numfrm = 10;%主动框架尺寸ActPixelSperline = 320;Actlines = 240;百分比尺寸,包括空白TotalPixelSperline = 402;Totallines = 324;观众的结果百分比查看器= vision.deployableVideOplayer(...'尺寸',,,,'风俗',,,,...'自定义大小',[3*ActPixelSperline actlines]);

边缘检测和覆盖

检测视频帧中的边缘,然后将这些边缘叠加到原始框架上。覆盖计算使用α混合两个像素值的值。Simu金宝applink模型还使用edgethresholdα此处指定的参数。

matlab边缘函数将阈值解释为从0到1的双精度值UINT8数据类型,从0到255。边缘功能是逻辑数据类型。将这些像素值转换为UINT8输入覆盖层,乘以255。此缩放操作将逻辑操作转换为255,逻辑零保持0。

edgethreshold = 8;alpha = 0.75;frmfull = uint8(zeros(actlines,actpixelsperline,numfrm));frmref = frmfull;为了f = 1:numfrm frmfull(::,:,f)= videoin();边缘= edge(frmfull(:,::,f),'Sobel',edgethreshold/255,“没有”);edges8 = 255*uint8(边缘)*(1-alpha);frmref(::,:,f)= alpha*frmfull(:,::,f) + edges8;查看器([Edges Edges8 frmref(:,::,f)]);结尾

设置用于Simulin金宝appk模拟

Simu金宝applink模型使用视频源块将输入视频加载到模型中。使用模型的示例时间totpixperframe多变的。该值包括240乘320帧附近的无活动像素区域。视频源样本时间为每一帧的1个时间步,并且模型的流像素部分中的速率为1/totpixperframe。将模拟的长度设置为SIMTIME多变的。

TotPixperFrame = TotalPixelSperline*totallines;simTime =(numfrm+1)*totpixperframe;modelName ='verifysldesignagainstmlreference';Open_System(modelName);set_param(modelname,“采样赛”,,,,'上');set_param(modelname,“仿真”,,,,'更新');set_param(modelname,'打开',,,,'上');

针对硬件的算法

HDL算法子系统旨在支持HDL代码生成。金宝app

子系统使用边缘检测器块找到边缘。块的输出是布尔像素值。模型将这些值缩放到UINT8覆盖的数据类型值。

由于内部线缓冲区和过滤器逻辑,该块在几行延迟后返回了检测到的边缘的像素流。在执行覆盖之前,模型必须延迟输入流以匹配边缘流。像素流对齐器块使用输出边缘流的控制信号作为参考执行此对齐。该块将输入流存储在FIFO中,直到可检测到的边缘为止。

图像叠加子系统缩放了两个流α比率并将它们添加在一起。考虑到硬件实现,图像覆盖子系统包括每个乘数周围和加法器之后的管道阶段。

有关此边缘检测器设计的更多详细信息,请参阅边缘检测和图像覆盖例子。

open_system([模型名称'/HDL算法');

运行Si金宝appmulink模型

运行Simuli金宝appnk模型以返回带有检测到的边缘的十帧覆盖。

sim('verifysldesignagainstmlreference');

将Simulin金宝appk结果与MATLAB结果进行比较

比较Simulink返回的每个视频框架与MATLAB行为代码返回的结果。金宝app这些图像看起来非常相似,但由于覆盖混合而产生的像素值差异很小。MATLAB覆盖层混合使用浮点数值进行,并使用固定点值进行Simulink覆盖层混合。金宝app该比较计数每个帧中的像素,其值差异超过2,并计算帧之间的峰信号与噪声比(PSNR)。要查看每个帧处的详细差异,请在循环中的最后两条线取消点击。

为了f = 1:numfrm frmresult = frmout.signals.values(:,:,:,f);观看者([[frmfull(:,:,f)frmresult frmref(:,::,f)]);diff = frmref(:,::,f) -  frmresult;errcnt = sum(diff(:)> 2);noisecheck = psnr(frmref(:,::,f),frmresult);fprintf(['\ nframe#%d具有与行为结果不同的%d像素(超过2)。psnr =%2.2f \ n'],f,errcnt,noisecheck);%bar3(差异);%viewer([[frmresult frmref(:,::,f)diff]);结尾
帧#1具有与行为结果不同的2个像素(超过2个)。PSNR = 48.33帧#2具有1像素与行为结果不同(超过2)。PSNR = 48.72帧#3具有1像素与行为结果不同(超过2)。PSNR = 48.80帧#4具有2个与行为结果不同的像素(超过2个)。PSNR = 48.66帧#5具有2个与行为结果不同的像素(超过2个)。PSNR = 48.70帧#6具有4个与行为结果不同的像素(超过2)。PSNR = 48.27帧#7具有2个与行为结果不同的像素(超过2个)。PSNR = 48.88帧#8具有3个与行为结果不同的像素(超过2)。PSNR = 48.58帧#9具有3个与行为结果不同的像素(超过2)。PSNR = 48.55帧#10具有3个与行为结果不同的像素(超过2)。 PSNR = 48.53

生成HDL代码并验证其行为

一旦设计在模拟中工作,您就可以使用HDL Coder™为HDL算法子系统生成HDL代码和测试工作台。

makehdl([modelname'/HDL算法')))%生成HDL代码makehdltb([modelname'/HDL算法')))%生成HDL测试台

也可以看看

|

相关话题