《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 可編程邏輯 > 設(shè)計應(yīng)用 > 視頻縮放在FPGA中的應(yīng)用和實現(xiàn)
視頻縮放在FPGA中的應(yīng)用和實現(xiàn)
2016年電子技術(shù)應(yīng)用第6期
張 梁,王景存,梅 鏢
武漢科技大學(xué) 信息科學(xué)與工程學(xué)院,湖北 武漢430081
摘要: 針對某顯示系統(tǒng)中監(jiān)控視頻控制器的實際需求,設(shè)計了一種可實現(xiàn)四路視頻信號實時縮放的電路架構(gòu)。通過權(quán)衡幾種常用圖像縮放算法的顯示質(zhì)量和硬件可行性,選擇用雙線性插值算法實現(xiàn)視頻的縮放,并在FPGA平臺上以雙口RAM資源構(gòu)建的線緩存作為算法硬件實現(xiàn),該算法主要由視頻數(shù)據(jù)緩沖模塊、插值系數(shù)產(chǎn)生模塊以及整體控制模塊構(gòu)成。本設(shè)計在滿足視頻縮放質(zhì)量要求的基礎(chǔ)上,避免了采用過于復(fù)雜算法而消耗過多的FPGA資源,有效地解決了視頻縮放時原始圖像信息量丟失導(dǎo)致圖像失真的問題。結(jié)果表明,該設(shè)計能夠?qū)崿F(xiàn)任意比例的視頻縮放,實時性高,應(yīng)用靈活,縮放后顯示效果良好,能夠滿足實際工程的要求。
中圖分類號: TM930.9
文獻標(biāo)識碼: A
DOI:10.16157/j.issn.0258-7998.2016.06.009
中文引用格式: 張梁,王景存,梅鏢. 視頻縮放在FPGA中的應(yīng)用和實現(xiàn)[J].電子技術(shù)應(yīng)用,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 引言

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

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

1 縮放算法的硬件可行性

1.1 縮放算法的選取

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

1.2 雙線性插值算法的原理

    雙線性插值,又稱為雙線性內(nèi)插。在數(shù)學(xué)上,雙線性插值是由兩個變量插值函數(shù)的線性插值擴展,利用了需要處理的原始圖像像素點周圍4個像素點的相關(guān)性,通過雙線性算法計算而得出[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個像素值中兩兩在水平方向上的插值結(jié)果。

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

    wdz1-gs3-4.gif

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

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

2 FPGA實現(xiàn)

2.1 功能模塊的劃分

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

wdz1-t2.gif

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

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

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

2.2 縮放算法的硬件實現(xiàn)

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

wdz1-t3.gif

2.2.1 數(shù)據(jù)緩沖

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

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

2.2.2 插值系數(shù)的產(chǎn)生

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

    wdz1-gs5.gif

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

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

     wdz1-gs6.gif

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

2.2.3 整體控制

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

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

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

wdz1-t5.gif

3 仿真與驗證

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

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

wdz1-b1.gif

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

wdz1-t6.gif

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

wdz1-t7.gif

參考文獻

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

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

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

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

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

此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載。