萬 權(quán), 李少甫
(西南科技大學(xué) 信息工程學(xué)院,四川 綿陽 621010)
隨著視頻處理的快速發(fā)展,視頻顯示的方式也越來越豐富,顯示設(shè)備廣泛應(yīng)用于調(diào)度中心、視屏監(jiān)控、演出背景等,傳統(tǒng)的單圖層顯示方式已經(jīng)不能滿足多樣性顯示的需求,如王明宇采用雙線性融合算法實(shí)現(xiàn)視頻源的大屏拼接[1],這種顯示方式可應(yīng)用在大部分多屏顯示場(chǎng)景中,但顯示界面往往只能調(diào)用一個(gè)圖像源;嚴(yán)飛采用雙三次插值算法實(shí)現(xiàn)了兩個(gè)圖層的疊加[2],但是只在一個(gè)顯示屏上輸出,沒有對(duì)圖像進(jìn)行拼接處理。針對(duì)大屏拼接中不同圖像源疊加的問題,本文設(shè)計(jì)了一種多功能視頻拼接系統(tǒng),使得每一路輸出信號(hào)都支持圖像疊加與圖像拼接;同時(shí)允許輸入多種分辨率格式,輸出分辨率可以根據(jù)使用者需求進(jìn)行實(shí)時(shí)調(diào)整[3]。由于雙線性插值算法的畫質(zhì)比最鄰近插值算法高,且硬件資源占用比雙三次插值算法少,既能滿足圖像畫質(zhì)的要求又能滿足跨屏拼接所需的多路資源要求,所以本文采用雙線性插值算法作為系統(tǒng)的縮放算法[4-8]。
視頻拼接系統(tǒng)包括4路Sil9293視頻輸入模塊、4路Sil9022視頻輸出模塊、DDR2(Double Data Rate 2)存儲(chǔ)模塊、現(xiàn)場(chǎng)可編程門陣列(Field Programmable Gate Array,F(xiàn)PGA)算法執(zhí)行模塊、Hi3520D主控模塊、MCU(Microcontroller Unit)單片機(jī)模塊、以及其他必要模塊(電源模塊、時(shí)鐘模塊、配置模塊),系統(tǒng)的硬件設(shè)計(jì)圖如圖1所示,F(xiàn)PGA[9-10]型號(hào)為LFE3-70EA-6FN672C,是lattice公司ECP3系列產(chǎn)品,單片機(jī)型號(hào)為STM32f030-RT86。
圖1 多功能視頻拼接系統(tǒng)硬件結(jié)構(gòu)圖Fig.1 Hardware structure diagram of multifunctional video stitching
Sil9293視屏輸入模塊通過采集外部HDMI接口輸入的視屏信號(hào),轉(zhuǎn)換為YCbCr(4∶2∶2)格式[11]的16 bit位寬數(shù)據(jù)流,當(dāng)FPGA收到數(shù)據(jù)流立即進(jìn)行數(shù)據(jù)有效性判斷,如果視頻流數(shù)據(jù)判斷為有效,那么將存儲(chǔ)到DDR2中,當(dāng)單片機(jī)告知FPGA需要對(duì)圖像進(jìn)行縮放計(jì)算時(shí),縮放模塊通過讀取存儲(chǔ)在DDR2中對(duì)應(yīng)的信號(hào)源數(shù)據(jù)到RAM中,進(jìn)而參與圖像的縮放計(jì)算,計(jì)算結(jié)果輸出到Sil9022視頻輸出模塊,最終轉(zhuǎn)換為HDMI視頻信號(hào)輸出。
主控模塊主要由海思的視屏解碼芯片Hi3520D[12]和DDR3組成,首先通過SPI接口寫入預(yù)處理程序,再通過主控板上的以太網(wǎng)接口連接到PC主機(jī),在PC端可視化界面上繪制出每一路輸出需要顯示的圖像窗口并選取信號(hào)源,之后Hi3520D產(chǎn)生與輸出窗口對(duì)應(yīng)的參數(shù)信息(起始地址、終止地址、圖層顯示優(yōu)先級(jí)、目標(biāo)顯示分辨率),再通過RS485接口[13]發(fā)送到單片機(jī),參與每一路視頻輸出的縮放倍數(shù)計(jì)算,主控模塊如圖2所示。
圖2 主控模塊Fig.2 Schematic diagram of system master control module
一幀圖像可分為有效區(qū)域和消隱區(qū)域,有效區(qū)域的長寬即為圖像的分辨率,也是人眼在顯示器上看到的視頻區(qū)域;視屏傳輸采用內(nèi)同步傳輸方式[14-15],即圖像的每一行的起始和終止標(biāo)志,插入到視頻流中一起傳輸,在保證有效數(shù)據(jù)量不變的情況下,又減少了外部同步信號(hào)引腳,節(jié)約了硬件IO口資源。根據(jù)掃描方式的不同視頻可分為逐行掃描和隔行掃描,它們由視頻起始標(biāo)志或者終止標(biāo)志來區(qū)別。采用verilog語言對(duì)FPGA進(jìn)行編程,按照BT1120的圖像標(biāo)準(zhǔn)[16],采集有效數(shù)據(jù)的起始標(biāo)志(sol_flag)和終止標(biāo)志(eol_flag),同時(shí)對(duì)起始標(biāo)志后的數(shù)據(jù)進(jìn)行計(jì)數(shù),直到結(jié)束標(biāo)志到來時(shí)才停止。一個(gè)連續(xù)的起始和終止標(biāo)志之間的計(jì)數(shù)值,即表示視頻分辨率的橫向值;同理對(duì)一幀數(shù)據(jù)中有效區(qū)域前的起始標(biāo)志個(gè)數(shù)進(jìn)行計(jì)數(shù),即可得到視頻分辨率的縱向值。
數(shù)據(jù)存儲(chǔ)前,需要先判斷視頻源的輸入格式。標(biāo)志位由4個(gè)連續(xù)的像素點(diǎn)數(shù)據(jù)組成,所以采用移位寄存的方式對(duì)視頻流進(jìn)行連續(xù)存儲(chǔ),由vi_data_shift表示這4個(gè)值,當(dāng)FPGA檢測(cè)到一幀視頻圖像中有隔行掃描起始標(biāo)志時(shí),即條件(vi_data_shift[63∶0]==64'hffff00000000c7c7)成立,則認(rèn)為圖像是隔行掃描圖像,如果不成立則視屏源為逐行掃描格式,如圖3圖像的起始終止標(biāo)志。
圖3 圖像的起始終止標(biāo)志Fig.3 Start and end of image
本設(shè)計(jì)采用了RAM_FIFO(Random Access Memory,F(xiàn)irst Input First Output)架構(gòu)的存儲(chǔ)方式[17],圖像以行為單位進(jìn)行數(shù)據(jù)緩存,通過乒乓操作使有效的視頻數(shù)據(jù)寫入到RAM中,當(dāng)一行數(shù)據(jù)寫入結(jié)束時(shí),立即產(chǎn)生一個(gè)激活FIFO的寫使能命令(cmd_fifo_wren),同時(shí)對(duì)輸入的視頻參數(shù)(當(dāng)前數(shù)據(jù)通道號(hào)、當(dāng)前行號(hào)、突發(fā)長度、存儲(chǔ)DDR的起始地址)進(jìn)行存儲(chǔ),當(dāng)FIFO的“空”輸出標(biāo)志為低電平時(shí),表示允許DDR2的控制模塊讀取FIFO中的視頻參數(shù)數(shù)據(jù),控制模塊調(diào)用Diamond中固有的IP核(DDR2 SDRAM Controller)實(shí)現(xiàn)數(shù)據(jù)存儲(chǔ)到DDR2的過程[18]。
雙線性插值算法最少需要用兩行圖像數(shù)據(jù)進(jìn)行插值計(jì)算,所以需要提前從內(nèi)存中讀取2行數(shù)據(jù);每一個(gè)視頻顯示窗口,在插值計(jì)算時(shí),為了滿足讀寫RAM時(shí)數(shù)據(jù)操作不沖突,采取緩存4行數(shù)據(jù)的方式交叉寫入[19]。使用兩組RAM,每組可容納兩行的視頻數(shù)據(jù),RAM1的兩行存儲(chǔ)空間分別命名為a行和b行,RAM2的兩行存儲(chǔ)空間命名為c行和d行;當(dāng)FPGA從單片機(jī)接收到讀命令后,以行為單位依次從DDR2中讀出對(duì)應(yīng)的數(shù)據(jù),并按照a-c-b-d的順序循環(huán)寫入兩個(gè)RAM空間,如圖4所示,同時(shí)讀取已經(jīng)寫好的連續(xù)兩行數(shù)據(jù)的連續(xù)兩點(diǎn)進(jìn)行縮放計(jì)算,保證了讀與寫之間互不影響。
圖4 DDR2中一路數(shù)據(jù)存取邏輯圖Fig.4 Diagram of DDR2 data access logic
本設(shè)計(jì)為4個(gè)視頻源的同時(shí)輸入,且4個(gè)處理后的視頻信號(hào)同時(shí)輸出,為了滿足多路信號(hào)的同時(shí)處理要求,提高DDR2的讀寫效率就顯得很有必要,本文通過兩個(gè)方面來提高內(nèi)存讀寫的效率。其一,采用FPGA內(nèi)部的時(shí)鐘IP核提高讀寫時(shí)鐘的頻率,通過調(diào)節(jié)PLL(Phase Locked Loop)的輸出時(shí)鐘,使得讀寫RAM的頻率高達(dá)200 MHz;其二,提高數(shù)據(jù)傳輸帶寬,使用4組16 bit位寬的DDR2內(nèi)存顆粒,通過并聯(lián)方式組成64位寬的數(shù)據(jù)傳輸總線;又因?yàn)镈DR2擁有兩倍DDR內(nèi)存預(yù)讀取能力,故實(shí)際每個(gè)時(shí)鐘周期從RAM中讀/寫的數(shù)據(jù)位寬為128 bit(8個(gè)像素點(diǎn)),如圖4數(shù)據(jù)存取邏輯圖。
每組RAM空間大小為4 096×16 bit,可緩存兩行1 K的視頻圖像數(shù)據(jù),一行數(shù)據(jù)有效像素點(diǎn)最多為1 920個(gè),所以一行存儲(chǔ)空間能夠存儲(chǔ)一行圖像數(shù)據(jù)。
雙線性插值算法并沒有產(chǎn)生實(shí)際意義上的新像素值,所有新的像素值都是通過計(jì)算得到。因此,如何計(jì)算新像素值便成為實(shí)現(xiàn)算法的關(guān)鍵。雙線性圖像縮放算法在計(jì)算新像素值時(shí)需要有相鄰兩行原圖像像素值作為計(jì)算依據(jù)。因此,為了保證圖像的連續(xù)性,必須通過具有大容量的存儲(chǔ)器件DDR2來緩存幾幀圖像數(shù)據(jù)。雙線性圖像縮放算法計(jì)算新像素值時(shí)需要知道縮放前后圖像的橫縱比值,然后再用新像素的坐標(biāo)值分別與縮放倍數(shù)的橫向比值和縱向比值相乘,以此來確定當(dāng)前新像素在原圖像中的坐標(biāo)位置??紤]到直接的除法運(yùn)算在FPGA中會(huì)導(dǎo)致嚴(yán)重的時(shí)序違規(guī),采用移位除法又占用大量資源,且該除法運(yùn)算沒有實(shí)時(shí)性要求,即被除數(shù)與除數(shù)不會(huì)隨時(shí)鐘連續(xù)變化。因此可由單片機(jī)來完成視頻源到目標(biāo)分辨率縮放倍數(shù)的計(jì)算,計(jì)算結(jié)果再返回FPGA執(zhí)行。
計(jì)算縮放倍數(shù)時(shí),主控板通過RS485總線發(fā)送開窗所需的參數(shù)給單片機(jī),目標(biāo)顯示分辨率與輸入視頻源的分辨率共同計(jì)算得到圖像縮放倍數(shù);FPGA實(shí)時(shí)更新所有視頻源分辨率信息,單片機(jī)通過IIC總線每隔1 s時(shí)間讀取一次FPGA寄存的分辨率,實(shí)時(shí)更新縮放的倍數(shù);計(jì)算方法如下:
(1)
(2)
其中:in_width表示輸入分辨率寬度,out_width表示輸出分辨率寬度,in_hight表示輸入分辨率高度,out_hight表示輸出分辨率高度,x表示橫向縮放倍數(shù),y表示縱向縮放倍數(shù)。
(1)新像素坐標(biāo)位置計(jì)算
新像素的坐標(biāo)設(shè)為P′(u′,v′),該坐標(biāo)點(diǎn)在視頻源圖像中對(duì)應(yīng)的坐標(biāo)位置設(shè)為P(u,v),用P′點(diǎn)的坐標(biāo)與相應(yīng)比值相乘即可得到新像素在視頻源圖像中的坐標(biāo)位置P(u,v)。
P(u,v)=P(u′·x,v′·y)
(3)
由P點(diǎn)的整數(shù)部分可得到它的4個(gè)相鄰點(diǎn)Q11(i,j)、Q12(i,j+1)、Q21(i+1,j)、Q22(i+1,j+1),P點(diǎn)為相鄰點(diǎn)閉合空間上的任意一點(diǎn)。在雙線性插值算法中,像素值是由周圍4個(gè)相鄰點(diǎn)的像素值加權(quán)求和得出,如圖5雙線性算法原理。
圖5 雙線性算法原理Fig.5 Diagram of bilinear algorithm principle
(2)新像素值計(jì)算
當(dāng)新像素點(diǎn)在源圖像中的坐標(biāo)位置確定后,利用這4個(gè)像素值與P點(diǎn)坐標(biāo)小數(shù)部分對(duì)應(yīng)相乘后再相加,最后得到新像素點(diǎn)的值[20]。
(3)乘法實(shí)現(xiàn)
FPGA在需要乘法運(yùn)算的地方均使用FPGA內(nèi)部乘法器IP核(DSP_MULT)來實(shí)現(xiàn)乘法運(yùn)算[21]。
設(shè)f( )為源圖像中像素點(diǎn)坐標(biāo)對(duì)應(yīng)的像素值,相鄰點(diǎn)的值表示為f(i,j)、f(i,j+1)、f(i+1,j)、f(i+1,j+1),
圖5中R2、R1分別為P點(diǎn)在上、下邊界的分量,可作為計(jì)算P點(diǎn)的中間值,u,v為P點(diǎn)小數(shù)部分的值。首先計(jì)算出R1、R2的像素值:
f(R1)=(1-u)·f(i,j)+u·f(i+1,j)
(4)
f(R2)=(1-u)·f(i,j+1)+u·f(i+1,j+1)
(5)
再由橫向兩個(gè)點(diǎn)R1、R2的值計(jì)算出縱向點(diǎn)P的值:
f(P)=(1-v)·f(R1)+v·f(R2)
(6)
通過時(shí)鐘上升沿驅(qū)動(dòng)計(jì)算模塊,即可輸出源源不斷的新視頻信號(hào)。
采用Lattice公司的Diamond軟件作為程序編譯平臺(tái),然后對(duì)FPGA中的各個(gè)功能子模塊進(jìn)行綜合、布局布線。主控板通過網(wǎng)線連接電腦,并采用RS485總線連接FPGA執(zhí)行板,如圖6系統(tǒng)結(jié)構(gòu)圖。輸出端口連接4個(gè)1 920×1 080分辨率的顯示器。
圖6 系統(tǒng)結(jié)構(gòu)圖Fig.6 Diagram of system structure
顯示器以2×2的矩陣方式拼接顯示,在拼接狀態(tài)下滿屏圖像的分辨率為3 840×2 160,系統(tǒng)的每一個(gè)輸出通道分配了兩個(gè)圖像顯示窗口,每一個(gè)窗口可以獨(dú)立處理一個(gè)圖層的圖像,當(dāng)大屏拼接和圖像疊加兩種顯示方式同時(shí)存在于一個(gè)輸出通道時(shí),通過單片機(jī)選擇圖層的優(yōu)先級(jí),高優(yōu)先級(jí)的圖像覆蓋低優(yōu)先級(jí)圖像,最終以一個(gè)圖層的方式輸出。
編譯軟件集成了仿真工具Reveal Analyzer,能夠?qū)崟r(shí)獲取工程中數(shù)據(jù)的變化,如圖7所示。其中data_rdy電平為高時(shí),表示外部視頻源正在寫入內(nèi)存,read_data_valid電平為高時(shí),表示視頻數(shù)據(jù)從內(nèi)存中讀出[22],可以看出視頻數(shù)據(jù)在不停地以行為單位對(duì)DDR2進(jìn)行數(shù)據(jù)的寫和讀。
圖7 DDR2讀寫仿真Fig.7 DDR2 read and write emulation
圖像底圖采用拼接的顯示方法,其他3個(gè)窗口通過PC端控制可任意縮放,其中新開的窗口仍然可以實(shí)現(xiàn)跨屏拼接;采用4路1 080 P,頻率為60 Hz的視頻源作為系統(tǒng)的信號(hào)輸入,顯示效果如圖8所示。此設(shè)計(jì)是在大屏拼接的基礎(chǔ)上增加疊加圖像的功能,此外當(dāng)有多個(gè)信號(hào)源同時(shí)輸入時(shí),可通過開窗的方式顯示多個(gè)不同的信號(hào)源。
圖8 顯示效果圖Fig.8 Picture of show effect
實(shí)驗(yàn)結(jié)果表明,基于FPGA的雙線性插值縮放系統(tǒng),允許同時(shí)輸入4路最大1 080 P的分辨率,輸出分辨率最大為3 840×2 160,輸出分辨率最小為50×50,對(duì)于輸出的4路視頻信號(hào),每個(gè)信號(hào)允許開出2個(gè)任意縮放的窗口。FPGA消耗的LUT資源占總資源的25.06%,RAM占用總資源的36.67%。DSP計(jì)算資源占總資源的66.63%,如表1所示。
表1 FPGA資源使用情況Tab.1 FPGA resource usage
續(xù) 表
本文以實(shí)際市場(chǎng)需求為導(dǎo)向,針對(duì)圖像的大屏拼接顯示,提出了一種多功能視頻拼接系統(tǒng)的硬件結(jié)構(gòu)設(shè)計(jì),采用乒乓操作提高數(shù)據(jù)傳輸?shù)姆€(wěn)定性。通過加大數(shù)據(jù)傳輸?shù)奈粚?,提高?shù)據(jù)讀寫的頻率,使得允許同時(shí)多路視頻的輸入和輸出;同時(shí)單片機(jī)對(duì)輸入視頻的分辨率進(jìn)行實(shí)時(shí)檢測(cè),當(dāng)分辨率變化時(shí),輸出視頻也隨之動(dòng)態(tài)調(diào)整,提高了系統(tǒng)的應(yīng)用能力。在Diamond環(huán)境中對(duì)該實(shí)驗(yàn)進(jìn)行編譯與測(cè)試,結(jié)果表明,輸出的4路圖像都可實(shí)現(xiàn)圖像疊加和跨屏拼接的功能,最小輸出分辨率為50×50的圖像,最大輸出分辨率為3 840×2 160的圖像,滿足常規(guī)要求的同時(shí),也滿足一些特殊場(chǎng)景顯示的需求。