文獻(xiàn)標(biāo)識碼: 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)用于空間探測,、生物醫(yī)學(xué)、監(jiān)控系統(tǒng)以及工業(yè)檢測等許多領(lǐng)域中,。數(shù)字視頻處理則是基于對視頻中每幀圖像的處理來實(shí)現(xiàn)的,。數(shù)字視頻圖像的縮放是視頻處理中的一個(gè)重要組成部分。
目前視頻縮放系統(tǒng)大多采用視頻縮放的專業(yè)芯片設(shè)計(jì),,應(yīng)用單一,、靈活性差且成本較高[1]。本設(shè)計(jì)是在FPGA的平臺上,,利用雙口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)相對簡單,,但縮放后可能會產(chǎn)生細(xì)節(jié)丟失,、輪廓模糊等現(xiàn)象。其中,,不同的插值算法有不同的精度,,插值算法的好壞也直接影響著圖像的失真程度。最常用的插值算法有3種:最近鄰插值,、雙線性插值,、立方卷積插值,使用立方卷積插值達(dá)到的效果是最佳的,??紤]到最終算法需要在FPGA上完成,算法的復(fù)雜度直接影響FPGA內(nèi)部的邏輯資源和存儲塊的消耗量,,以及處理每個(gè)實(shí)時(shí)像素值所消耗的時(shí)鐘周期,,本設(shè)計(jì)選用雙線性插值來完成視頻圖像的縮放。
1.2 雙線性插值算法的原理
雙線性插值,,又稱為雙線性內(nèi)插。在數(shù)學(xué)上,,雙線性插值是由兩個(gè)變量插值函數(shù)的線性插值擴(kuò)展,,利用了需要處理的原始圖像像素點(diǎn)周圍4個(gè)像素點(diǎn)的相關(guān)性,通過雙線性算法計(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é)果。
再對式(1)和式(2)得到的兩個(gè)在水平方向上的插值結(jié)果進(jìn)行垂直方向上的插值
這樣Q(x,,y)就是期望位置所要的像素值,,雙線性插值法計(jì)算量大,但縮放后的圖像質(zhì)量高,,由于雙線性插值具有低通濾波器的性質(zhì),,使高頻信號受損,可能會使圖像在輪廓上有一定的模糊,。
考慮到FPGA內(nèi)部豐富的存儲塊,,設(shè)計(jì)將視頻數(shù)據(jù)以行為單位交替寫入兩個(gè)由雙口RAM構(gòu)成的線緩存中,通過縮放比例合理控制讀寫地址,,先進(jìn)行相鄰4個(gè)像素的垂直線性插值,,然后對得到的兩個(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)控畫面,。4個(gè)模擬攝像頭采集的PAL復(fù)合視頻信號經(jīng)TW2867采樣輸出為108 M的4路復(fù)用總線的數(shù)字信號BT.656,,在FPGA中根據(jù)每個(gè)視頻不同的ID號分解出4路后,經(jīng)過適當(dāng)?shù)募舨?,將奇偶場交叉存儲在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ā)寫入ddr2的另外一塊區(qū)域,,直至整幀圖像處理完畢。存儲在外部Flash中的圖片菜單等資源會在上電完成后自動(dòng)寫入ddr2的某一區(qū)域,,供后續(xù)模塊調(diào)用,。
輸出時(shí),從對應(yīng)的ddr2區(qū)域中讀出視頻數(shù)據(jù),,存入線緩存后經(jīng)過雙線性插值縮放模塊,,與ddr2中讀出的圖片菜單拼接成一幅實(shí)時(shí)監(jiān)控畫面??紤]到后續(xù)ADV7171的輸入是BT.656格式的視頻數(shù)據(jù),,前面存儲到ddr2時(shí)已通過幀存機(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)的速率給輸出模塊,,輸出模塊將奇偶場的YUV422有效視頻數(shù)據(jù)加上必要的消隱組成標(biāo)準(zhǔn)的BT.656格式視頻數(shù)據(jù),,經(jīng)ADV7171編碼成復(fù)合視頻輸出至顯示屏。
由于篇幅有限,,本文只對整體架構(gòu)流程粗略介紹,下文將著重對縮放算法的實(shí)現(xiàn)過程進(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è)線緩存來緩存兩行數(shù)據(jù),,每個(gè)線緩存由3個(gè)雙口RAM組成,,由于輸入的數(shù)據(jù)是YUV422格式的,,所以第一個(gè)雙口RAM存儲Y分量,每行有720 B,,深度為1 024,;第二個(gè)和第三個(gè)雙口RAM交替存儲UV分量,U和V都是360 B,,故深度選為512,。設(shè)計(jì)中采用兩個(gè)狀態(tài)機(jī)分別控制數(shù)據(jù)流入和流出線緩存,始終保證一個(gè)線緩存中有一行完整的數(shù)據(jù),,另一個(gè)線緩存的寫地址大于讀地址,,確保將要處理的像素值提前寫入線緩存。
從線緩存讀數(shù)據(jù)時(shí),,每個(gè)像素值由3個(gè)雙口RAM的輸出拼接,,也就是UV分量的同一值會被讀取兩次,實(shí)現(xiàn)了YUV422到Y(jié)UV444的轉(zhuǎn)換,,方便后續(xù)模塊的處理,。
2.2.2 插值系數(shù)的產(chǎn)生
在進(jìn)行縮放計(jì)算時(shí),首先需要確定期望輸出的視頻分辨率,,通過原始輸入和期望輸出的分辨率確定縮放的比例,,如下式所示:
式中,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無法處理浮點(diǎn)數(shù),,故在代碼中需將水平和垂直縮放比例乘以256倍,最終得到的y需要向右移位8位,,即為插值的期望像素值,。
2.2.3 整體控制
縮放算法的整體控制流程如圖4所示,由于縮放模塊的前后數(shù)據(jù)流是跨時(shí)鐘域的,設(shè)計(jì)采用FIFO進(jìn)行交互,,確保兩端的FIFO不會超過設(shè)定的閾值即可保證數(shù)據(jù)的正常傳輸,。兩個(gè)線緩存具有相同的讀寫地址,對其進(jìn)行寫操作時(shí)利用片選信號,,實(shí)現(xiàn)兩個(gè)線緩存的乒乓操作,,可以保證讀取到的視頻數(shù)據(jù)為同一行的數(shù)據(jù)[5]。
當(dāng)線緩存的寫地址至少領(lǐng)先讀地址10個(gè)單位時(shí),,后續(xù)模塊會讀取線緩存中的值并計(jì)算,,在讀的過程中會實(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ù)縮小的比例,,讀線緩存的使能信號會失能直到前置FIFO中的新一行的數(shù)據(jù)覆蓋掉線緩存中未被處理的一行數(shù)據(jù),實(shí)現(xiàn)了行坐標(biāo)的變換,。
由于一個(gè)時(shí)鐘無法完成過多的計(jì)算,,且水平插值需要垂直插值的結(jié)果參與運(yùn)算,故采用流水線操作將公式分解為3步,,如式(6)所示,,每一步的計(jì)算過程完全一樣,設(shè)計(jì)中做成通用模塊,,只需修改對應(yīng)的參數(shù),,實(shí)例化即可。插值計(jì)算功能框圖如圖5所示,,其中a,,b是像素值輸入端口,如果是垂直插值模塊,,指的是兩個(gè)線緩存的上下值;如果是水平插值,,指的是垂直插值處理后相鄰的兩個(gè)輸出值,。a_coff和b_coff分別是插值系數(shù),呈取反關(guān)系。scale_en_in是使能信號,,c是處理后的輸出值,。
3 仿真與驗(yàn)證
本設(shè)計(jì)的解碼芯片為TW2867,編碼芯片為ADV7171,存儲器DDR2的型號是MT47H64M16,,共兩片,。在Quartus12.1開發(fā)平臺上使用Verilog HDL對各邏輯模塊進(jìn)行設(shè)計(jì)。
經(jīng)驗(yàn)證得到本縮放模塊占用FPGA內(nèi)部主要邏輯資源情況如表1所示,,其中Dedicated Logic指的是邏輯單元中實(shí)現(xiàn)寄存器,,即時(shí)序邏輯所占的部分。
圖6為通過Quartus自帶的仿真工具SignalTap對分辨率為720×576的視頻放大為800×600進(jìn)行仿真得到的雙線性插值縮放算法的仿真圖,。圖中,, rdaddress是線緩存的讀地址,scale_col是期望輸出的行像素個(gè)數(shù),,可以看到在每9個(gè)像素中,,讀地址會在最后一個(gè)像素處保持不變。rd_not_read_data為低電平時(shí),,線緩存的寫入和讀取是同時(shí)進(jìn)行的,,wraddress是線緩存的寫地址,始終大于rdaddress,。上面五行a,、b、a_coff,、b_coff,、c分別對應(yīng)垂直插值的縱向像素值、插值系數(shù)及輸出,,下面五行對應(yīng)水平插值的各參數(shù),。
圖7為拍攝的實(shí)物效果圖,圖7(a)是將4路攝像頭采集的實(shí)時(shí)圖像分別壓縮,,水平方向和垂直方向各縮小一半后拼接而成,。圖7(b)是將第二路攝像頭采集的圖像顯示出來,沒經(jīng)過縮放,。由于攝像頭采用的是170°廣角攝像頭,,圖像4角的黑色是正常現(xiàn)象,。通過效果圖可知,,本設(shè)計(jì)方案測試效果良好,適合于實(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ì)技巧與案例開發(fā)詳解[M].北京:電子工業(yè)出版社,2014.
[5] 陳全兵,,習(xí)友寶.基于雙線性內(nèi)插算法的多路視頻縮放設(shè)計(jì)[J].電視技術(shù),,2015,39(1):43-46.