PotatoPie 4.0 实验教程(33) —— FPGA实现摄像头视频图像叠加

链接直达

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_XH_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输出显示相同,不作赘述。

实验结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/661737.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

力扣刷题 63.不同路径 II

题干 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish”)。 现在考虑网格中有障碍物。那么从左上角到…

LLM大语言模型(十三):ChatGLM3-6B兼容Langchain的Function Call的一步一步的详细转换过程记录

# LangChain:原始prompt System: Respond to the human as helpfully and accurately as possible. You have access to the following tools: Calculator: Useful for when you need to calculate math problems, args: {\calculation\: {\description\: \calcul…

学习VUE2第6天

一.请求拦截器 可以节流,防止多次点击请求 toast是单例 二.前置路由守卫 在Vue.js中,前置路由守卫是指在路由转换实际发生之前执行的钩子函数。这是Vue Router(Vue.js官方的路由管理器)提供的一种功能,允许开发者在用…

Oracle 终于在 MySQL 8.4 对 InnoDB 默认值下手了

根据 Oracle 的官方文档,MySQL 8.4 相比于 8.0 调整了不少 InnoDB 的默认值。 新的改动使得默认值更加接近于当前的硬件水平。比如 innodb_io_capacity,之前 200 对应的是机械盘。10000 更加符合主流 SSD 的指标。 之前 MySQL 里 InnoDB 的默认值已经过时…

go代码运行报错go_test3\main.go:14:2: package test3/mymath is not in std

在使用vscode运行go代码时报错 go_test3\main.go:14:2: package test3/mymath is not in std 如下图 产生的原因:使用右键Run Code,或者点击vscode运行按钮也会报错,如下图: 解决办法: 在终端执行go run main.go运…

爬虫学习:基本网络请求库的使用

目录 一、urllib网络库 1.urlopen()方法 2.request方法 二、requests网络请求库 1.主要方法 2.requests.get()和requests.post() 一、urllib网络库 1.urlopen()方法 语法格式: urlopen(url,data,timeout,cafile,capath,context) # url:地址 # data:要提交的数据…

关于Dockerfile镜像实例

文章目录 Dockerfile镜像实例一、构建SSH镜像1、建立工作目录2、生成镜像3、启动容器并修改root密码 二、构建systemd镜像1、建立工作目录2、生成镜像3、运行镜像容器4、测试容器systemd 三、构建Nginx镜像1、建立工作目录2、编写Dockerfile脚本3、编写run.sh启动脚本4、生成镜…

边循环边删除List中的数据

List边循环,边删除;这种一听感觉就像是会出问题一样,其实只要是删除特定数据,就不会出问题,你如果直接循环删除所有数据,那可能就会出问题了,比如: public static void main(String[…

上位机图像处理和嵌入式模块部署(树莓派4b与mcu固件升级)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 在一个系统当中,可能不止需要树莓派4b一个设备。有的时候还需要搭载一个mcu,做一些运动控制的事情。比如说,图像…

第七篇:专家级指南:Python异常处理的艺术与策略

专家级指南:Python异常处理的艺术与策略 1 引言 在编程的世界中,异常处理是一门必修的艺术。它不仅涉及到程序的错误处理,更广泛地影响着软件的稳定性、健壮性和用户体验。本篇文章将深入探讨Python中的异常处理,展示如何通过精心…

【专篇】DDR4 SDRAM-01总体介绍

概念 DDR4 SDRAM(Double-Data-Rate Fourth Generation Synchronous Dynamic Random Access Memory)是一种先进的高性能存储器规格,是DDR3 SDRAM的后续产品。自2011年首次由三星电子制造并公布以来,它已经成为现代计算机系统中广泛采用的内存标准。 主要特点: 更高带宽: DD…

【C语言】——数据在内存中的存储

【C语言】——数据在内存中的存储 一、整数在内存中的存储1.1、整数的存储方式1.2、大小端字节序(1)大小端字节序的定义(2)判断大小端 1.3、整型练习 二、浮点数在内存中的存储2.1、引言2.2、浮点数的存储规则2.3、浮点数的存储过…