前言:这一讲我们使用Simulink来快速搭建图像/视频处理硬件加速平台。以简单的RGB2GREY算法为例。我们主要使用的Toolbox为HDL Coder和Vision HDL两个,以后会加上相关的Hardware Support Package。大家可以在Simulink的Library Brower中以及官网里熟悉一下他们所支持的功能。
正文:
首先我们新建一个Simulink模型,并且按照上一讲所讲到的设置配置完成。
然后在空白处双击,输入并添加以下模块:
-
Image From File
-
Frame To Pixels
-
Pixels to Frame
-
Video Reviewer
-
Embedded Subsystem
将Video Reviewer放入Enabled Subsystem中,如下图
然后按照下图连接所有模块。此处每个模块的输入都包含两个:pixel和ctrl。Pixel表示对应的像素值,ctrl信号会indicate行开始和结束,列开始和结束,以及valid信号。不了解的同学可以参考Mathwork关于视频接口控制总线的说明https://www.mathworks.com/help/visionhdl/ug/pixelcontrol-bus.html。
之后我们需要设置Image From File模块,双击它。如下图设置File Name,Sample time。
下面设置Frame To Pixels和Pixels To Frame模块,由于我们使用的图片格式是RGB240p,所以我们在双击模块之后弹出的配置窗口里选择Video Format为240p,RGB有3个通道,所以Number of components填3。Pixels To Frame同理。对于视频格式不太了解的同学,我建议阅读一下Matlab的Frame To Pixels文档的Video format部分,链接如下
https://www.mathworks.com/help/visionhdl/ref/frametopixels.html
接下来我们设置仿真参数,在空白处单击右键,选择Model Properties
然后我们在Callbacks中的InitFcn(初始化函数)填写以下代码,这样我们只要改变VideoFormat的格式就可以自动获取图像长宽等参数。
完成之后我们在Simulink Model的配置栏设置仿真时间为totalPixels(也就是上一步中配置的),仿真模式选择为Accelerator模式。
至此,我们可以测试一下仿真通路了,保存之后使用ctrl+D来验证模型完整性。如果没有报错即可点击开始按钮,开始仿真。如果不出意外,我们将会看到以下图片
既然视频通路搭建成功,我们就可以开始添加自己的RGBGREY模块了。
熟悉数字图像处理的同学一定知道,RGB图像转换成灰度图像的公式如下
GREY=0.299*R+0.587*G+0.114*B。因此我们搭建转换模块如下
Delay模块功能相当于寄存器模块,RGB信号通过pixelIn输入,通过乘法器与对应的常数相乘,并且使用Sum of Element模块求和,后面的Data Type Conversion模块截取了小数点之前的8位,也就是转换成uint8的类型。Control Bus也要有相应的延迟,以保证时序不变。(关于为什么使用2个寄存器延迟,以及乘法器的替代,将会在以后提到。)我们将这部分模块封装在一个subsystem中(选中想要封装的模块并点击右键,选中Create Subsystem from Selection)。至此,我们的算法搭建已经完成,如下图。由于灰度图像是单通道的,别忘记将Pixel To Frame中的通道数改为1。
开始仿真,Video Reviewer会显示以下图像,说明我们的转换算法验证成功。
说明:1. 细心的同学可能会发现,在实现RGBGREY算法,双击添加模块时,所有的模块都出自HDL Coder Toolbox,大家可以去官网查看更多实例以及熟悉支持功能。2.MathWorks提供了一套对应于上面模型的硬件框架来使用户可以快速的搭建算法验证测试平台,主要来自Xilinx Zynq Support from Computer Vision Toolbox。前图模型中显示绿色和黄色的部分并不能综合成硬件代码,但应该适配到对应的Zynq框架之后,只要用户按照接口,也就是pixel和ctrl,来开发算法,就可以很容易的使用该硬件支持包来布置到FPGA中。
在Github中,我还添加了软件部分的验证部分,并且计算硬件和软件的PSNR。欢迎大家下载并且在自己的电脑上验证,如果有问题和任何建议也可以与我联系。
以下为模型地址https://github.com/linbaiwpi/matlab_visionhdl/tree/master/rgb2grey
下集预告:之后,我们还会了解到哪些模块是可以被转换成HDL代码的,如何将模型部署到硬件之上,以及实现算法的时候将会用到的技巧等。
下一讲我将会实现以上模型的HDL代码,并且在Zedboard+FMC-HDMI-CAM板卡上进行验证。之后我们会讲解如何使用Line Buffer,如何生成patch,实例为将照片转换成素描风格(测试图片摘自Github-wyfunique/Convert-Photo-to-sketch,如有侵权,烦请告知,我会立刻删除)。实现结果如下(右边是输入图像,左边是硬件实现的结果)
相关文章