MATLAB视觉算法模拟硬件目标模型工作流程万博1manbetx

此示例显示如何在Simulink®中创建硬件目标设计,该设计实现与MATLAB®参考设计相同的行为。万博1manbetx

工作流

图像处理工具箱™和计算机视觉工具箱™函数对框架、浮点和整数数据进行操作,并提供优秀的行为参考。硬件设计必须使用流布尔或定点数据。

该示例显示如何在MATLAB中执行帧图像处理操作,然后使用流数据在SIMULINK模型中实现相同的操作。万博1manbetxSimu万博1manbetxlink模型将输入视频转换为用于硬件友好设计的像素流。同一数据应用于Simulink中的硬件算法和Matlab中的行为算法。万博1manbetxSimu万博1manbetxlink模型将输出像素流转换为帧,并将这些帧导出到MATLAB以与行为结果进行比较。

本例的MATLAB部分加载输入视频,运行行为代码,运行Simulink模型导入视频帧和导出修改后的视频帧,并将MATLAB行为结果与Simulink输出帧进行比较。万博1manbetx

视频源

创建一个视频文件阅读器对象,以将视频文件导入MATLAB工作区。视频源文件是240p格式。创建视频播放器对象以显示输入帧,Simulink过滤帧和MATLAB参考帧。万博1manbetx

videoIn =愿景。VideoFileReader (...“文件名”'rhinos.avi'...“ImageColorSpace”'强度'...“VideoOutputDataType”“uint8”);numFrm = 10;%活动框架尺寸actPixelsPerLine = 320;actLines = 240;%尺寸包括落料totalPixelsPerLine = 402;totalLines = 324;%查看结果观众=愿景。DeployableVideoPlayer (...“大小”'风俗'...“CustomSize”, (3 * actPixelsPerLine actLines]);

边缘检测与覆盖

检测视频帧中的边缘,然后将这些边缘覆盖到原始帧上。叠加计算使用α值以混合两个像素值。Simu万博1manbetxlink模型也使用了edgeThresholdα这里指定的参数。

matlab.边缘函数将阈值解释为从0到1的双精度值。因此,表达阈值作为一小部分的范围uint8数据类型,从0到255.返回的像素值边缘功能是逻辑数据类型。将这些像素值转换为uint8类型为覆盖,乘以255。这个缩放操作将逻辑1转换为255,逻辑0保持为0。

edgethreshold = 8;alpha = 0.75;frmfull = uint8(零(零(Contlines,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仿万博1manbetx真

Simu万博1manbetxlink模型使用视频源块将输入视频加载到模型中。使用该模型的采样时间配置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代码生成。万博1manbetx

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

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

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

有关此边缘检测器设计的更多细节,请参阅边缘检测和图像叠加例子。

open_system ([modelname'/ hdl算法']);

运行Si万博1manbetxmulink模型

运行Simuli万博1manbetxnk模型返回与检测到的边缘重叠的10帧。

sim卡(“VerifySLDesignAgainstMLReference”);

比较Simuli万博1manbetxnk和MATLAB的结果

比较从Simulink返回的每个视频帧,并通过MATLAB行为代码返回的结果。万博1manbetx图像看起来非常相似但由于覆盖混合而具有小的像素值差异。使用浮点值完成MATLAB覆盖混合,使用定点值进行Simulink覆盖混合。万博1manbetx该比较计数每个帧中的像素,其值不同超过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个像素与行为结果不同(超过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测试台

另请参阅

|

相关话题