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

news2024/11/18 14:42:27

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的地址部分,

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

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

相关文章

感染了后缀为.jayy勒索病毒如何应对?数据能够恢复吗?

导言: 在当今数字化的世界中,网络安全已经成为了每个人都需要关注的重要议题。而勒索病毒作为网络安全领域中的一大威胁,不断地演变和升级,给个人和组织带来了严重的损失和困扰。近期,一种名为.jayy的勒索病毒引起了广…

java数据结构与算法刷题-----LeetCode415. 字符串相加

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846 文章目录 模拟小学加法运算 模拟小学加法运算 解题思路:时间复…

【Java设计模式】创建型——工厂方法模式

目录 背景/问题解决方案思路方案 图解简单工厂模式/静态工厂模式工厂方法模式 代码示例:图形工厂意图主要解决何时使用如何解决关键代码 工厂模式的优点工厂模式的缺点使用场景注意事项 背景/问题 在软件设计中,我们经常遇到需要创建不同类型对象的情况…

如何理解模板?

文章目录 1. 泛型编程2.函数模板2.1函数模板概念2.1函数模板格式2.3函数模板的原理2.4函数模板的实例化2.5模板参数的匹配原则 3.类模板3.1类模板的定义格式3.2类模板的实例化 1. 泛型编程 如何实现一个通用的交换函数呢? void Swap(int& left, int& right)…

Vue中如何使用Tailwind CSS样式?多次引用不成功?具体步骤怎么做?

一、安装Tailwind CSS和依赖 在你的Vue项目中安装Tailwind CSS及其依赖。你可以使用npm或yarn来安装。 npm install tailwindcsslatest postcsslatest autoprefixerlatest # 或者yarn add tailwindcsslatest postcsslatest autoprefixerlatest 二、初始化Tailwind CSS np…

【事务注解✈️✈️】@Transactional注解在不同参数配置下的功能实现

目录 前言 使用场景 1.单个方法层面 2.类级别使用 3.指定异常回滚 4.跨方法调用事务管理 5.只读事务 ​ 6.设置超时时间,超时则自动回滚 7.隔离级别设置 章末 前言 小伙伴们大家好,ACID(原子性,一致性,隔离…

【WEEK6】 【DAY1】DQL查询数据-第一部分【中文版】

2024.4.1 Monday 目录 4.DQL查询数据(重点!)4.1.Data Query Language查询数据语言4.2.SELECT4.2.1.语法4.2.2.实践4.2.2.1.查询字段 SELECT 字段/* FROM 表查询全部的某某查询指定字段 4.2.2.2.给查询结果或者查询的这个表起别名&#xff08…

2024免费Mac苹果解压压缩包软件BetterZip5

在2024年,对于Mac电脑用户来说,如果你想要无需解压就能快速查看压缩文档的内容,BetterZip是一个极佳的选择。这款软件不仅支持多种格式的压缩和解压,如zip、rar、7z、tar等,还具备丰富的功能和设置,包括预览…

【异常解决】Non-terminating decimal expansion; no exact representable decimal result.

Non-terminating decimal expansion; no exact representable decimal result. 一、背景描述二、异常原因三、解决方案四、RoundingMode(舍入模式)4.1、ROUND_UP4.2、ROUND_DOWN4.3、ROUND_CEILING4.4、ROUND_FLOOR4.5、ROUND_HALF_UP(四舍五…

SQL语句的编写

##创建用户-建表建库 #创建一个用户名为 feng,允许从任何主机 % 连接,并使用密码 sc123456 进行身份验证的用户。 rootTENNIS 16:33 scmysql>create user feng% identified by sc123456; Query OK, 0 rows affected (0.04 sec) #创建一个名为fen…

软考113-上午题-【计算机网络】-IPv6、无线网络、Windows命令

一、IPv6 IPv6 具有长达 128 位的地址空间,可以彻底解决 IPv4 地址不足的问题。由于 IPv4 地址是32 位二进制,所能表示的IP 地址个数为 2^32 4 294 967 29640 亿,因而在因特网上约有 40亿个P 地址。 由 32 位的IPv4 升级至 128 位的IPv6&am…

ChromeOS 中自启动 Fcitx5 和托盘 stalonetray

ChromeOS 更新的飞快,旧文章的方法也老是不好用,找遍了也没找到很好的可以开机自启动 Linux VM 和输入法、托盘的方法。 研究了一下(不,是很久),终于找到个丑陋的实现。 方法基于 ChromeOS 123.0.6312.94…

域名应该如何实名?域名应该如何备案?域名如何解析到服务器

大家好欢迎来到易极赞,今天我们来跟大家聊一下“域名应该如何实名以及备案”这个话题。 域名实名认证是验证域名所有者身份的过程,以确保域名的合法性,通常需要登录到域名服务商后台,进行域名的注册,注册后创建域名模…

MYSQL 锁机制 与 MVCC多版本并发

MYSQL锁机制与优化以及MVCC底层原理 锁分类 乐观锁,悲观锁 从性能上分为乐观锁(版本对比,版本一致就更新,不一致就不更新或CAS机制)和悲观锁(锁住资源等待),乐观锁适合读比较多的场景&#x…

Unity和Android的交互

Unity和Android的交互 一、前言二、Android导出jar/aar包到Unity2.1 版本说明2.2 拷贝Unity的classes.jar给Android工程2.2.1 classes.jar的位置2.2.2 Android Studio创建module2.2.3 拷贝classes.jar 到 Android工程并启用 2.3 编写Android工程代码2.3.1 创建 MainActivity2.…

springboot之mybatisPlus多表查询及分页查询

文章目录 一、多表查询二、mybatis-plus条件查询三、分页查询 一、多表查询 可能会用到的注解 这里的场景是,查询每个用户及其所有的订单。就是查询你的id号的同时,把你所有的历史订单信息都拉出来。 表结构这样 CREATE TABLE User ( id INT PRIMARY…

Pytorch数据结构:GPU加速

文章目录 一、GPU加速1. 检查GPU可用性:2. GPU不可用需要具体查看问题3. 指定设备4.将张量和模型转移到GPU5.执行计算:6.将结果转移回CPU 二、转移原理1. 数据和模型的存储2. 数据传输3. 计算执行4. 设备管理5.小结 三、to方法的参数类型 一、GPU加速 .…

Jetson nano部署Yolov8 安装Archiconda3+创建pytorch环境(详细教程+错误解决)

由于jetson nano 是aarch64架构,Anaconda官方不支持aarch64架构,所以有了一个叫“Archiconda”,其目的就是将conda移植到aarch64平台上 一. 下载地址Releases Archiconda/build-tools GitHub 然后安装archiconda bash Archiconda3-0.2.3…

stm32 HAL中断GPIO——1

1选择引脚为中断 中断详细配置 1 模式选择 上拉下拉 再点击NVIC可进行分组 再勾选如图 总结步骤 1选择中断 2配置时钟//选择外部时钟 3配置模式 4勾选NVIC

绝地求生:2024工资杯S2D2:单日前五队伍瓜分吃鸡,CCG暂居积分总榜首!

2024工资杯S2第二天小组赛结束,今日场上吃鸡和分数被CCG、17、AVG、PeRo、CTG这五支队伍瓜分,在XDD回归后,PeRo更是打出了单场20杀吃鸡大分局。 目前CCG以122分暂居小组积分榜首,AVG、MNG紧随其后,明日BC组&#xff0c…