《電子技術應用》
您所在的位置:首頁 > 可編程邏輯 > 設計應用 > 視頻縮放在FPGA中的應用和實現
視頻縮放在FPGA中的應用和實現
2016年電子技術應用第6期
張 梁,王景存,梅 鏢
武漢科技大學 信息科學與工程學院,湖北 武漢430081
摘要: 針對某顯示系統(tǒng)中監(jiān)控視頻控制器的實際需求,設計了一種可實現四路視頻信號實時縮放的電路架構。通過權衡幾種常用圖像縮放算法的顯示質量和硬件可行性,選擇用雙線性插值算法實現視頻的縮放,并在FPGA平臺上以雙口RAM資源構建的線緩存作為算法硬件實現,該算法主要由視頻數據緩沖模塊、插值系數產生模塊以及整體控制模塊構成。本設計在滿足視頻縮放質量要求的基礎上,避免了采用過于復雜算法而消耗過多的FPGA資源,有效地解決了視頻縮放時原始圖像信息量丟失導致圖像失真的問題。結果表明,該設計能夠實現任意比例的視頻縮放,實時性高,應用靈活,縮放后顯示效果良好,能夠滿足實際工程的要求。
中圖分類號: TM930.9
文獻標識碼: A
DOI:10.16157/j.issn.0258-7998.2016.06.009
中文引用格式: 張梁,王景存,梅鏢. 視頻縮放在FPGA中的應用和實現[J].電子技術應用,2016,42(6):34-37.
英文引用格式: Zhang Liang,Wang Jingcun,Mei Biao. Application and implementation of video scaling algorithm based on FPGA[J].Application of Electronic Technique,2016,42(6):34-37.
Application and implementation of video scaling algorithm based on FPGA
Zhang Liang,Wang Jingcun,Mei Biao
College of Information Science and Engineering,Wuhan University of Science and Technology,Wuhan 430081,China
Abstract: Focusing on the practical requirements of the monitoring video controller in some displaying systems, this paper introduces a circuit architecture which is designed for real time scale of four video signals. Through analyzing the display quality and hardware realizability of several scaling algorithms, selects implement video scaling by bilinear interpolation algorithm and uses line buffers architecture as the core of algorithms implementation based on FPGA. The design mainly consists of the data buffer module, the coefficient generation module and the integrated control module. To meet the quality requirements of video scaling, this design avoids selecting complex algorithms to cause FPGA resources to be consumed excessively, and effectively solves the problem of image distortion caused by the loss of the original image information. The result indicates that the system can realize arbitrary scaling, and its real-time,flexibility and display effect are good, which can meet the application requirements of the actual project.
Key words : video scaling;bilinear interpolation;line buffer;FPGA

0 引言

    隨著數字多媒體技術的不斷發(fā)展,數字圖像處理技術廣泛應用于空間探測、生物醫(yī)學、監(jiān)控系統(tǒng)以及工業(yè)檢測等許多領域中。數字視頻處理則是基于對視頻中每幀圖像的處理來實現的。數字視頻圖像的縮放是視頻處理中的一個重要組成部分。

    目前視頻縮放系統(tǒng)大多采用視頻縮放的專業(yè)芯片設計,應用單一、靈活性差且成本較高[1]。本設計是在FPGA的平臺上,利用雙口RAM資源構建兩個線緩存,在視頻圖像的垂直和水平兩個方向上依次進行實時雙線性插值運算,實現視頻圖像的任意比例縮放,具有實時性好、處理速度快、應用靈活等特點。

1 縮放算法的硬件可行性

1.1 縮放算法的選取

    目前,圖像縮放算法大致可以分為兩大類[2],一類是基于邊緣的圖像縮放算法,它利用了圖像的邊緣信息,能夠很好地還原原始圖像,但該算法計算復雜,運算速度慢,硬件上難以實現;另一類是基于插值的圖像縮放算法,它的算法實現相對簡單,但縮放后可能會產生細節(jié)丟失、輪廓模糊等現象。其中,不同的插值算法有不同的精度,插值算法的好壞也直接影響著圖像的失真程度。最常用的插值算法有3種:最近鄰插值、雙線性插值、立方卷積插值,使用立方卷積插值達到的效果是最佳的。考慮到最終算法需要在FPGA上完成,算法的復雜度直接影響FPGA內部的邏輯資源和存儲塊的消耗量,以及處理每個實時像素值所消耗的時鐘周期,本設計選用雙線性插值來完成視頻圖像的縮放。

1.2 雙線性插值算法的原理

    雙線性插值,又稱為雙線性內插。在數學上,雙線性插值是由兩個變量插值函數的線性插值擴展,利用了需要處理的原始圖像像素點周圍4個像素點的相關性,通過雙線性算法計算而得出[3]。

    若用(x,y)表示期望位置,用Q(x,y)表示期望輸出的像素值,I(x,y)表示輸入像素值,與位置(x,y)相鄰的4個點為(x1,y1)、(x1,y2)、(x2,y1)、(x2,y2),如圖1所示。先在x方向上進行線性插值,得到:

    wdz1-gs1-2.gif

wdz1-t1.gif

式中:I(R1)和I(R2)是4個像素值中兩兩在水平方向上的插值結果。

    再對式(1)和式(2)得到的兩個在水平方向上的插值結果進行垂直方向上的插值

    wdz1-gs3-4.gif

    這樣Q(x,y)就是期望位置所要的像素值,雙線性插值法計算量大,但縮放后的圖像質量高,由于雙線性插值具有低通濾波器的性質,使高頻信號受損,可能會使圖像在輪廓上有一定的模糊。

    考慮到FPGA內部豐富的存儲塊,設計將視頻數據以行為單位交替寫入兩個由雙口RAM構成的線緩存中,通過縮放比例合理控制讀寫地址,先進行相鄰4個像素的垂直線性插值,然后對得到的兩個結果進行水平方向插值。

2 FPGA實現

2.1 功能模塊的劃分

    FPGA選用的是ALTERA公司的Cyclone IV系列EP4CE30F23C6,共有28 848個Les,66個M9K,132個9位乘法器,完全滿足設計需要。整個系統(tǒng)主要由視頻數據的采集、剪切、旋轉、基于ddr2的數據緩沖、縮放、拼接以及視頻的輸出構成。整個監(jiān)控系統(tǒng)的實現框圖如圖2所示。

wdz1-t2.gif

    監(jiān)控系統(tǒng)是將4個裝載在特定位置的170°廣角攝像頭采集的實時圖像進行翻轉、剪切、縮放、拼接成一幅實時的監(jiān)控畫面。4個模擬攝像頭采集的PAL復合視頻信號經TW2867采樣輸出為108 M的4路復用總線的數字信號BT.656,在FPGA中根據每個視頻不同的ID號分解出4路后,經過適當的剪裁,將奇偶場交叉存儲在ddr2的4個物理區(qū)域,實現視頻的去隔行功能,得到逐行排列的視頻流,便于后續(xù)模塊的處理。其中左攝像頭采集的視頻需要順時針旋轉90°、右攝像頭采集的視頻需要逆時針旋轉90°,實現的方法是把一幀圖像分解為若干小塊,以塊為單位,從ddr2中突發(fā)讀出旋轉前的視頻數據,進行旋轉排列,然后再以塊為單位突發(fā)寫入ddr2的另外一塊區(qū)域,直至整幀圖像處理完畢。存儲在外部Flash中的圖片菜單等資源會在上電完成后自動寫入ddr2的某一區(qū)域,供后續(xù)模塊調用。

    輸出時,從對應的ddr2區(qū)域中讀出視頻數據,存入線緩存后經過雙線性插值縮放模塊,與ddr2中讀出的圖片菜單拼接成一幅實時監(jiān)控畫面??紤]到后續(xù)ADV7171的輸入是BT.656格式的視頻數據,前面存儲到ddr2時已通過幀存機制實現了去隔行功能,這里需將處理后的逐行視頻流隔行處理[4],為后續(xù)轉換做好準備。具體做法是以27 M(位寬16 bit)的速率從拼接模塊中讀取數據,每幀圖像取出所有奇數行(或者所有偶數行),下一幀圖像取出所有偶數行(或者所有奇數行),交替進行,將取出的奇偶行以27 M(位寬8 bit)的速率給輸出模塊,輸出模塊將奇偶場的YUV422有效視頻數據加上必要的消隱組成標準的BT.656格式視頻數據,經ADV7171編碼成復合視頻輸出至顯示屏。 

    由于篇幅有限,本文只對整體架構流程粗略介紹,下文將著重對縮放算法的實現過程進行描述。

2.2 縮放算法的硬件實現

    雙線性插值縮放算法硬件實現總體框圖如圖3所示,該設計主要包括3大部分,分別為數據緩沖、系數與像素值的計算以及整體控制。

wdz1-t3.gif

2.2.1 數據緩沖

    縮放模塊與ddr2之間采用FIFO的數據交互方式。由于該算法至少需要兩行數據才能進行運算,因此首先將輸入的視頻數據進行緩存,且需緩存兩行視頻數據。設計采用兩個線緩存來緩存兩行數據,每個線緩存由3個雙口RAM組成,由于輸入的數據是YUV422格式的,所以第一個雙口RAM存儲Y分量,每行有720 B,深度為1 024;第二個和第三個雙口RAM交替存儲UV分量,U和V都是360 B,故深度選為512。設計中采用兩個狀態(tài)機分別控制數據流入和流出線緩存,始終保證一個線緩存中有一行完整的數據,另一個線緩存的寫地址大于讀地址,確保將要處理的像素值提前寫入線緩存。

    從線緩存讀數據時,每個像素值由3個雙口RAM的輸出拼接,也就是UV分量的同一值會被讀取兩次,實現了YUV422到YUV444的轉換,方便后續(xù)模塊的處理。

2.2.2 插值系數的產生

    在進行縮放計算時,首先需要確定期望輸出的視頻分辨率,通過原始輸入和期望輸出的分辨率確定縮放的比例,如下式所示:

    wdz1-gs5.gif

    式中,xscaler是水平方向縮放比例,yscaler是垂直方向縮放比例,t_width和t_heigth分別表示期望輸出圖像的水平和垂直方向上的像素點個數;s_width和s_height分別表示原始輸入圖像的水平和垂直方向上的像素點個數。

    假設待插值點在縮放后的圖像中的坐標為(m,n),雙線性插值算法的計算公式如下:

     wdz1-gs6.gif

wdz1-t4.gif    式中,a、b、c、d分別相鄰4個像素點(左上、右上、左下、右下)的像素值。由于FPGA無法處理浮點數,故在代碼中需將水平和垂直縮放比例乘以256倍,最終得到的y需要向右移位8位,即為插值的期望像素值。

2.2.3 整體控制

    縮放算法的整體控制流程如圖4所示,由于縮放模塊的前后數據流是跨時鐘域的,設計采用FIFO進行交互,確保兩端的FIFO不會超過設定的閾值即可保證數據的正常傳輸。兩個線緩存具有相同的讀寫地址,對其進行寫操作時利用片選信號,實現兩個線緩存的乒乓操作,可以保證讀取到的視頻數據為同一行的數據[5]。

    當線緩存的寫地址至少領先讀地址10個單位時,后續(xù)模塊會讀取線緩存中的值并計算,在讀的過程中會實現坐標的轉換。比如原始圖像一行是720個像素值,期望輸出的圖像一行是800個像素點,每讀取一個數據,讀取地址累加一次,當每讀完9個數據時,地址不變,重復讀取第9個數據,這樣就實現了列坐標的轉換。行坐標的轉換類似,比如期望輸出的行數少于原始圖像的行數,根據縮小的比例,讀線緩存的使能信號會失能直到前置FIFO中的新一行的數據覆蓋掉線緩存中未被處理的一行數據,實現了行坐標的變換。

    由于一個時鐘無法完成過多的計算,且水平插值需要垂直插值的結果參與運算,故采用流水線操作將公式分解為3步,如式(6)所示,每一步的計算過程完全一樣,設計中做成通用模塊,只需修改對應的參數,實例化即可。插值計算功能框圖如圖5所示,其中a,b是像素值輸入端口,如果是垂直插值模塊,指的是兩個線緩存的上下值;如果是水平插值,指的是垂直插值處理后相鄰的兩個輸出值。a_coff和b_coff分別是插值系數,呈取反關系。scale_en_in是使能信號,c是處理后的輸出值。

wdz1-t5.gif

3 仿真與驗證

    本設計的解碼芯片為TW2867,編碼芯片為ADV7171,存儲器DDR2的型號是MT47H64M16,共兩片。在Quartus12.1開發(fā)平臺上使用Verilog HDL對各邏輯模塊進行設計。

    經驗證得到本縮放模塊占用FPGA內部主要邏輯資源情況如表1所示,其中Dedicated Logic指的是邏輯單元中實現寄存器,即時序邏輯所占的部分。

wdz1-b1.gif

    圖6為通過Quartus自帶的仿真工具SignalTap對分辨率為720×576的視頻放大為800×600進行仿真得到的雙線性插值縮放算法的仿真圖。圖中, rdaddress是線緩存的讀地址,scale_col是期望輸出的行像素個數,可以看到在每9個像素中,讀地址會在最后一個像素處保持不變。rd_not_read_data為低電平時,線緩存的寫入和讀取是同時進行的,wraddress是線緩存的寫地址,始終大于rdaddress。上面五行a、b、a_coff、b_coff、c分別對應垂直插值的縱向像素值、插值系數及輸出,下面五行對應水平插值的各參數。 

wdz1-t6.gif

    圖7為拍攝的實物效果圖,圖7(a)是將4路攝像頭采集的實時圖像分別壓縮,水平方向和垂直方向各縮小一半后拼接而成。圖7(b)是將第二路攝像頭采集的圖像顯示出來,沒經過縮放。由于攝像頭采用的是170°廣角攝像頭,圖像4角的黑色是正常現象。通過效果圖可知,本設計方案測試效果良好,適合于實時監(jiān)控系統(tǒng)的圖像采集。

wdz1-t7.gif

參考文獻

[1] 趙艷軍,何其銳,施錫濤.基于DVI和FPGA的視頻疊加器設計[J].電子技術應用,2011,37(6):31-35.

[2] 張俊華,陳建華,王逍,等.基于邊緣移動匹配法的圖像插值[J].計算機工程與應用,2003,39(6):73-75,134.

[3] Donald Hearn,等.計算機圖形學.蔡士杰等譯[M].北京:電子工業(yè)出版社,2007.

[4] 韓彬,于瀟宇,張雷鳴.FPGA設計技巧與案例開發(fā)詳解[M].北京:電子工業(yè)出版社,2014.

[5] 陳全兵,習友寶.基于雙線性內插算法的多路視頻縮放設計[J].電視技術,2015,39(1):43-46.

此內容為AET網站原創(chuàng),未經授權禁止轉載。