FPGA实现任意角度视频旋转(二)视频90度/270度无裁剪旋转

devtools/2025/1/24 15:05:39/

本文主要介绍如何基于FPGA实现视频的90度/270度无裁剪旋转,关于视频180度实时旋转,请见本专栏前面的文章,旋转效果示意图如下:
在这里插入图片描述

为了实时对比旋转效果,采用分屏显示进行处理,左边代表旋转前的视频在屏幕中的位置,右边代表旋转后的视频在屏幕中的位置。 分屏显示的实现方式见本专栏前面的文章详解。

本旋转方案不仅仅适用于国产安路FPGA,只有板卡上带有支持AXI4总线操作DDR的IP核,均可以进行方案移植

一、前言

  • 后续文章的工程代码不在免费上传至Github,方案是开源的,工程代码可以私信我或者是评论区留言,有偿提供(价格不贵,此文章对应的工程文件为 ¥50)。前面已经发布的文章方案和代码均是开源的,可以直接去github下载。

  • 免费内容太容易被剽窃了,付费是某种意义上的版权保护

  • 付费即意味着责任,有利于提高文章质量、同时也能提高更新动力。

二、设计概述

除去DDR3控制器、FIFO等常用IP,本设计所用到的主要的IP模块如下。

IP功能来源
uidbuf基于FDMA信号时序的缓存控制器
适合用于基于RGB时序的视频数据或者数据流传输
米联客
uiFDMA基于AXI总线的自定义内存控制器
简化AXI总线的控制,完成数据的搬运
米联客
uidbuf_w_active_rotate在uidbuf的基础上进行更改
用于视频90度/270度旋转
个人开发
uivtc_video_rotate_90在uivtc的基础上进行更改
读取两路视频,一路是旋转之前的视频,一路是旋转之后的视频
个人开发

三、系统实现方案

3.1 理论分析

在实现视频90/270度旋转时,我们无法像前面的文章那样,在使用AXI4总线读写DDR时,把突发长度为一整行的像素量。

由于原始视频在经过旋转后,对应的像素点位置不在是连续的,因此我们不得不考虑把突发长度设置为1进行像素点的写入/读取。

根据现在可以找到的有关FPGA实现视频任意角度旋转的文章可以得知,在进行视频旋转时,我们可以采用正向映射/逆向映射两种方式进行视频旋转的处理。

在进行视频任意角度旋转时(比如31度),为了保证旋转后的视频无空洞,需要采用逆向映射的旋转方案进行处理(下一篇文章介绍任意角度旋转实现方案)。

在视频处理中,对于 90 度或 270 度的旋转操作较为常见。由于视频像素点在完成这类旋转后,其排列呈现出明显的规律性,因此针对这类旋转的处理方式,我们可以采用正向映射的方案进行处理,把输入进的待旋转视频数据依次写入旋转后对应的像素点位置。

3.2 数据流框图

在这里插入图片描述
为了处理输入进的60hz的待旋转视频,视频像素点的数据流如上图所示,其经历了三进三出DDR3,最终输出至显示器进行显示。

  • 第一次读写DDR3:由于输入进来的视频为60帧的帧率,如果直接对视频进行逐像素点写入,是处理不过来的。(具体我们的板卡能实现多高的处理速率,取决于我们使用的DDR控制器IP从发起写请求到一个像素点完全写入需要的时间,这个需要自行计算一下)因此,第一次缓存的目的是把输入进来的视频数据先存进DDR3,以一个较低的帧率读出像素数据至旋转处理模块。
  • 第二次读写DDR3:把刚刚读出的经过降帧的数据,进行90度/270度旋转处理,然后存进DDR,并以较低的帧率读出
  • 第三次读写DDR3:把刚刚读出的经过降帧的并且是旋转后数据,再次存进DDR,然后就可以以正常的60帧读出进行显示。

上述处理的核心在于旋转模块的实现。

3.3 uidbuf_w_active_rotate模块

此模块采用正向映射的方法进行90度/270度旋转,把待旋转的数据依次写入到像素点旋转后对应的位置
模块接口如下,相比于uibuf模块,不同的部分用红框圈出。
在这里插入图片描述
此方案中,使用AXI4总线读写DDR时,AXI4总线的数据宽度为128,像素点的数据位宽为16,因为DDR3采用的是8-bit预取,DDR3的位宽配置为16bit,所以在突发长度为1的情况下,一次可以读出8个16bit数据(128bit),在常规情况下,一次能读出8个像素点数据。

然而,在进行旋转时,为了保证每一次只传输一个像素数据,我们把这128bit全部设置为某一个像素点的数据即可。

该模块中核心的部分在于地址计算,详见源代码。

四、移植注意事项

2、本工程视频源输入的视频分辨率为1280×720@60hz

3、使用串口命令发送16进制 00 视频进行顺时针90度旋转, 01 视频进行顺时针270度旋转,波特率为115200。

五、上板验证

视频旋转效果图如下,下图分别为旋转90度和270度的结果
在这里插入图片描述
在这里插入图片描述


http://www.ppmy.cn/devtools/153162.html

相关文章

【负载均衡式在线OJ】加载题目信息(文件版)

目录 如何读取文件 -- 常见流程 代码 如何读取文件 -- 常见流程 在C中使用 std::ifstream来打开文件流是一个常见的操作,用于创建一个输入文件流,并尝试打开名为 question_list的文件。if (!in.is_open()):检查文件是否成功打开。如果文件未…

靠右行驶数学建模分析(2014MCM美赛A题)

笔记 题目 要求分析: 比较规则的性能,分为light和heavy两种情况,性能指的是 a.流量与安全 b. 速度限制等分析左侧驾驶分析智能系统 论文 参考论文 两类规则分析 靠右行驶(第一条)2. 无限制(去掉了第一条…

【行空板K10】项目实践案例征集 跨学科案例 研究蒸发量

目录 项目来源 项目简介 项目知识点 项目原理 物联网硬件架构 硬件简介 硬件接线原理 硬件接线实物 实验流程 实验注意事项 程序截图 项目数据表 总结 本文首发于DF创客社区:项目实践案例征集 跨学科案例 行空板K10 研究蒸发量 DF创客社区https://mc.d…

计算机网络之运输层

本文章目录结构出自于《王道计算机考研 计算机网络_哔哩哔哩_bilibili》 04 传输层 在网上看到其他人做了相关笔记,就不再多余写了,直接参考着学习吧。 王道考研 计算机网络笔记 第五章:传输层_王道计算机网络传输层_Baret-H的博客-CSDN博…

[Spring] Nacos详解

🌸个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 🏵️热门专栏: 🧊 Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 🍕 Collection与…

嵌入式知识点总结 C/C++ 专题提升(七)-位操作

针对于嵌入式软件杂乱的知识点总结起来,提供给读者学习复习对下述内容的强化。 目录 1.位操作基础 2.如何求解整型数的二进制表示中1的个数 ? 3.如何求解二进制中0的个数 4.交换两个变量的值,不使用第三个变量。即a3,b5,交换之后a5,b3: 5.给定一个…

易语言模拟真人鼠标轨迹算法 - 防止游戏检测

一.简介 鼠标轨迹算法是一种模拟人类鼠标操作的程序,它能够模拟出自然而真实的鼠标移动路径。 鼠标轨迹算法的底层实现采用C/C语言,原因在于C/C提供了高性能的执行能力和直接访问操作系统底层资源的能力。 鼠标轨迹算法具有以下优势: 模拟…

OpenCV: 深入理解OpenCV中CV_WRAP_AS宏及其作用

在 OpenCV 中,CV_WRAP_AS 是一个宏,主要用于 为 C 函数或运算符定义别名,以便在生成语言绑定时使用。这对于在不同的编程语言(如 Python)中使用 OpenCV 库时提供更友好的接口非常有用。尽管它在 C 代码中不会改变函数的…