FPGA實現任意角度視頻旋轉(二)視頻90度/270度無裁剪旋轉

本文主要介紹如何基于FPGA實現視頻的90度/270度無裁剪旋轉,旋轉效果示意圖如下:
在這里插入圖片描述

為了實時對比旋轉效果,采用分屏顯示進行處理,左邊代表旋轉前的視頻在屏幕中的位置,右邊代表旋轉后的視頻在屏幕中的位置。 分屏顯示的實現方式見本專欄前面的文章詳解。

本旋轉方案不僅僅適用于國產安路FPGA,只有板卡上帶有支持AXI4總線操作DDR的IP核,均可以進行方案移植

關于FPGA實現視頻180度實時旋轉,點擊跳轉文章鏈接

關于FPGA實現視頻任意角度旋轉,點擊跳轉文章鏈接

一、前言

  • 后續文章的工程代碼不在免費上傳至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全部設置為某一個像素點的數據即可。

該模塊中核心的部分在于地址計算,詳見源代碼。

四、移植注意事項

1、本工程視頻源輸入的視頻分辨率為1280×720@60hz

2、使用串口命令發送16進制 00 視頻進行順時針90度旋轉, 01 視頻進行順時針270度旋轉,波特率為115200。

五、上板驗證

視頻旋轉效果圖如下,下圖分別為旋轉90度和270度的結果
在這里插入圖片描述
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/67159.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/67159.shtml
英文地址,請注明出處:http://en.pswp.cn/web/67159.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

JavaEE:多線程進階

JavaEE:多線程進階 一、對比不同鎖策略之間的應用場景及其區別1. 悲觀鎖 和 樂觀鎖1.1 定義和原理1.2 應用場景1.3 示例代碼 2. 重量級鎖 和 輕量級鎖2.1 定義和原理2.2 應用場景2.3 示例代碼 3. 掛起等待鎖 和 自旋鎖3.1 定義和原理3.2 應用場景3.3 示例代碼 4. 幾…

董事會辦公管理系統的需求設計和實現

該作者的原創文章目錄: 生產制造執行MES系統的需求設計和實現 企業后勤管理系統的需求設計和實現 行政辦公管理系統的需求設計和實現 人力資源管理HR系統的需求設計和實現 企業財務管理系統的需求設計和實現 董事會辦公管理系統的需求設計和實現 公司組織架構…

pytest自動化測試 - pytest夾具的基本概念

<< 返回目錄 1 pytest自動化測試 - pytest夾具的基本概念 夾具可以為測試用例提供資源(測試數據)、執行預置條件、執行后置條件&#xff0c;夾具可以是函數、類或模塊&#xff0c;使用pytest.fixture裝飾器進行標記。 1.1 夾具的作用范圍 夾具的作用范圍&#xff1a; …

esp32-C3 實現DHT11(溫濕度)

安裝DHT傳感器庫&#xff1a; 在Arduino IDE中&#xff0c;進入項目 > 加載庫 > 管理庫。搜索DHT sensor library并安裝。 編寫代碼 定義引腳和傳感器類型初始化傳感器判斷傳感器是否正常讀取數據 源碼 #include <DHT.h> #include <DHT_U.h>// 定義DHT傳感器…

java構建工具之Gradle

自定義任務 任務定義方式&#xff0c;總體分為兩大類:一種是通過 Project 中的task()方法,另一種是通過tasks 對象的 create 或者register 方法。 //任務名稱,閉包都作為參數println "taskA..." task(A,{ }) //閉包作為最后一個參數可以直接從括號中拿出來println …

【Pytest】生成html報告中,中文亂碼問題解決方案

import pytestif __name__ "__main__":# 只運行 tests 目錄下的測試用例&#xff0c;并生成 HTML 報告pytest.main([-v, -s, --htmlreport.html, tests])可以以上方式生成&#xff0c;也可以在pytest.ini中設置 [pytest] addopts --htmlreport.html --self-contai…

MyBatis最佳實踐:提升數據庫交互效率的秘密武器

第一章&#xff1a;框架的概述&#xff1a; MyBatis 框架的概述&#xff1a; MyBatis 是一個優秀的基于 Java 的持久框架&#xff0c;內部對 JDBC 做了封裝&#xff0c;使開發者只需要關注 SQL 語句&#xff0c;而不關注 JDBC 的代碼&#xff0c;使開發變得更加的簡單MyBatis 通…

《Java程序設計》課程考核試卷

一、單項選擇題&#xff08;本大題共10個小題&#xff0c;每小題2分&#xff0c;共20分&#xff09; 1.下列用來編譯Java源文件為字節碼文件的工具是&#xff08; &#xff09;。 A.java B.javadoc C.jar D.javac 2…

【25考研】人大計算機考研復試該怎么準備?有哪些注意事項?

人大畢竟是老牌985&#xff0c;復試難度不會太低&#xff01;建議同學認真復習&#xff01;沒有機試還是輕松一些的&#xff01; 一、復試內容 由公告可見&#xff0c;復試包含筆試及面試&#xff0c;沒有機試&#xff01; 二、參考書目 官方無給出參考書目&#xff0c;可參照…

vue3中Teleport的用法以及使用場景

1. 基本概念 Teleport 是 Vue3 提供的一個內置組件&#xff0c;它可以將組件的內容傳送到 DOM 樹的任何位置&#xff0c;而不受組件層級的限制。這在處理模態框、通知、彈出菜單等需要突破組件層級限制的場景中特別有用。 1.1 基本語法 <template><teleport to&quo…

使用openwrt搭建ipsec隧道

背景&#xff1a;最近同事遇到了個ipsec問題&#xff0c;做的ipsec特性&#xff0c;ftp下載ipv6性能只有100kb, 正面定位該問題也蠻久了&#xff0c;項目沒有用openwrt, 不過用了開源組件strongswan, 加密算法這些也是內核自帶的&#xff0c;想著開源的不太可能有問題&#xff…

基于AnolisOS 8.6安裝GmSSL 3.1.1及easy_gmssl庫測試國密算法

測試環境 Virtual Box&#xff0c;AnolisOS-8.6-x86_64-minimal.iso&#xff0c;4 vCPU, 8G RAM, 60 vDisk。最小化安裝。需聯網。 系統環境 關閉防火墻 systemctl stop firewalld systemctl disable firewalld systemctl status firewalld selinux關閉 cat /etc/selinux/co…

HTML從入門到精通:鏈接與圖像標簽全解析

系列文章目錄 01-從零開始學 HTML&#xff1a;構建網頁的基本框架與技巧 02-HTML常見文本標簽解析&#xff1a;從基礎到進階的全面指南 03-HTML從入門到精通&#xff1a;鏈接與圖像標簽全解析 文章目錄 系列文章目錄前言一、鏈接與圖像標簽&#xff08;HTML 標簽基礎&#xff…

[STM32 - 野火] - - - 固件庫學習筆記 - - -十一.電源管理系統

一、電源管理系統簡介 電源管理系統是STM32硬件設計和系統運行的基礎&#xff0c;它不僅為芯片本身提供穩定的電源&#xff0c;還通過多種電源管理功能優化功耗、延長電池壽命&#xff0c;并確保系統的可靠性和穩定性。 二、電源監控器 作用&#xff1a;保證STM32芯片工作在…

數字圖像處理:實驗六

uu們&#xff01;大家好&#xff0c;2025年的新年就要到來&#xff0c;咸魚哥在這里祝大家在2025年每天開心快樂&#xff0c;天天掙大錢&#xff0c;自由自在&#xff0c;健健康康&#xff0c;萬事如意&#xff01;&#xff08;要是咸魚哥嘴笨的話&#xff0c;還望大家多多包涵…

Langchain+文心一言調用

import osfrom langchain_community.llms import QianfanLLMEndpointos.environ["QIANFAN_AK"] "" os.environ["QIANFAN_SK"] ""llm_wenxin QianfanLLMEndpoint()res llm_wenxin.invoke("中國國慶日是哪一天?") print(…

上海亞商投顧:滬指沖高回落 大金融板塊全天強勢 上海亞商投

上海亞商投顧前言&#xff1a;無懼大盤漲跌&#xff0c;解密龍虎榜資金&#xff0c;跟蹤一線游資和機構資金動向&#xff0c;識別短期熱點和強勢個股。 一&#xff0e;市場情緒 市場全天沖高回落&#xff0c;深成指、創業板指午后翻綠。大金融板塊全天強勢&#xff0c;天茂集團…

農產品價格報告爬蟲使用說明

農產品價格報告爬蟲使用說明 # ************************************************************************** # * * # * 農產品價格報告爬蟲 …

3.4 Go函數作用域(標識符)

作用域標識符 簡單來說&#xff0c;作用域指的是標識符可以起作用的范圍&#xff0c;即其可見范圍。將標識符的可見性限制在一定范圍內&#xff0c;這個范圍就是作用域。 把標識符約束在一定的可見范圍內&#xff0c;這個范圍就是作用域。 1. 宇宙塊 特點&#xff1a;預定義…

kaggle比賽入門 - House Prices - Advanced Regression Techniques(第二部分)

本文承接上一篇 1. 分析住宅類型&#xff08;BldgType&#xff09;的分布以及它們與銷售價格&#xff08;SalePrice&#xff09;的關系 # 1. distribution of dwelling types and their relation to sale prices # BldgType: Type of dwellingdwelling_types df[BldgType].v…