将MATLAB视觉算法转换为面向硬件的Simulink模型
这个例子展示了如何在Simulink®中创建一个硬件目标设计,实现与MATLAB®参考设计相同的行为。
工作流
图像处理工具箱™和计算机视觉工具箱™功能操作框架,浮点和整数数据,并提供优秀的行为参考。硬件设计必须使用流布尔或定点数据。
这个例子展示了如何在MATLAB中执行框架图像处理操作,然后在使用流数据的Simulink模型中实现相同的操作。Simulink模型将输入视频转换为像素流,用于硬件友好设计。将相同的数据应用于Simulink中的硬件算法和MATLAB中的行为算法。Simulink模型将输出像素流转换为帧,并将这些帧导出到MATLAB中与行为结果进行比较。
本例的MATLAB部分加载输入视频,运行行为代码,运行Simulink模型导入视频帧,导出修改后的视频帧,并将MATLAB行为结果与Simulink输出帧进行比较。
视频源
创建一个视频阅读器对象,将视频文件导入MATLAB工作区。视频源文件为240p格式。创建一个视频播放器对象来显示输入帧、Simulink过滤帧和MATLAB参考帧。
videoIn = VideoReader (“rhinos.avi”);numFrm = 10;有效框架尺寸%actPixelsPerLine = 320;actLines = 240;%尺寸包括下料totalPixelsPerLine = 402;totalLines = 324;%查看结果观众=愿景。DeployableVideoPlayer (...“大小”,“自定义”,...“CustomSize”, (3 * actPixelsPerLine actLines]);
边缘检测与叠加
检测视频帧中的边缘,然后将这些边缘覆盖到原始帧上。覆盖计算使用α
值来混合两个像素值。Simulink模型也使用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) = rgb2gray(readFrame(videoIn));=边缘(边缘frmFull (:: f),“索贝尔”edgeThreshold / 255,“称号”);edges8 = 255 * uint8(边缘)*(1α);frmRef(:,:,f) = alpha*frmFull(:,:,f) + edges8;查看器([边缘edges8 frmRef (:,:, f)));结束
设置Simulink仿真
Simulink模型使用视频源块将输入视频加载到模型中。配置模型的采样时间totPixPerFrame
变量。这个值包括240 × 320帧周围的非活动像素区域。Video Source采样时间为每帧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代码生成。
子系统使用边缘检测器块来查找边缘。块的输出是的流布尔
像素值。模型将这些值缩放到uint8
覆盖的数据类型值。
由于内部行缓冲器和过滤器逻辑,块在经过几行延迟后返回检测到的边缘的像素流。在进行叠加之前,模型必须延迟输入流以匹配边缘流。像素流校准器块使用输出边缘流的控制信号作为参考来执行这种校准。该块将输入流存储在FIFO中,直到检测到的边可用为止。
图像叠加子系统通过α
把它们加起来。考虑到硬件实现,图像叠加子系统包括每个乘法器周围和加法器之后的管道阶段。
有关此边缘检测器设计的更多详细信息,请参见边缘检测与图像叠加的例子。
open_system ([modelname“/ HDL算法”]);
运行仿真软件模型
运行Simulink模型返回10帧覆盖了检测到的边缘。
sim卡(“VerifySLDesignAgainstMLReference”);
比较Simulink和MATLAB的结果
将从Simulink返回的每个视频帧与MATLAB行为代码返回的结果进行比较。图像看起来非常相似,但由于覆盖混合有小像素值的差异。MATLAB叠加混合使用浮点值,Simulink叠加混合使用定点值。该比较计算每帧中差异大于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)。), 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测试台架