FPGA实现视频图像的水印添加
图像水印到处可见,如微博图片右下角会有原创者 ID 水印,很多 PDF 文件中也夹有水印,而视频图像同样可以添加水印,最著名的视频图像水印便是电视台的标志了。图像水印在文化产权上起到非常重要的作用,对所有者的权益起到一定的保护。
//========================================================================== //== TFT //========================================================================== TFT_driver u_TFT_driver ( .clk (clk_10m ), .rst_n (rst_n ), .TFT_req (rd_en ), .TFT_x (TFT_x ), .TFT_y (TFT_y ), .TFT_din (rd_data ), .TFT_clk (TFT_clk ), .TFT_de (TFT_de ), .TFT_pwm (TFT_pwm ), .TFT_hsync (TFT_hsync ), .TFT_vsync (TFT_vsync ), .TFT_data (rgb ) ); //========================================================================== //== 添加视频水印 //========================================================================== mark_rom u_mark_rom ( .clock (clk_10m ), .address (rom_addr ), .q (rom_data ) ); //-------------------------------------------------------------------------- //水印范围 assign rom_rden = (TFT_x >= 1) && (TFT_x <=50) && (TFT_y >= 1) && (TFT_y <=50); //rom地址 always @(posedge clk_10m or negedge rst_n) begin if(!rst_n) rom_addr <= 12\'b0; else if(rom_addr==2500-1) rom_addr <= 12\'b0; else if(rom_rden) rom_addr <= rom_addr + 1\'b1; end //数据显示 always @(*) begin if(rom_rden) begin TFT_data <= rom_data; //显示水印 end else TFT_data <= rgb; //显示原图 end
其中 rgb 是原本输出到管脚上的,拿来到“添加视频水印”模块做进一步的处理,而 TFT_x、TFT_y 信号是 TFT_driver 里就设计好的坐标信号,这里不得不又说一下,模块设计的好,移植性就非常强!
如果你的 TFT 或 VGA 驱动模块没有设计坐标信号,那么在后面用 de 使能信号设计一下就行,其实就是行列规划的计数器而已。
OK来看看下效果:
always @(*) begin if(rom_rden) begin TFT_data <= rom_data + rgb; //显示水印 end else TFT_data <= rgb; //显示原图 end
将 rom_data 和 rgb 数据相加,最后实现的效果如下所示:
always @(*) begin if(rom_rden) begin if(rom_data==16\'hffff) //背景白色显示原图 TFT_data <= rgb; else TFT_data <= rom_data;// + rgb; //否则显示水印 end else TFT_data <= rgb; //显示原图 end
对水印图案进行判断,如果是白色,则显示原图,否则显示水印,非水印区域也显示原图。最后效果如下所示: