MATLAB视觉算法,以Simulink为硬件目标,建金宝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.VideoFileReader (...“文件名”,“rhinos.avi”,...“ImageColorSpace”,“强度”,...“VideoOutputDataType”,“uint8”);numFrm = 10;有效帧尺寸actPixelsPerLine = 320;actLines = 240;尺寸包括下料totalPixelsPerLine = 402;totalLines = 324;%查看结果观众= vision.DeployableVideoPlayer (...“大小”,“自定义”,...“CustomSize”,(3 * actPixelsPerLine actLines]);

边缘检测和叠加

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

MATLAB边缘函数将阈值解释为从0到1的双精度值。因此,将阈值表示为的范围的一部分uint8数据类型,从0到255。方法返回的像素值边缘函数逻辑数据类型。将这些像素值转换为uint8类型为叠加,乘以255。这个缩放操作将逻辑1转换为255,逻辑0保持为0。

edgeThreshold = 8;α= 0.75;frmFull = uint8 (0 (actLines, actPixelsPerLine numFrm));frmRef = frmFull;f = 1:numFrm frmFull(:,:,f) = videoIn();=边缘(边缘frmFull (:: f),“索贝尔”edgeThreshold / 255,“称号”);edges8 = 255 * uint8(边缘)*(1α);frmRef(:,:,f) = alpha*frmFull(:,:,f) + edges8;查看器([边缘edges8 frmRef (:,:, f)));结束

设置为Simulink金宝app仿真

Simu金宝applink模型使用视频源块将输入的视频加载到模型中。属性配置模型的示例时间totPixPerFrame变量。该值包括240×320帧周围的非活动像素区域。视频源采样时间为每帧1个时间步长,模型的流像素段的速率为1/totPixPerFrame。设置仿真的长度simTime变量。

totPixPerFrame = totalPixelsPerLine * totalLines;simTime = (numFrm + 1) * totPixPerFrame;modelname =“VerifySLDesignAgainstMLReference”;open_system (modelname);set_param (modelname“SampleTimeColors”,“上”);set_param (modelname“SimulationCommand”,“更新”);set_param (modelname“开放”,“上”);

Hardware-Targeted算法

HDL算法子系统是为支持HDL代码生成而设计的。金宝app

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

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

图像覆盖子系统通过α并将它们相加。考虑到硬件实现,图像覆盖子系统包括围绕每个乘法器和加法器之后的管道阶段。

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

open_system ([modelname“/ HDL算法”]);

运行仿真金宝app软件模型

运行Simuli金宝appnk模型,返回10帧被检测到的边缘覆盖的帧。

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);流(['\nFrame #%d具有与行为结果不同的%d像素(相差超过2个)。PSNR = %2.2f\n'),f, errcnt noisecheck);% bar3 (diff);% 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个像素(不同于行为结果more than 2). PSNR = 48.27 Frame #7 has 2 pixels that differ from behavioral result (by more than 2). PSNR = 48.88 Frame #8 has 3 pixels that differ from behavioral result (by more than 2). PSNR = 48.58 Frame #9 has 3 pixels that differ from behavioral result (by more than 2). PSNR = 48.55 Frame #10 has 3 pixels that differ from behavioral result (by more than 2). PSNR = 48.53

生成HDL代码并验证其行为

一旦您的设计工作在仿真中,您可以使用HDL Coder™来生成HDL代码,并为HDL算法子系统建立一个测试平台。

makehdl ([modelname“/ HDL算法”])生成HDL代码makehdltb ([modelname“/ HDL算法”])生成HDL测试台

另请参阅

|

相关的话题