文獻(xiàn)標(biāo)識(shí)碼: A
DOI:10.16157/j.issn.0258-7998.2016.06.009
中文引用格式: 張梁,王景存,梅鏢. 視頻縮放在FPGA中的應(yīng)用和實(shí)現(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)用于空間探測(cè)、生物醫(yī)學(xué)、監(jiān)控系統(tǒng)以及工業(yè)檢測(cè)等許多領(lǐng)域中。數(shù)字視頻處理則是基于對(duì)視頻中每幀圖像的處理來(lái)實(shí)現(xiàn)的。數(shù)字視頻圖像的縮放是視頻處理中的一個(gè)重要組成部分。
目前視頻縮放系統(tǒng)大多采用視頻縮放的專業(yè)芯片設(shè)計(jì),應(yīng)用單一、靈活性差且成本較高[1]。本設(shè)計(jì)是在FPGA的平臺(tái)上,利用雙口RAM資源構(gòu)建兩個(gè)線緩存,在視頻圖像的垂直和水平兩個(gè)方向上依次進(jìn)行實(shí)時(shí)雙線性插值運(yùn)算,實(shí)現(xiàn)視頻圖像的任意比例縮放,具有實(shí)時(shí)性好、處理速度快、應(yīng)用靈活等特點(diǎn)。
1 縮放算法的硬件可行性
1.1 縮放算法的選取
目前,圖像縮放算法大致可以分為兩大類[2],一類是基于邊緣的圖像縮放算法,它利用了圖像的邊緣信息,能夠很好地還原原始圖像,但該算法計(jì)算復(fù)雜,運(yùn)算速度慢,硬件上難以實(shí)現(xiàn);另一類是基于插值的圖像縮放算法,它的算法實(shí)現(xiàn)相對(duì)簡(jiǎn)單,但縮放后可能會(huì)產(chǎn)生細(xì)節(jié)丟失、輪廓模糊等現(xiàn)象。其中,不同的插值算法有不同的精度,插值算法的好壞也直接影響著圖像的失真程度。最常用的插值算法有3種:最近鄰插值、雙線性插值、立方卷積插值,使用立方卷積插值達(dá)到的效果是最佳的??紤]到最終算法需要在FPGA上完成,算法的復(fù)雜度直接影響FPGA內(nèi)部的邏輯資源和存儲(chǔ)塊的消耗量,以及處理每個(gè)實(shí)時(shí)像素值所消耗的時(shí)鐘周期,本設(shè)計(jì)選用雙線性插值來(lái)完成視頻圖像的縮放。
1.2 雙線性插值算法的原理
雙線性插值,又稱為雙線性內(nèi)插。在數(shù)學(xué)上,雙線性插值是由兩個(gè)變量插值函數(shù)的線性插值擴(kuò)展,利用了需要處理的原始圖像像素點(diǎn)周圍4個(gè)像素點(diǎn)的相關(guān)性,通過(guò)雙線性算法計(jì)算而得出[3]。
若用(x,y)表示期望位置,用Q(x,y)表示期望輸出的像素值,I(x,y)表示輸入像素值,與位置(x,y)相鄰的4個(gè)點(diǎn)為(x1,y1)、(x1,y2)、(x2,y1)、(x2,y2),如圖1所示。先在x方向上進(jìn)行線性插值,得到:
式中:I(R1)和I(R2)是4個(gè)像素值中兩兩在水平方向上的插值結(jié)果。
再對(duì)式(1)和式(2)得到的兩個(gè)在水平方向上的插值結(jié)果進(jìn)行垂直方向上的插值
這樣Q(x,y)就是期望位置所要的像素值,雙線性插值法計(jì)算量大,但縮放后的圖像質(zhì)量高,由于雙線性插值具有低通濾波器的性質(zhì),使高頻信號(hào)受損,可能會(huì)使圖像在輪廓上有一定的模糊。
考慮到FPGA內(nèi)部豐富的存儲(chǔ)塊,設(shè)計(jì)將視頻數(shù)據(jù)以行為單位交替寫(xiě)入兩個(gè)由雙口RAM構(gòu)成的線緩存中,通過(guò)縮放比例合理控制讀寫(xiě)地址,先進(jìn)行相鄰4個(gè)像素的垂直線性插值,然后對(duì)得到的兩個(gè)結(jié)果進(jìn)行水平方向插值。
2 FPGA實(shí)現(xiàn)
2.1 功能模塊的劃分
FPGA選用的是ALTERA公司的Cyclone IV系列EP4CE30F23C6,共有28 848個(gè)Les,66個(gè)M9K,132個(gè)9位乘法器,完全滿足設(shè)計(jì)需要。整個(gè)系統(tǒng)主要由視頻數(shù)據(jù)的采集、剪切、旋轉(zhuǎn)、基于ddr2的數(shù)據(jù)緩沖、縮放、拼接以及視頻的輸出構(gòu)成。整個(gè)監(jiān)控系統(tǒng)的實(shí)現(xiàn)框圖如圖2所示。
監(jiān)控系統(tǒng)是將4個(gè)裝載在特定位置的170°廣角攝像頭采集的實(shí)時(shí)圖像進(jìn)行翻轉(zhuǎn)、剪切、縮放、拼接成一幅實(shí)時(shí)的監(jiān)控畫(huà)面。4個(gè)模擬攝像頭采集的PAL復(fù)合視頻信號(hào)經(jīng)TW2867采樣輸出為108 M的4路復(fù)用總線的數(shù)字信號(hào)BT.656,在FPGA中根據(jù)每個(gè)視頻不同的ID號(hào)分解出4路后,經(jīng)過(guò)適當(dāng)?shù)募舨茫瑢⑵媾紙?chǎng)交叉存儲(chǔ)在ddr2的4個(gè)物理區(qū)域,實(shí)現(xiàn)視頻的去隔行功能,得到逐行排列的視頻流,便于后續(xù)模塊的處理。其中左攝像頭采集的視頻需要順時(shí)針旋轉(zhuǎn)90°、右攝像頭采集的視頻需要逆時(shí)針旋轉(zhuǎn)90°,實(shí)現(xiàn)的方法是把一幀圖像分解為若干小塊,以塊為單位,從ddr2中突發(fā)讀出旋轉(zhuǎn)前的視頻數(shù)據(jù),進(jìn)行旋轉(zhuǎn)排列,然后再以塊為單位突發(fā)寫(xiě)入ddr2的另外一塊區(qū)域,直至整幀圖像處理完畢。存儲(chǔ)在外部Flash中的圖片菜單等資源會(huì)在上電完成后自動(dòng)寫(xiě)入ddr2的某一區(qū)域,供后續(xù)模塊調(diào)用。
輸出時(shí),從對(duì)應(yīng)的ddr2區(qū)域中讀出視頻數(shù)據(jù),存入線緩存后經(jīng)過(guò)雙線性插值縮放模塊,與ddr2中讀出的圖片菜單拼接成一幅實(shí)時(shí)監(jiān)控畫(huà)面??紤]到后續(xù)ADV7171的輸入是BT.656格式的視頻數(shù)據(jù),前面存儲(chǔ)到ddr2時(shí)已通過(guò)幀存機(jī)制實(shí)現(xiàn)了去隔行功能,這里需將處理后的逐行視頻流隔行處理[4],為后續(xù)轉(zhuǎn)換做好準(zhǔn)備。具體做法是以27 M(位寬16 bit)的速率從拼接模塊中讀取數(shù)據(jù),每幀圖像取出所有奇數(shù)行(或者所有偶數(shù)行),下一幀圖像取出所有偶數(shù)行(或者所有奇數(shù)行),交替進(jìn)行,將取出的奇偶行以27 M(位寬8 bit)的速率給輸出模塊,輸出模塊將奇偶場(chǎng)的YUV422有效視頻數(shù)據(jù)加上必要的消隱組成標(biāo)準(zhǔn)的BT.656格式視頻數(shù)據(jù),經(jīng)ADV7171編碼成復(fù)合視頻輸出至顯示屏。
由于篇幅有限,本文只對(duì)整體架構(gòu)流程粗略介紹,下文將著重對(duì)縮放算法的實(shí)現(xiàn)過(guò)程進(jìn)行描述。
2.2 縮放算法的硬件實(shí)現(xiàn)
雙線性插值縮放算法硬件實(shí)現(xiàn)總體框圖如圖3所示,該設(shè)計(jì)主要包括3大部分,分別為數(shù)據(jù)緩沖、系數(shù)與像素值的計(jì)算以及整體控制。
2.2.1 數(shù)據(jù)緩沖
縮放模塊與ddr2之間采用FIFO的數(shù)據(jù)交互方式。由于該算法至少需要兩行數(shù)據(jù)才能進(jìn)行運(yùn)算,因此首先將輸入的視頻數(shù)據(jù)進(jìn)行緩存,且需緩存兩行視頻數(shù)據(jù)。設(shè)計(jì)采用兩個(gè)線緩存來(lái)緩存兩行數(shù)據(jù),每個(gè)線緩存由3個(gè)雙口RAM組成,由于輸入的數(shù)據(jù)是YUV422格式的,所以第一個(gè)雙口RAM存儲(chǔ)Y分量,每行有720 B,深度為1 024;第二個(gè)和第三個(gè)雙口RAM交替存儲(chǔ)UV分量,U和V都是360 B,故深度選為512。設(shè)計(jì)中采用兩個(gè)狀態(tài)機(jī)分別控制數(shù)據(jù)流入和流出線緩存,始終保證一個(gè)線緩存中有一行完整的數(shù)據(jù),另一個(gè)線緩存的寫(xiě)地址大于讀地址,確保將要處理的像素值提前寫(xiě)入線緩存。
從線緩存讀數(shù)據(jù)時(shí),每個(gè)像素值由3個(gè)雙口RAM的輸出拼接,也就是UV分量的同一值會(huì)被讀取兩次,實(shí)現(xiàn)了YUV422到Y(jié)UV444的轉(zhuǎn)換,方便后續(xù)模塊的處理。
2.2.2 插值系數(shù)的產(chǎn)生
在進(jìn)行縮放計(jì)算時(shí),首先需要確定期望輸出的視頻分辨率,通過(guò)原始輸入和期望輸出的分辨率確定縮放的比例,如下式所示:
式中,xscaler是水平方向縮放比例,yscaler是垂直方向縮放比例,t_width和t_heigth分別表示期望輸出圖像的水平和垂直方向上的像素點(diǎn)個(gè)數(shù);s_width和s_height分別表示原始輸入圖像的水平和垂直方向上的像素點(diǎn)個(gè)數(shù)。
假設(shè)待插值點(diǎn)在縮放后的圖像中的坐標(biāo)為(m,n),雙線性插值算法的計(jì)算公式如下:
式中,a、b、c、d分別相鄰4個(gè)像素點(diǎn)(左上、右上、左下、右下)的像素值。由于FPGA無(wú)法處理浮點(diǎn)數(shù),故在代碼中需將水平和垂直縮放比例乘以256倍,最終得到的y需要向右移位8位,即為插值的期望像素值。
2.2.3 整體控制
縮放算法的整體控制流程如圖4所示,由于縮放模塊的前后數(shù)據(jù)流是跨時(shí)鐘域的,設(shè)計(jì)采用FIFO進(jìn)行交互,確保兩端的FIFO不會(huì)超過(guò)設(shè)定的閾值即可保證數(shù)據(jù)的正常傳輸。兩個(gè)線緩存具有相同的讀寫(xiě)地址,對(duì)其進(jìn)行寫(xiě)操作時(shí)利用片選信號(hào),實(shí)現(xiàn)兩個(gè)線緩存的乒乓操作,可以保證讀取到的視頻數(shù)據(jù)為同一行的數(shù)據(jù)[5]。
當(dāng)線緩存的寫(xiě)地址至少領(lǐng)先讀地址10個(gè)單位時(shí),后續(xù)模塊會(huì)讀取線緩存中的值并計(jì)算,在讀的過(guò)程中會(huì)實(shí)現(xiàn)坐標(biāo)的轉(zhuǎn)換。比如原始圖像一行是720個(gè)像素值,期望輸出的圖像一行是800個(gè)像素點(diǎn),每讀取一個(gè)數(shù)據(jù),讀取地址累加一次,當(dāng)每讀完9個(gè)數(shù)據(jù)時(shí),地址不變,重復(fù)讀取第9個(gè)數(shù)據(jù),這樣就實(shí)現(xiàn)了列坐標(biāo)的轉(zhuǎn)換。行坐標(biāo)的轉(zhuǎn)換類似,比如期望輸出的行數(shù)少于原始圖像的行數(shù),根據(jù)縮小的比例,讀線緩存的使能信號(hào)會(huì)失能直到前置FIFO中的新一行的數(shù)據(jù)覆蓋掉線緩存中未被處理的一行數(shù)據(jù),實(shí)現(xiàn)了行坐標(biāo)的變換。
由于一個(gè)時(shí)鐘無(wú)法完成過(guò)多的計(jì)算,且水平插值需要垂直插值的結(jié)果參與運(yùn)算,故采用流水線操作將公式分解為3步,如式(6)所示,每一步的計(jì)算過(guò)程完全一樣,設(shè)計(jì)中做成通用模塊,只需修改對(duì)應(yīng)的參數(shù),實(shí)例化即可。插值計(jì)算功能框圖如圖5所示,其中a,b是像素值輸入端口,如果是垂直插值模塊,指的是兩個(gè)線緩存的上下值;如果是水平插值,指的是垂直插值處理后相鄰的兩個(gè)輸出值。a_coff和b_coff分別是插值系數(shù),呈取反關(guān)系。scale_en_in是使能信號(hào),c是處理后的輸出值。
3 仿真與驗(yàn)證
本設(shè)計(jì)的解碼芯片為TW2867,編碼芯片為ADV7171,存儲(chǔ)器DDR2的型號(hào)是MT47H64M16,共兩片。在Quartus12.1開(kāi)發(fā)平臺(tái)上使用Verilog HDL對(duì)各邏輯模塊進(jìn)行設(shè)計(jì)。
經(jīng)驗(yàn)證得到本縮放模塊占用FPGA內(nèi)部主要邏輯資源情況如表1所示,其中Dedicated Logic指的是邏輯單元中實(shí)現(xiàn)寄存器,即時(shí)序邏輯所占的部分。
圖6為通過(guò)Quartus自帶的仿真工具SignalTap對(duì)分辨率為720×576的視頻放大為800×600進(jìn)行仿真得到的雙線性插值縮放算法的仿真圖。圖中, rdaddress是線緩存的讀地址,scale_col是期望輸出的行像素個(gè)數(shù),可以看到在每9個(gè)像素中,讀地址會(huì)在最后一個(gè)像素處保持不變。rd_not_read_data為低電平時(shí),線緩存的寫(xiě)入和讀取是同時(shí)進(jìn)行的,wraddress是線緩存的寫(xiě)地址,始終大于rdaddress。上面五行a、b、a_coff、b_coff、c分別對(duì)應(yīng)垂直插值的縱向像素值、插值系數(shù)及輸出,下面五行對(duì)應(yīng)水平插值的各參數(shù)。
圖7為拍攝的實(shí)物效果圖,圖7(a)是將4路攝像頭采集的實(shí)時(shí)圖像分別壓縮,水平方向和垂直方向各縮小一半后拼接而成。圖7(b)是將第二路攝像頭采集的圖像顯示出來(lái),沒(méi)經(jīng)過(guò)縮放。由于攝像頭采用的是170°廣角攝像頭,圖像4角的黑色是正?,F(xiàn)象。通過(guò)效果圖可知,本設(shè)計(jì)方案測(cè)試效果良好,適合于實(shí)時(shí)監(jiān)控系統(tǒng)的圖像采集。
參考文獻(xiàn)
[1] 趙艷軍,何其銳,施錫濤.基于DVI和FPGA的視頻疊加器設(shè)計(jì)[J].電子技術(shù)應(yīng)用,2011,37(6):31-35.
[2] 張俊華,陳建華,王逍,等.基于邊緣移動(dòng)匹配法的圖像插值[J].計(jì)算機(jī)工程與應(yīng)用,2003,39(6):73-75,134.
[3] Donald Hearn,等.計(jì)算機(jī)圖形學(xué).蔡士杰等譯[M].北京:電子工業(yè)出版社,2007.
[4] 韓彬,于瀟宇,張雷鳴.FPGA設(shè)計(jì)技巧與案例開(kāi)發(fā)詳解[M].北京:電子工業(yè)出版社,2014.
[5] 陳全兵,習(xí)友寶.基于雙線性內(nèi)插算法的多路視頻縮放設(shè)計(jì)[J].電視技術(shù),2015,39(1):43-46.