文獻標(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.
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方向上進行線性插值,得到:
式中:I(R1)和I(R2)是4個像素值中兩兩在水平方向上的插值結(jié)果。
再對式(1)和式(2)得到的兩個在水平方向上的插值結(jié)果進行垂直方向上的插值
這樣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所示。
監(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ù)與像素值的計算以及整體控制。
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)生
在進行縮放計算時,首先需要確定期望輸出的視頻分辨率,通過原始輸入和期望輸出的分辨率確定縮放的比例,如下式所示:
式中,xscaler是水平方向縮放比例,yscaler是垂直方向縮放比例,t_width和t_heigth分別表示期望輸出圖像的水平和垂直方向上的像素點個數(shù);s_width和s_height分別表示原始輸入圖像的水平和垂直方向上的像素點個數(shù)。
假設(shè)待插值點在縮放后的圖像中的坐標(biāo)為(m,n),雙線性插值算法的計算公式如下:
式中,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是處理后的輸出值。
3 仿真與驗證
本設(shè)計的解碼芯片為TW2867,編碼芯片為ADV7171,存儲器DDR2的型號是MT47H64M16,共兩片。在Quartus12.1開發(fā)平臺上使用Verilog HDL對各邏輯模塊進行設(shè)計。
經(jīng)驗證得到本縮放模塊占用FPGA內(nèi)部主要邏輯資源情況如表1所示,其中Dedicated Logic指的是邏輯單元中實現(xiàn)寄存器,即時序邏輯所占的部分。
圖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ù)。
圖7為拍攝的實物效果圖,圖7(a)是將4路攝像頭采集的實時圖像分別壓縮,水平方向和垂直方向各縮小一半后拼接而成。圖7(b)是將第二路攝像頭采集的圖像顯示出來,沒經(jīng)過縮放。由于攝像頭采用的是170°廣角攝像頭,圖像4角的黑色是正?,F(xiàn)象。通過效果圖可知,本設(shè)計方案測試效果良好,適合于實時監(jiān)控系統(tǒng)的圖像采集。
參考文獻
[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.