網(wǎng)站建設(shè)學(xué)習(xí)內(nèi)容網(wǎng)絡(luò)服務(wù)提供者知道或者應(yīng)當(dāng)知道
本文主要介紹如何基于FPGA實(shí)現(xiàn)視頻的90度/270度無(wú)裁剪旋轉(zhuǎn),旋轉(zhuǎn)效果示意圖如下:
為了實(shí)時(shí)對(duì)比旋轉(zhuǎn)效果,采用分屏顯示進(jìn)行處理,左邊代表旋轉(zhuǎn)前的視頻在屏幕中的位置,右邊代表旋轉(zhuǎn)后的視頻在屏幕中的位置。 分屏顯示的實(shí)現(xiàn)方式見(jiàn)本專欄前面的文章詳解。
本旋轉(zhuǎn)方案不僅僅適用于國(guó)產(chǎn)安路FPGA,只有板卡上帶有支持AXI4總線操作DDR的IP核,均可以進(jìn)行方案移植
關(guān)于FPGA實(shí)現(xiàn)視頻180度實(shí)時(shí)旋轉(zhuǎn),點(diǎn)擊跳轉(zhuǎn)文章鏈接
關(guān)于FPGA實(shí)現(xiàn)視頻任意角度旋轉(zhuǎn),點(diǎn)擊跳轉(zhuǎn)文章鏈接
一、前言
-
后續(xù)文章的工程代碼不在免費(fèi)上傳至Github,方案是開(kāi)源的,工程代碼可以私信我或者是評(píng)論區(qū)留言,有償提供(價(jià)格不貴,此文章對(duì)應(yīng)的工程文件為 ¥50)。前面已經(jīng)發(fā)布的文章方案和代碼均是開(kāi)源的,可以直接去github下載。
-
免費(fèi)內(nèi)容太容易被剽竊了,付費(fèi)是某種意義上的版權(quán)保護(hù)
-
付費(fèi)即意味著責(zé)任,有利于提高文章質(zhì)量、同時(shí)也能提高更新動(dòng)力。
二、設(shè)計(jì)概述
除去DDR3控制器、FIFO等常用IP,本設(shè)計(jì)所用到的主要的IP模塊如下。
IP | 功能 | 來(lái)源 |
---|---|---|
uidbuf | 基于FDMA信號(hào)時(shí)序的緩存控制器 適合用于基于RGB時(shí)序的視頻數(shù)據(jù)或者數(shù)據(jù)流傳輸 | 米聯(lián)客 |
uiFDMA | 基于AXI總線的自定義內(nèi)存控制器 簡(jiǎn)化AXI總線的控制,完成數(shù)據(jù)的搬運(yùn) | 米聯(lián)客 |
uidbuf_w_active_rotate | 在uidbuf的基礎(chǔ)上進(jìn)行更改 用于視頻90度/270度旋轉(zhuǎn) | 個(gè)人開(kāi)發(fā) |
uivtc_video_rotate_90 | 在uivtc的基礎(chǔ)上進(jìn)行更改 讀取兩路視頻,一路是旋轉(zhuǎn)之前的視頻,一路是旋轉(zhuǎn)之后的視頻 | 個(gè)人開(kāi)發(fā) |
三、系統(tǒng)實(shí)現(xiàn)方案
3.1 理論分析
在實(shí)現(xiàn)視頻90/270度旋轉(zhuǎn)時(shí),我們無(wú)法像前面的文章那樣,在使用AXI4總線讀寫DDR時(shí),把突發(fā)長(zhǎng)度設(shè)置為一整行的像素量。
由于原始視頻在經(jīng)過(guò)旋轉(zhuǎn)后,對(duì)應(yīng)的像素點(diǎn)位置不在是連續(xù)的,因此我們不得不考慮把突發(fā)長(zhǎng)度設(shè)置為1進(jìn)行像素點(diǎn)的寫入/讀取。
根據(jù)現(xiàn)在可以找到的有關(guān)FPGA實(shí)現(xiàn)視頻任意角度旋轉(zhuǎn)的文章可以得知,在進(jìn)行視頻旋轉(zhuǎn)時(shí),我們可以采用正向映射/逆向映射兩種方式進(jìn)行視頻旋轉(zhuǎn)的處理。
在進(jìn)行視頻任意角度旋轉(zhuǎn)時(shí)(比如31度),為了保證旋轉(zhuǎn)后的視頻無(wú)空洞,需要采用逆向映射的旋轉(zhuǎn)方案進(jìn)行處理(下一篇文章介紹任意角度旋轉(zhuǎn)實(shí)現(xiàn)方案)。
在視頻處理中,對(duì)于 90 度或 270 度的旋轉(zhuǎn)操作較為常見(jiàn)。由于視頻像素點(diǎn)在完成這類旋轉(zhuǎn)后,其排列呈現(xiàn)出明顯的規(guī)律性,因此針對(duì)這類旋轉(zhuǎn)的處理方式,我們可以采用正向映射的方案進(jìn)行處理,把輸入進(jìn)的待旋轉(zhuǎn)視頻數(shù)據(jù)依次寫入旋轉(zhuǎn)后對(duì)應(yīng)的像素點(diǎn)位置。
3.2 數(shù)據(jù)流框圖
為了處理輸入進(jìn)的60hz的待旋轉(zhuǎn)視頻,視頻像素點(diǎn)的數(shù)據(jù)流如上圖所示,其經(jīng)歷了三進(jìn)三出DDR3,最終輸出至顯示器進(jìn)行顯示。
- 第一次讀寫DDR3:由于輸入進(jìn)來(lái)的視頻為60幀的幀率,如果直接對(duì)視頻進(jìn)行逐像素點(diǎn)寫入,是處理不過(guò)來(lái)的。(具體我們的板卡能實(shí)現(xiàn)多高的處理速率,取決于我們使用的DDR控制器IP從發(fā)起寫請(qǐng)求到一個(gè)像素點(diǎn)完全寫入需要的時(shí)間,這個(gè)需要自行計(jì)算一下)因此,第一次緩存的目的是把輸入進(jìn)來(lái)的視頻數(shù)據(jù)先存進(jìn)DDR3,以一個(gè)較低的幀率讀出像素?cái)?shù)據(jù)至旋轉(zhuǎn)處理模塊。
- 第二次讀寫DDR3:把剛剛讀出的經(jīng)過(guò)降幀的數(shù)據(jù),進(jìn)行90度/270度旋轉(zhuǎn)處理,然后存進(jìn)DDR,并以較低的幀率讀出
- 第三次讀寫DDR3:把剛剛讀出的經(jīng)過(guò)降幀的并且是旋轉(zhuǎn)后數(shù)據(jù),再次存進(jìn)DDR,然后就可以以正常的60幀讀出進(jìn)行顯示。
上述處理的核心在于旋轉(zhuǎn)模塊的實(shí)現(xiàn)。
3.3 uidbuf_w_active_rotate模塊
此模塊采用正向映射的方法進(jìn)行90度/270度旋轉(zhuǎn),把待旋轉(zhuǎn)的數(shù)據(jù)依次寫入到像素點(diǎn)旋轉(zhuǎn)后對(duì)應(yīng)的位置
模塊接口如下,相比于uibuf模塊,不同的部分用紅框圈出。
此方案中,使用AXI4總線讀寫DDR時(shí),AXI4總線的數(shù)據(jù)寬度為128,像素點(diǎn)的數(shù)據(jù)位寬為16,因?yàn)镈DR3采用的是8-bit預(yù)取,DDR3的位寬配置為16bit,所以在突發(fā)長(zhǎng)度為1的情況下,一次可以讀出8個(gè)16bit數(shù)據(jù)(128bit),在常規(guī)情況下,一次能讀出8個(gè)像素點(diǎn)數(shù)據(jù)。
然而,在進(jìn)行旋轉(zhuǎn)時(shí),為了保證每一次只傳輸一個(gè)像素?cái)?shù)據(jù),我們把這128bit全部設(shè)置為某一個(gè)像素點(diǎn)的數(shù)據(jù)即可。
該模塊中核心的部分在于地址計(jì)算,詳見(jiàn)源代碼。
四、移植注意事項(xiàng)
1、本工程視頻源輸入的視頻分辨率為1280×720@60hz
2、使用串口命令發(fā)送16進(jìn)制 00 視頻進(jìn)行順時(shí)針90度旋轉(zhuǎn), 01 視頻進(jìn)行順時(shí)針270度旋轉(zhuǎn),波特率為115200。
五、上板驗(yàn)證
視頻旋轉(zhuǎn)效果圖如下,下圖分別為旋轉(zhuǎn)90度和270度的結(jié)果