文獻標識碼: 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ī)學、監(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],一類是基于邊緣的圖像縮放算法,,它利用了圖像的邊緣信息,,能夠很好地還原原始圖像,但該算法計算復雜,,運算速度慢,,硬件上難以實現(xiàn);另一類是基于插值的圖像縮放算法,它的算法實現(xiàn)相對簡單,,但縮放后可能會產(chǎn)生細節(jié)丟失,、輪廓模糊等現(xiàn)象。其中,,不同的插值算法有不同的精度,,插值算法的好壞也直接影響著圖像的失真程度。最常用的插值算法有3種:最近鄰插值,、雙線性插值,、立方卷積插值,使用立方卷積插值達到的效果是最佳的,。考慮到最終算法需要在FPGA上完成,,算法的復雜度直接影響FPGA內(nèi)部的邏輯資源和存儲塊的消耗量,,以及處理每個實時像素值所消耗的時鐘周期,本設(shè)計選用雙線性插值來完成視頻圖像的縮放,。
1.2 雙線性插值算法的原理
雙線性插值,,又稱為雙線性內(nèi)插。在數(shù)學上,,雙線性插值是由兩個變量插值函數(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復合視頻信號經(jīng)TW2867采樣輸出為108 M的4路復用總線的數(shù)字信號BT.656,,在FPGA中根據(jù)每個視頻不同的ID號分解出4路后,經(jīng)過適當?shù)募舨?,將奇偶場交叉存儲在ddr2的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)換做好準備,。具體做法是以27 M(位寬16 bit)的速率從拼接模塊中讀取數(shù)據(jù),每幀圖像取出所有奇數(shù)行(或者所有偶數(shù)行),,下一幀圖像取出所有偶數(shù)行(或者所有奇數(shù)行),交替進行,,將取出的奇偶行以27 M(位寬8 bit)的速率給輸出模塊,,輸出模塊將奇偶場的YUV422有效視頻數(shù)據(jù)加上必要的消隱組成標準的BT.656格式視頻數(shù)據(jù),經(jīng)ADV7171編碼成復合視頻輸出至顯示屏,。
由于篇幅有限,,本文只對整體架構(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è)待插值點在縮放后的圖像中的坐標為(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]。
當線緩存的寫地址至少領(lǐng)先讀地址10個單位時,,后續(xù)模塊會讀取線緩存中的值并計算,,在讀的過程中會實現(xiàn)坐標的轉(zhuǎn)換。比如原始圖像一行是720個像素值,,期望輸出的圖像一行是800個像素點,,每讀取一個數(shù)據(jù),讀取地址累加一次,,當每讀完9個數(shù)據(jù)時,,地址不變,重復讀取第9個數(shù)據(jù),,這樣就實現(xiàn)了列坐標的轉(zhuǎn)換,。行坐標的轉(zhuǎn)換類似,比如期望輸出的行數(shù)少于原始圖像的行數(shù),,根據(jù)縮小的比例,,讀線緩存的使能信號會失能直到前置FIFO中的新一行的數(shù)據(jù)覆蓋掉線緩存中未被處理的一行數(shù)據(jù),實現(xiàn)了行坐標的變換,。
由于一個時鐘無法完成過多的計算,,且水平插值需要垂直插值的結(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角的黑色是正常現(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,,等.計算機圖形學.蔡士杰等譯[M].北京:電子工業(yè)出版社,2007.
[4] 韓彬,,于瀟宇,,張雷鳴.FPGA設(shè)計技巧與案例開發(fā)詳解[M].北京:電子工業(yè)出版社,2014.
[5] 陳全兵,,習友寶.基于雙線性內(nèi)插算法的多路視頻縮放設(shè)計[J].電視技術(shù),,2015,39(1):43-46.