FPGA多路视频叠加融合 HLS算法实现 提供2套工程源码和技术支持

news2024/11/28 9:46:41

目录

  • 1、前言
  • 2、视频叠加模块的功能和性能
  • 3、HLS视频叠加融合设计
  • 4、vivado工程1--单路同源视频的缩放叠加
    • 详细设计方案
    • vivado工程详解
    • SDK工程详解
  • 5、vivado工程2--两路非同源视频的缩放叠加
    • 详细设计方案
    • vivado工程详解
    • SDK工程详解
  • 6、上板调试验证
  • 7、福利:工程代码的获取

1、前言

视频叠加和融合在FPGA图像处理领域有着广泛应用,但其复杂的内存访问机制和视频叠加透明度的融合,使得实现难度很大,让很多FPGA工程师望而却步,在目前的技术条件下,使用HLS实现视频叠加融合是最简单方便的实现方式,本设计也是基于此实现。

本设计提供2套vivado工程,一套是单路同源视频的缩放叠加,原视频作为底层视频,取原视频的中间部分缩小后作为叠加视频,叠加于底层视频的左上角后输出;另一套是两路非同源视频的缩放叠加,一路视频作为底层视频,取另一路视频的中间部分缩小后作为叠加视频,叠加于底层视频的左上角后输出;代码编译通过后上板调试验证,可直接项目移植,适用于在校学生做毕业设计、研究生项目开发,也适用于在职工程师做项目开发,可应用于医疗、军工等行业的数字成像和图像传输领域;
提供完整的、跑通的工程源码和技术支持;
工程源码和技术支持的获取方式以及上板调试的演示视频放在了文章末尾,请耐心看到最后;

2、视频叠加模块的功能和性能

1:支持多路视频的叠加,前提是FPGA读写内存的带宽得足够宽,本设计使用2路视频叠加;
2:支持叠加视频任意尺寸缩放,因为图像叠加必然是有一个底层视频和叠加层视频,一般情况下叠加层视频尺寸会小于底层视频,而本设计支持叠加视频任意尺寸缩放,通过SDK软件配置;
3:支持任意位置的视频叠加,即叠加层视频在底层视频的叠加位置的坐标是可任意配置的,本设计的叠加位置是在x=0,y=0的位置,即视频左上角,通过SDK软件配置;
4:支持叠加视频透明度的任意配置,即所谓的视频融合,叠加层可以完全覆盖底层视频,也可以完全融合于底层视频,这个是通过透明度参数自由配置的,通过SDK软件配置;
5:通用性较好,zynq系列FPGA均可使用,通过修改HLS工程中的FPGA型号,还可以适配于其他FPGA型号;
6:目前最高支持1920x1080@60Hz的分辨率视频叠加,可以修改HLS工程中视频参数后适应4K分辨率,前提是FPGA的内存读写带宽得足够宽;
7:视频输入输出接口都是AXI4-Sream;

3、HLS视频叠加融合设计

HLS视频叠加融合设计框图如下:
在这里插入图片描述
底层视频输入:
AXI4-Sream视频流输入,本设计由VDMA的输出灌入,作为底层视频;
叠加层视频输入:
AXI4-FULL数据流输入,这里的叠加层视频是HLS视频叠加融合模块主动发起的AXI4读操作,所以需要给出读取视频的首地址和分辨率信息,这些参数是通过AXI4-Lite配置的,即SDK配置;
叠加层视频缩放:
调用HLS库函数实现,可以任意尺寸缩放,转为视频叠加设计,高度贴近真实项目,缩放参数通过AXI4-Lite配置的,即SDK配置;
视频输出:
AXI4-FULL数据流输出,输出是叠加后的视频;
配置参数输入:
AXI4-Lite接口,对接SDK软件;

4、vivado工程1–单路同源视频的缩放叠加

详细设计方案

单路视频的缩放叠加设计框图如下:
在这里插入图片描述
这里只用到1路视频,采用OV5640摄像头,视频通过VDMA缓存3帧到DDR3,取第一帧作为叠加视频叠加到OV5640摄像头视频流,然后输出;
这个工程的目的是验证同源视频的视频叠加,因为底层视频和叠加层视频都来自于同一个视频源,因为输入只有一个OV5640摄像头;
本工程的叠加层视频截取底层视频中心位置的图像缩小,然后叠加到底层视频的左上角;

vivado工程详解

开发板FPGA型号:FPGA–xc7z100ffg900-2;
开发环境:vivado2019.1;
输入:1路OV5640摄像头,分辨率1280x720@60Hz;
输出:HDMI,分辨率1280x720@60Hz;
Bolck Design设计如下:
在这里插入图片描述
综合后的工程代码架构如下:
在这里插入图片描述
综合编译完成后的FPGA资源消耗和功耗预估如下:
在这里插入图片描述

SDK工程详解

SDK工程代码架构如下:
在这里插入图片描述
自定义视频叠加API及其入口参数如下:

//video_width-->原视频宽度
//video_height-->原视频高度
//zoom_x-->提取原视频的x轴起始位置,提取的原视频区域作为叠加的视频
//zoom_y-->提取原视频的y轴起始位置,提取的原视频区域作为叠加的视频
//zoom_w-->叠加的视频宽度
//zoom_h-->叠加的视频高度
//overly_x-->叠加的视频在底层视频中的起始x轴坐标
//overly_y-->叠加的视频在底层视频中的起始y轴坐标
//overly_w-->叠加的视频缩放后的宽度
//overly_h-->叠加的视频缩放后的高度
//overly_alpha-->叠加的视频与底层视频之间的透明度

void helai_mix(u32 video_width,u32 video_height,u32 zoom_x,u32 zoom_y,u32 zoom_w,u32 zoom_h,u32 overly_x,
		       u32 overly_y,u32 overly_w,u32 overly_h,u32 overly_alpha){
	//初始化
	XOverlaystream_Initialize(&overlaystreamInstance, XPAR_OVERLAYSTREAM_0_DEVICE_ID);
	//取视频的地址,这里取VDMA的第一帧地址
	XOverlaystream_Set_pMem(&overlaystreamInstance,VIDEO_BASEADDR0);
	//使能
	XOverlaystream_EnableAutoRestart(&overlaystreamInstance);
	//启动
	XOverlaystream_Start(&overlaystreamInstance);
	//配置参数
	XOverlaystream_Set_cols(&overlaystreamInstance, video_width);
	XOverlaystream_Set_rows(&overlaystreamInstance, video_height);
	XOverlaystream_Set_zoom_x(&overlaystreamInstance, zoom_x);
	XOverlaystream_Set_zoom_y(&overlaystreamInstance, zoom_y);
	XOverlaystream_Set_zoom_w(&overlaystreamInstance, zoom_w);
	XOverlaystream_Set_zoom_h(&overlaystreamInstance, zoom_h);
	XOverlaystream_Set_overly_x(&overlaystreamInstance, overly_x);
	XOverlaystream_Set_overly_y(&overlaystreamInstance, overly_y);
	XOverlaystream_Set_overly_w(&overlaystreamInstance, overly_w);
	XOverlaystream_Set_overly_h(&overlaystreamInstance, overly_h);
	XOverlaystream_Set_overly_alpha(&overlaystreamInstance, overly_alpha);
}

主函数如下:

int main(){
    init_platform();
	I2C_config_init();
	helai_vdma();
	helai_mix(1280,720,1280/2-200,720/2-200,400,400,0,0,1280/2,720/2,40);
	while(1);
    cleanup_platform();
    return 0;
}

5、vivado工程2–两路非同源视频的缩放叠加

详细设计方案

两路视频的缩放叠加设计框图如下:
在这里插入图片描述
这里用到了2路视频,采用OV5640摄像头,摄像头2视频通过VDMA缓存3帧到DDR3,作为底层视频;摄像头1视频通过VDMA缓存3帧到DDR3,作为叠加层视频;两路视频叠加,然后输出;
这个工程的目的是验证非同源视频的视频叠加,因为底层视频和叠加层视频都来自于不同的视频源,因为输入只有2个OV5640摄像头;
本工程的叠加层视频截摄像头1视频中心位置的图像缩小,然后叠加到摄像头2底层视频的左上角;

vivado工程详解

开发板FPGA型号:FPGA–xc7z100ffg900-2;
开发环境:vivado2019.1;
输入:2路OV5640摄像头,分辨率1280x720@60Hz;
输出:HDMI,分辨率1280x720@60Hz;
Bolck Design设计如下:
在这里插入图片描述
底层视频的VDMA配置为读写模式,如下:
在这里插入图片描述
叠加层视频的VDMA配置为只写模式,如下:
在这里插入图片描述
综合后的工程代码架构如下:
在这里插入图片描述
综合编译完成后的FPGA资源消耗和功耗预估如下:
在这里插入图片描述

SDK工程详解

SDK工程代码架构如下:
在这里插入图片描述
自定义视频叠加API及其入口参数如下:

//video_width-->原视频宽度
//video_height-->原视频高度
//zoom_x-->提取原视频的x轴起始位置,提取的原视频区域作为叠加的视频
//zoom_y-->提取原视频的y轴起始位置,提取的原视频区域作为叠加的视频
//zoom_w-->叠加的视频宽度
//zoom_h-->叠加的视频高度
//overly_x-->叠加的视频在底层视频中的起始x轴坐标
//overly_y-->叠加的视频在底层视频中的起始y轴坐标
//overly_w-->叠加的视频缩放后的宽度
//overly_h-->叠加的视频缩放后的高度
//overly_alpha-->叠加的视频与底层视频之间的透明度

void helai_mix(u32 video_width,u32 video_height,u32 zoom_x,u32 zoom_y,u32 zoom_w,u32 zoom_h,u32 overly_x,
		       u32 overly_y,u32 overly_w,u32 overly_h,u32 overly_alpha){
	//初始化
	XOverlaystream_Initialize(&overlaystreamInstance, XPAR_OVERLAYSTREAM_0_DEVICE_ID);
	//取视频的地址,这里取VDMA的第一帧地址
	XOverlaystream_Set_pMem(&overlaystreamInstance,VIDEO1_BASEADDR1);
	//使能
	XOverlaystream_EnableAutoRestart(&overlaystreamInstance);
	//启动
	XOverlaystream_Start(&overlaystreamInstance);
	//配置参数
	XOverlaystream_Set_cols(&overlaystreamInstance, video_width);
	XOverlaystream_Set_rows(&overlaystreamInstance, video_height);
	XOverlaystream_Set_zoom_x(&overlaystreamInstance, zoom_x);
	XOverlaystream_Set_zoom_y(&overlaystreamInstance, zoom_y);
	XOverlaystream_Set_zoom_w(&overlaystreamInstance, zoom_w);
	XOverlaystream_Set_zoom_h(&overlaystreamInstance, zoom_h);
	XOverlaystream_Set_overly_x(&overlaystreamInstance, overly_x);
	XOverlaystream_Set_overly_y(&overlaystreamInstance, overly_y);
	XOverlaystream_Set_overly_w(&overlaystreamInstance, overly_w);
	XOverlaystream_Set_overly_h(&overlaystreamInstance, overly_h);
	XOverlaystream_Set_overly_alpha(&overlaystreamInstance, overly_alpha);
}

主函数如下:

int main()
{
    init_platform();
    I2C_config_init(DeviceId_0);
    I2C_config_init(DeviceId_1);
	helai_vdma();
	helai_mix(1280,720,1280/2-200,720/2-200,400,400,0,0,1280/2,720/2,40);
	while(1);
    cleanup_platform();
    return 0;
}

6、上板调试验证

静态演示如下:
在这里插入图片描述
我用到的开发板FPGA型号为xc7z100ffg900-2;板载一路HDMI输出接口,没有HDMI编码芯片,由FPGA逻辑资源驱动;
工程1,即单路同源视频的缩放叠加的输出视频如下:

1路同源视频叠加


工程2,即2路非同源视频的缩放叠加的输出视频如下:

2路非同源视频叠加

7、福利:工程代码的获取

福利:工程代码的获取
代码太大,无法邮箱发送,以某度网盘链接方式发送,
资料获取方式1:私,或者文章末尾的V名片。
网盘资料如下:
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL底层数据结构

1、引入 一个sql语句在mysql中究竟是如何运行的?又应该通过怎样的方式去查找我们要找的数据?这里就涉及到几种存储数据的算法; 可以做索引的数据结构有数组、链表、二叉搜索树和B树(B-树、B树)。 2、各种数据结构 …

flutter多版本切换

方式一:符号连接(软链接) 注:无需修改环境变量,也不用重启AndroidStudio mac具体flutter版本切换操作步骤: 1、项目clean然后切换自己需要的分支 2、删除文件夹flutter目录文件(这里的flutter是原来的符号连接&…

若依集成分库分表(一)

1.本次需求为同库分表 1.1 引入pom依赖 <!-- sharding-jdbc分库分表 --> <dependency><groupId>org.apache.shardingsphere</groupId><artifactId>sharding-jdbc-core</artifactId><version>4.1.1</version> </dependenc…

Linux内核中内存管理相关配置项的详细解析2

接前一篇文章&#xff1a;Linux内核中内存管理相关配置项的详细解析1 3. Default compressor&#xff08;默认压缩器&#xff09; 此项展开后如下图所示&#xff1a; 此项的内核源码详细解释为&#xff1a; Selects the default compression algorithm for the compressed cac…

谷歌发布一个免费的生成式人工智能课程

在过去几周&#xff0c;我们看到的都是AI将如何改变生活&#xff0c;无论是ChatGPT的文本生成&#xff0c;还是SD&#xff0c;Midjourney 的图像生成&#xff0c;这些AI的特点就是都是生成式的AI。而几天前&#xff0c;谷歌推出了一个生成式人工智能学习课程&#xff0c;课程涵…

美团太细了:Springcloud 微服务优雅停机,如何实现?

说在前面 关于Spring Boot、Spring Cloud应用的优雅停机&#xff0c;平时经常会被问到&#xff0c;这也是实际应用过程中&#xff0c;必须要掌握的点。 在40岁老架构师 尼恩的读者社区(50)中&#xff0c;最近有小伙伴拿到了一线互联网企业如美团、拼多多、极兔、有赞、希音的…

深度学习应用篇-计算机视觉-语义分割综述[5]:FCN、SegNet、Deeplab等分割算法、常用二维三维半立体数据集汇总、前景展望等

【深度学习入门到进阶】必看系列&#xff0c;含激活函数、优化策略、损失函数、模型调优、归一化算法、卷积模型、序列模型、预训练模型、对抗神经网络等 专栏详细介绍&#xff1a;【深度学习入门到进阶】必看系列&#xff0c;含激活函数、优化策略、损失函数、模型调优、归一化…

【新版】系统架构设计师 - 软件可靠性分析与设计

个人总结&#xff0c;仅供参考&#xff0c;欢迎加好友一起讨论 文章目录 架构 - 软件可靠性分析与设计考点摘要可靠性相关基本概念软件可靠性分析可靠性指标串联系统&#xff08;可靠性&#xff09;并联系统&#xff08;可靠性&#xff09;混合系统&#xff08;可靠性&#xff…

(转载)从0开始学matlab—总结

1.编程实例 下面的例子将向大家介绍如何用 MATLAB 解决问题。 例1 温度转换程序 问题&#xff1a; 设计一个 MATLAB 程序&#xff0c;读取一个华氏温度的输入&#xff0c;输出开尔文温度。 答案&#xff1a; 华氏温度和开尔文温度的转换关系式可在物理学课本中找到。其关系式…

压力测试分为稳定性测试和破坏性测试

压力测试分为稳定性测试和破坏性测试 压力测试是一种对软件系统进行负载测试的常见手段&#xff0c;可以评估其在不同负载条件下的稳定性、性能和可靠性等指标。常见的压力测试分为两种类型&#xff1a;稳定性测试和破坏性测试。 1. 稳定性测试 稳定性测试也称为基准测试&#…

shell脚本基础3——正则表达式

文章目录 一、基本了解二、基本正则表达式2.1 字符匹配2.2 位置锚定2.3 匹配次数2.4 分组 三、扩展正则表达式3.1 字符匹配3.2 位置锚定3.3 匹配次数3.4 分组3.5 或者 一、基本了解 正则表达式分2种&#xff1a;基本正则表达式和扩展正则表达式。grep 、sed命令使用正则较多&am…

软考A计划-系统架构师-官方考试指定教程-(9/15)

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&am…

spiderflow的初步使用

1、简介 spider-flow 是一个爬虫平台&#xff0c;以图形化方式定义爬虫流程&#xff0c;无需代码即可实现一个爬虫 官网地址&#xff1a;https://www.spiderflow.org/ 2、spiderflow的初步使用 2.1拉取&#xff0c;配置和启动 从gitee上拉取 执行db里面的sql 里面会有6张表 …

为什么说高性能计算工程师越老越吃香?还难以被AI替代?

一般越老越吃香的岗位或者行业&#xff0c;一定是拥有无法或者难以轻易被替代的经验。 这些经验一般是靠时间、靠思维、靠试错不断积累起来的。然而AIGC来了&#xff0c;好像宣布AI会取代所有人一样&#xff0c;如经验丰富的律师、医生、教师等等&#xff0c;尤其是贡献了AIGC…

java ssm贸易平台-物流管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java ssm贸易平台-物流管理系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主…

【运维知识进阶篇】用阿里云部署kod可道云网盘(DNS解析+CDN缓存+Web应用防火墙+弹性伸缩)

本篇文章依托kod可道云项目继续介绍阿里云产品&#xff0c;介绍DNS解析&#xff0c;CDN缓存&#xff0c;Web应用防火墙&#xff0c;弹性伸缩。 DNS解析 这里我将二级域名设为kod&#xff0c;一般都是设为www和&#xff0c;带表示可以不加二级域名&#xff0c;直接访问。也可以…

基于html+css的图展示117

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

Java 八股文-集合框架篇

Java 集合框架 一、常见集合 1.说说有哪些常见集合&#xff1f; 集合相关类和接口都在java.util中&#xff0c;主要分为3种&#xff1a;List&#xff08;列表&#xff09;、Map&#xff08;映射&#xff09;、Set(集)。 其中Collection是集合List、Set的父接口&#xff0c…

AI热度降温?揭秘加德纳技术成熟度曲线与AI发展阶段

一文解决你所有对 AI 的焦虑 近期&#xff0c;我们发现ChatGPT的热度似乎不如前几个月。许多人尝试了这个技术&#xff0c;觉得它非常强大&#xff0c;但似乎与自己的日常生活和工作关系不大&#xff0c;因此逐渐失去了兴趣。 然而&#xff0c;这实际上是技术发展的正常周期&…

学术界用ChatGPT写论文,真的靠谱吗?

写论文时&#xff0c;赵铭用ChatGPT查询了国内外云计算技术的研究进展&#xff0c;并请它一一详细介绍。他用搜索引擎简单核实了真实性&#xff0c;润色后就放进了论文中&#xff0c;“我感觉它说的东西都是一些现状&#xff0c;也没什么好调整的&#xff0c;就直接用了&#x…