萬 權, 李少甫
(西南科技大學 信息工程學院,四川 綿陽 621010)
隨著視頻處理的快速發展,視頻顯示的方式也越來越豐富,顯示設備廣泛應用于調度中心、視屏監控、演出背景等,傳統的單圖層顯示方式已經不能滿足多樣性顯示的需求,如王明宇采用雙線性融合算法實現視頻源的大屏拼接[1],這種顯示方式可應用在大部分多屏顯示場景中,但顯示界面往往只能調用一個圖像源;嚴飛采用雙三次插值算法實現了兩個圖層的疊加[2],但是只在一個顯示屏上輸出,沒有對圖像進行拼接處理。針對大屏拼接中不同圖像源疊加的問題,本文設計了一種多功能視頻拼接系統,使得每一路輸出信號都支持圖像疊加與圖像拼接;同時允許輸入多種分辨率格式,輸出分辨率可以根據使用者需求進行實時調整[3]。由于雙線性插值算法的畫質比最鄰近插值算法高,且硬件資源占用比雙三次插值算法少,既能滿足圖像畫質的要求又能滿足跨屏拼接所需的多路資源要求,所以本文采用雙線性插值算法作為系統的縮放算法[4-8]。
視頻拼接系統包括4路Sil9293視頻輸入模塊、4路Sil9022視頻輸出模塊、DDR2(Double Data Rate 2)存儲模塊、現場可編程門陣列(Field Programmable Gate Array,FPGA)算法執行模塊、Hi3520D主控模塊、MCU(Microcontroller Unit)單片機模塊、以及其他必要模塊(電源模塊、時鐘模塊、配置模塊),系統的硬件設計圖如圖1所示,FPGA[9-10]型號為LFE3-70EA-6FN672C,是lattice公司ECP3系列產品,單片機型號為STM32f030-RT86。

圖1 多功能視頻拼接系統硬件結構圖Fig.1 Hardware structure diagram of multifunctional video stitching
Sil9293視屏輸入模塊通過采集外部HDMI接口輸入的視屏信號,轉換為YCbCr(4∶2∶2)格式[11]的16 bit位寬數據流,當FPGA收到數據流立即進行數據有效性判斷,如果視頻流數據判斷為有效,那么將存儲到DDR2中,當單片機告知FPGA需要對圖像進行縮放計算時,縮放模塊通過讀取存儲在DDR2中對應的信號源數據到RAM中,進而參與圖像的縮放計算,計算結果輸出到Sil9022視頻輸出模塊,最終轉換為HDMI視頻信號輸出。
主控模塊主要由海思的視屏解碼芯片Hi3520D[12]和DDR3組成,首先通過SPI接口寫入預處理程序,再通過主控板上的以太網接口連接到PC主機,在PC端可視化界面上繪制出每一路輸出需要顯示的圖像窗口并選取信號源,之后Hi3520D產生與輸出窗口對應的參數信息(起始地址、終止地址、圖層顯示優先級、目標顯示分辨率),再通過RS485接口[13]發送到單片機,參與每一路視頻輸出的縮放倍數計算,主控模塊如圖2所示。

圖2 主控模塊Fig.2 Schematic diagram of system master control module
一幀圖像可分為有效區域和消隱區域,有效區域的長寬即為圖像的分辨率,也是人眼在顯示器上看到的視頻區域;視屏傳輸采用內同步傳輸方式[14-15],即圖像的每一行的起始和終止標志,插入到視頻流中一起傳輸,在保證有效數據量不變的情況下,又減少了外部同步信號引腳,節約了硬件IO口資源。根據掃描方式的不同視頻可分為逐行掃描和隔行掃描,它們由視頻起始標志或者終止標志來區別。采用verilog語言對FPGA進行編程,按照BT1120的圖像標準[16],采集有效數據的起始標志(sol_flag)和終止標志(eol_flag),同時對起始標志后的數據進行計數,直到結束標志到來時才停止。一個連續的起始和終止標志之間的計數值,即表示視頻分辨率的橫向值;同理對一幀數據中有效區域前的起始標志個數進行計數,即可得到視頻分辨率的縱向值。
數據存儲前,需要先判斷視頻源的輸入格式。標志位由4個連續的像素點數據組成,所以采用移位寄存的方式對視頻流進行連續存儲,由vi_data_shift表示這4個值,當FPGA檢測到一幀視頻圖像中有隔行掃描起始標志時,即條件(vi_data_shift[63∶0]==64'hffff00000000c7c7)成立,則認為圖像是隔行掃描圖像,如果不成立則視屏源為逐行掃描格式,如圖3圖像的起始終止標志。

圖3 圖像的起始終止標志Fig.3 Start and end of image
本設計采用了RAM_FIFO(Random Access Memory,First Input First Output)架構的存儲方式[17],圖像以行為單位進行數據緩存,通過乒乓操作使有效的視頻數據寫入到RAM中,當一行數據寫入結束時,立即產生一個激活FIFO的寫使能命令(cmd_fifo_wren),同時對輸入的視頻參數(當前數據通道號、當前行號、突發長度、存儲DDR的起始地址)進行存儲,當FIFO的“空”輸出標志為低電平時,表示允許DDR2的控制模塊讀取FIFO中的視頻參數數據,控制模塊調用Diamond中固有的IP核(DDR2 SDRAM Controller)實現數據存儲到DDR2的過程[18]。
雙線性插值算法最少需要用兩行圖像數據進行插值計算,所以需要提前從內存中讀取2行數據;每一個視頻顯示窗口,在插值計算時,為了滿足讀寫RAM時數據操作不沖突,采取緩存4行數據的方式交叉寫入[19]。使用兩組RAM,每組可容納兩行的視頻數據,RAM1的兩行存儲空間分別命名為a行和b行,RAM2的兩行存儲空間命名為c行和d行;當FPGA從單片機接收到讀命令后,以行為單位依次從DDR2中讀出對應的數據,并按照a-c-b-d的順序循環寫入兩個RAM空間,如圖4所示,同時讀取已經寫好的連續兩行數據的連續兩點進行縮放計算,保證了讀與寫之間互不影響。

圖4 DDR2中一路數據存取邏輯圖Fig.4 Diagram of DDR2 data access logic
本設計為4個視頻源的同時輸入,且4個處理后的視頻信號同時輸出,為了滿足多路信號的同時處理要求,提高DDR2的讀寫效率就顯得很有必要,本文通過兩個方面來提高內存讀寫的效率。其一,采用FPGA內部的時鐘IP核提高讀寫時鐘的頻率,通過調節PLL(Phase Locked Loop)的輸出時鐘,使得讀寫RAM的頻率高達200 MHz;其二,提高數據傳輸帶寬,使用4組16 bit位寬的DDR2內存顆粒,通過并聯方式組成64位寬的數據傳輸總線;又因為DDR2擁有兩倍DDR內存預讀取能力,故實際每個時鐘周期從RAM中讀/寫的數據位寬為128 bit(8個像素點),如圖4數據存取邏輯圖。
每組RAM空間大小為4 096×16 bit,可緩存兩行1 K的視頻圖像數據,一行數據有效像素點最多為1 920個,所以一行存儲空間能夠存儲一行圖像數據。
雙線性插值算法并沒有產生實際意義上的新像素值,所有新的像素值都是通過計算得到。因此,如何計算新像素值便成為實現算法的關鍵。雙線性圖像縮放算法在計算新像素值時需要有相鄰兩行原圖像像素值作為計算依據。因此,為了保證圖像的連續性,必須通過具有大容量的存儲器件DDR2來緩存幾幀圖像數據。雙線性圖像縮放算法計算新像素值時需要知道縮放前后圖像的橫縱比值,然后再用新像素的坐標值分別與縮放倍數的橫向比值和縱向比值相乘,以此來確定當前新像素在原圖像中的坐標位置。考慮到直接的除法運算在FPGA中會導致嚴重的時序違規,采用移位除法又占用大量資源,且該除法運算沒有實時性要求,即被除數與除數不會隨時鐘連續變化。因此可由單片機來完成視頻源到目標分辨率縮放倍數的計算,計算結果再返回FPGA執行。
計算縮放倍數時,主控板通過RS485總線發送開窗所需的參數給單片機,目標顯示分辨率與輸入視頻源的分辨率共同計算得到圖像縮放倍數;FPGA實時更新所有視頻源分辨率信息,單片機通過IIC總線每隔1 s時間讀取一次FPGA寄存的分辨率,實時更新縮放的倍數;計算方法如下:
(1)
(2)
其中:in_width表示輸入分辨率寬度,out_width表示輸出分辨率寬度,in_hight表示輸入分辨率高度,out_hight表示輸出分辨率高度,x表示橫向縮放倍數,y表示縱向縮放倍數。
(1)新像素坐標位置計算
新像素的坐標設為P′(u′,v′),該坐標點在視頻源圖像中對應的坐標位置設為P(u,v),用P′點的坐標與相應比值相乘即可得到新像素在視頻源圖像中的坐標位置P(u,v)。
P(u,v)=P(u′·x,v′·y)
(3)
由P點的整數部分可得到它的4個相鄰點Q11(i,j)、Q12(i,j+1)、Q21(i+1,j)、Q22(i+1,j+1),P點為相鄰點閉合空間上的任意一點。在雙線性插值算法中,像素值是由周圍4個相鄰點的像素值加權求和得出,如圖5雙線性算法原理。

圖5 雙線性算法原理Fig.5 Diagram of bilinear algorithm principle
(2)新像素值計算
當新像素點在源圖像中的坐標位置確定后,利用這4個像素值與P點坐標小數部分對應相乘后再相加,最后得到新像素點的值[20]。
(3)乘法實現
FPGA在需要乘法運算的地方均使用FPGA內部乘法器IP核(DSP_MULT)來實現乘法運算[21]。
設f( )為源圖像中像素點坐標對應的像素值,相鄰點的值表示為f(i,j)、f(i,j+1)、f(i+1,j)、f(i+1,j+1),
圖5中R2、R1分別為P點在上、下邊界的分量,可作為計算P點的中間值,u,v為P點小數部分的值。首先計算出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)
再由橫向兩個點R1、R2的值計算出縱向點P的值:
f(P)=(1-v)·f(R1)+v·f(R2)
(6)
通過時鐘上升沿驅動計算模塊,即可輸出源源不斷的新視頻信號。
采用Lattice公司的Diamond軟件作為程序編譯平臺,然后對FPGA中的各個功能子模塊進行綜合、布局布線。主控板通過網線連接電腦,并采用RS485總線連接FPGA執行板,如圖6系統結構圖。輸出端口連接4個1 920×1 080分辨率的顯示器。

圖6 系統結構圖Fig.6 Diagram of system structure
顯示器以2×2的矩陣方式拼接顯示,在拼接狀態下滿屏圖像的分辨率為3 840×2 160,系統的每一個輸出通道分配了兩個圖像顯示窗口,每一個窗口可以獨立處理一個圖層的圖像,當大屏拼接和圖像疊加兩種顯示方式同時存在于一個輸出通道時,通過單片機選擇圖層的優先級,高優先級的圖像覆蓋低優先級圖像,最終以一個圖層的方式輸出。
編譯軟件集成了仿真工具Reveal Analyzer,能夠實時獲取工程中數據的變化,如圖7所示。其中data_rdy電平為高時,表示外部視頻源正在寫入內存,read_data_valid電平為高時,表示視頻數據從內存中讀出[22],可以看出視頻數據在不停地以行為單位對DDR2進行數據的寫和讀。

圖7 DDR2讀寫仿真Fig.7 DDR2 read and write emulation
圖像底圖采用拼接的顯示方法,其他3個窗口通過PC端控制可任意縮放,其中新開的窗口仍然可以實現跨屏拼接;采用4路1 080 P,頻率為60 Hz的視頻源作為系統的信號輸入,顯示效果如圖8所示。此設計是在大屏拼接的基礎上增加疊加圖像的功能,此外當有多個信號源同時輸入時,可通過開窗的方式顯示多個不同的信號源。

圖8 顯示效果圖Fig.8 Picture of show effect
實驗結果表明,基于FPGA的雙線性插值縮放系統,允許同時輸入4路最大1 080 P的分辨率,輸出分辨率最大為3 840×2 160,輸出分辨率最小為50×50,對于輸出的4路視頻信號,每個信號允許開出2個任意縮放的窗口。FPGA消耗的LUT資源占總資源的25.06%,RAM占用總資源的36.67%。DSP計算資源占總資源的66.63%,如表1所示。

表1 FPGA資源使用情況Tab.1 FPGA resource usage

續 表
本文以實際市場需求為導向,針對圖像的大屏拼接顯示,提出了一種多功能視頻拼接系統的硬件結構設計,采用乒乓操作提高數據傳輸的穩定性。通過加大數據傳輸的位寬,提高數據讀寫的頻率,使得允許同時多路視頻的輸入和輸出;同時單片機對輸入視頻的分辨率進行實時檢測,當分辨率變化時,輸出視頻也隨之動態調整,提高了系統的應用能力。在Diamond環境中對該實驗進行編譯與測試,結果表明,輸出的4路圖像都可實現圖像疊加和跨屏拼接的功能,最小輸出分辨率為50×50的圖像,最大輸出分辨率為3 840×2 160的圖像,滿足常規要求的同時,也滿足一些特殊場景顯示的需求。