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

news/2025/1/24 17:55:15/

本文主要介绍如何基于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/news/1565838.html

相关文章

3.2 Go 返回值详解

在 Go 语言中,函数调用完成后会产生一个返回值,该值的类型和数量取决于函数定义。返回值在函数调用结束时通过 return 语句返回,具体规则如下: 一. 返回值的基本规则 1.返回值类型: 返回值必须有类型,类…

云计算中的微服务架构是什么

云计算中的微服务架构是什么 从巨石到微服务:一场架构革命 还记得早期软件开发吗?一个庞大的单体应用,就像一个臃肿的巨人,笨重且脆弱。微服务就是这个巨人的解体与重生。 想象一下,你正在搭建一个电商平台。过去&a…

CentOS7使用源码安装PHP8教程整理

CentOS7使用源码安装PHP8教程整理 下载安装包解压下载的php tar源码包安装所需的一些依赖扩展库安装前的配置修改配置文件1、进入php8的安装包 配置环境变量开机自启启动服务创建软连接常见问题1、checking for icu-uc > 50.1 icu-io icu-i18n... no2、configure: error: Pa…

DBSyncer开源数据同步中间件

一、简介 DBSyncer(英[dbsɪŋkɜː(r)],美[dbsɪŋkɜː(r) 简称dbs)是一款开源的数据同步中间件,提供MySQL、Oracle、SqlServer、PostgreSQL、Elasticsearch(ES)、Kafka、File、SQL等同步场景。支持上传插件自定义同步转换业务,提供监控全量…

【MySQL】 常见数据类型

MySQL常见数据类型 1.整数类型2.浮点数类型3.定点数类型4.bit类型5.字符串类型 5.1char和varchar类型5.2日期类型和时间类型5.3enum和set类型 1.整数类型 整数类型默认都是有符号整数 类型名称 字节数 类型说明 tinyint 1 带符号的范围-128127,无符号范围…

第三章 C 开头的术语

文章目录 第三章 C 开头的术语以 C 开头的术语CLASSPATH计算属性 (calculated property)调用方法 (call method)Callin 接口 (callin interface)回调方法 (callback method)标准形式 (canonical form)级联点语法 (cascading dot syntax)字符集 (character set)字符流 (characte…

MarsCode青训营打卡Day10(2025年1月23日)|稀土掘金-147.寻找独一无二的糖葫芦串、119.游戏队友搜索

资源引用: 147.寻找独一无二的糖葫芦串 119.游戏队友搜索 今日小记: 回乡聚会陪家人,休息一天~ 稀土掘金-147.寻找独一无二的糖葫芦串(147.寻找独一无二的糖葫芦串) 题目分析: 给定n个长度为m的字符串表…

OpenCV边沿检测(Python版)

边缘检测是图像处理中的一项重要任务,用于找到图像中的边界或边缘。它在计算机视觉、图像处理和模式识别等领域中具有广泛的应用。 边缘可以被定义为图像亮度、颜色或纹理的突变区域。边缘检测算法旨在识别这些变化并将其标记为边缘。边缘检测可以用于分割图像、检测…