链接直达
https://item.taobao.com/item.htm?ft=t&id=776516984361
什么是视频水印?
视频水印就是图像叠加,跟画中画,或者是OSD是一样的原理,都是在视频的行场数据流上进行替换操作,比如叠加可以直接用水印图的数据替掉摄像头的数据,也可以将水印图的数据与摄像头的数据进行运算后再替换原有的摄像头数据。
图片转MIF
首先我们需要一个水印图片,这个水印图片如何让FPGA可以读取呢?不带SOC的FPGA不太适合直接解析jpg,png图片,因此我们可以先在PC上将图片处理成.mif格式,.mif是安路支持的FPGA ROM的初始化格式。
我们提供python和安路版本的图片转MIF的转换代码。
python实现图片转MIF源码
从图片生成叠加MIF的python代码,支持所有常见图片格式(bmp,png, jpeg):
PotatoPie 4.0 实验教程(32) —— FPGA实现摄像头视频图像叠加-Anlogic-安路论坛-FPGA CPLD-ChipDebug
这段代码实现了将图片转换为Memory Initialization File(MIF)格式的功能。具体来说,它会从指定的图片文件中读取像素数据,并将其转换为适合存储在存储器中的格式。代码首先获取当前.py文件所在的目录,然后构建图片文件的路径,从而读取名为icmaker.png的图片文件。接着,它会打开这个图片文件,并获取其大小。然后,代码会清空之前同名的MIF文件(如果存在),并打开一个用于写入的MIF文件。在MIF文件中,代码会按照指定的格式写入图片的像素数据,其中包括像素的地址和对应的RGB值。最终,生成的MIF文件可以用于初始化存储器,用于在数字电路中存储图片数据。
MATLAB实现图片转MIF源码
PotatoPie 4.0 实验教程(32) —— FPGA实现摄像头视频图像叠加-Anlogic-安路论坛-FPGA CPLD-ChipDebug
FPGA工程分析
工程层次图
与demo18相比,只是多了一个watermark的模块,也就是下面这一段代码,在从SDRAM读出来之后,经它处理后再输出hdmi_tx模块。
watermark代码分析
模块代码比较简单,watermark.v中我们先例化一个存储水印图片的ROM
img_36_128_rom u_img_36_128_rom(
.doa ({r_d0,g_d0,b_d0}),
.addra (rd_addr ),
.clka (i_clk ),
.rsta (1'b0 )
);
ROM的定义文件img_36_128_rom中指定了mif文件的路径。
.INIT_FILE("./icmaker_36_128_3.mif"),
然后控制RGB数据的输出,选择是摄像头数据还是水印数据,o_de1
为有效的时候输出水印数据
assign o_r = o_de1 ? r_d0 : r_d1;
assign o_g = o_de1 ? g_d0 : g_d1;
assign o_b = o_de1 ? b_d0 : b_d1;
那么如何控制水印数据呢?下面的代码即为控制代码,上面的o_de1
就是下面代码中的de_d0延时后的信号。
上面的BEGIN_X
、H_ACTIVE
这些参数在文件的头部有定义,详见代码如下片段。
parameter H_ACTIVE_IMG = 1280; //图像宽度 parameter V_ACTIVE_IMG = 720; //图像高度 parameter H_ACTIVE = 128; //水印区域宽度 parameter V_ACTIVE = 36; //水印区域高度 parameter BEGIN_X = 511; //水印起始坐标 parameter BEGIN_Y = 360; //水印起始坐标
管脚约束
与PotatoPie 4.0 实验教程(18) —— FPGA实现OV5640摄像头采集以SDRAM作为显存进行HDMI输出显示相同,不作赘述。
时序约束
与PotatoPie 4.0 实验教程(18) —— FPGA实现OV5640摄像头采集以SDRAM作为显存进行HDMI输出显示相同,不作赘述。