当前位置: 首页 > news >正文

12.自定义的多帧缓存架构

1.简介

  在数字图像处理中,经常需要用到的一个架构就是多帧缓存。视频流中需要用到多帧缓存来防止帧撕裂现象,图像处理中也需要帧差法来做移动目标检测。因此一个多帧缓存架构在图像系统的设计中是十分重要的。

2.多帧缓存

  在视频流中,通常不能保证数据的写入和读取是同样帧率的,写快读慢或者写慢读快都是常见现象。如果读写都在同一片内存地址中,那么将不能保证读出的一帧是完整的一帧图像,它很有可能是写入的图像中前多帧拼接而成的,这样就会造成帧撕裂的情况。
  假设写是读的三倍速度,且只缓存一帧图像,且读写同时开始操作同一片内存地址。来看看写三帧图像的同时读出的三帧分别发生了什么。
在这里插入图片描述

  (1)可以看出在写完第一帧的时候,读只读了写入第一帧的三分之一。
  (2)开始写第二帧的时候,读的还是第一帧的部分内容。
  (3)第二帧写到中途时,写追上读,第二帧写完后,读的第一帧中间有部分第二帧内容。
  (3)开始写第三帧内容时,由于写是读的三倍速度,此时当读一帧完成时,写第三帧也刚好完成。
  由图可以看出,当写时是读的三倍时,读出的像素不是一副完整的图像,而是有前两帧拼接而成的一副图像。当读写差异过大时,读出的一副图像可能由多幅写入的图像构成,这种现象被叫做帧撕裂。

2.1 乒乓操作

  为了避免帧撕裂,我们通常将读写的地址分开,来确保读出的是一幅完整的图像。最常见的就是乒乓操作。将读写分两片地址来进行。
  乒乓操作将读写分两块内存来进行操作,同一片地址读写交错进行。核心操作就是快等慢
在这里插入图片描述
  读写地址同时从图像缓存区一进行读写,快的操作第一个到达区域二,慢的操作还在区域一。当快的操作先写完操作完一帧图像后,查看慢操作是否在和自己操作同一帧,是的话跳转下一片区域,不是的话继续操作本内存区域,等待慢操作到来。而慢操作只需要按照顺序来操作内存区域即可,不需要查看快操作所操作的内存区域。这就是快等慢。
  假如快操作在操作自己的一片内存区域的时候慢操作到来了,因为快操作比慢操作快,所以也不用担心在一副图像中读出两帧图像。
  由乒乓操作延申出了三帧缓存,多帧缓存架构,多帧缓存的核心思想就是快操作会直接跳过慢操作所在的内存区域。但是这样做有一个缺点,即事先需要知道读写操作的快慢来指导谁跳谁,来确定编程代码
  可不可以做到自适应呢?个人想法:读写操作刚开始时,谁先操作完一副图像,就可以在程序中标记谁是快操作,谁是慢操作,后续根据这个标记来指导读写的内存跳转,即可以做到自适应的多帧缓存结构。编程可能稍微复杂,但是节约内存空间。

2.2 自适应的多帧缓存架构

  另一种的通用自适应多帧缓存架构也是基于多帧缓存的思想提出的。核心操作就是读操作永远是写操作的上一片内存,而写操作就依次操作分配的内存区域。总结就是多帧缓存+写比读低一帧缓存区。这种操作在读写速度一致和读快写慢的时候都可以有效保证帧的完整性,但是在写比读快很多的且读写缓存区域分配不足的时候依然有写追上读而造成帧撕裂的情况。因此需要根据读写速度来分别足够的内存区域来满足多缓存架构的需要。

3 多缓存架构的实现

  在数字图像处理中,视频流通常由SDRAM或者DDR3来进行缓存。SDRAM一般自己编写驱动,DDR3一般借由mig IP核驱动或者用ZYNQ的PS由AXI协议DMA访问。其中mig IP核可以选择AXI接口或者自己的接口。这里我们选择例化mig ip核并启用AXI接口。
  一个完整的视频流传输系统的上电顺序应该为:

系统上电
存储器初始化完成
视频输入系统初始化完成
视频输出系统初始化完成

  基于DDR3以及AXI协议多帧缓存架构的系统图如下:
在这里插入图片描述
  图中的红色区域是为了防止帧断流导致图像错位而无法恢复。每一帧开始时清空fifo和数据拼接区域,帧结束时复位DMA的地址部分,

相关文章:

  • 【PostgreSQL】技术传承:使用Docker快速部署PostgreSQL数据库
  • 游戏引擎中的物理系统
  • 深入探讨string类的奥秘
  • 数据库的简单查询
  • 深入浅出 -- 系统架构之分布式多形态的存储型集群
  • 使用阿里云试用Elasticsearch学习:3.1 处理人类语言——开始处理各种语言
  • 如何进行Python程序的性能优化?
  • 云计算的安全需求
  • 网易雷火 暑期实习提前批一面(48min)
  • 【vite】-【vite介绍】-【vite的基础应用】-【vite的高级应用】-【
  • 【故事】无人机学习之旅
  • QT 线程之movetothread
  • JVM 组成
  • 10.图像高斯滤波的原理与FPGA实现思路
  • 【25考研】:四川大学计算机学院24届874考研考情分析
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • 【个人向】《HTTP图解》阅后小结
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • JavaScript的使用你知道几种?(上)
  • JavaScript异步流程控制的前世今生
  • js
  • laravel with 查询列表限制条数
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • Python3爬取英雄联盟英雄皮肤大图
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • text-decoration与color属性
  • Theano - 导数
  • Yeoman_Bower_Grunt
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 搞机器学习要哪些技能
  • 将 Measurements 和 Units 应用到物理学
  • 码农张的Bug人生 - 初来乍到
  • 目录与文件属性:编写ls
  • 那些被忽略的 JavaScript 数组方法细节
  • 我看到的前端
  • d²y/dx²; 偏导数问题 请问f1 f2是什么意思
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • (70min)字节暑假实习二面(已挂)
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (亲测有效)解决windows11无法使用1500000波特率的问题
  • (十五)devops持续集成开发——jenkins流水线构建策略配置及触发器的使用
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • ****** 二十三 ******、软设笔记【数据库】-数据操作-常用关系操作、关系运算
  • .NET Remoting Basic(10)-创建不同宿主的客户端与服务器端
  • .NET Windows:删除文件夹后立即判断,有可能依然存在
  • .NET 指南:抽象化实现的基类
  • .net6 webapi log4net完整配置使用流程
  • .Net6使用WebSocket与前端进行通信
  • .net专家(高海东的专栏)
  • ?php echo $logosrc[0];?,如何在一行中显示logo和标题?
  • @Async注解的坑,小心
  • [BZOJ4016][FJOI2014]最短路径树问题
  • [C#]winform使用引导APSF和梯度自适应卷积增强夜间雾图像的可见性算法实现夜间雾霾图像的可见度增强