文獻(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)用于空間探測,、生物醫(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的平臺(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)相對簡單,,但縮放后可能會(huì)產(chǎn)生細(xì)節(jié)丟失,、輪廓模糊等現(xiàn)象。其中,,不同的插值算法有不同的精度,,插值算法的好壞也直接影響著圖像的失真程度,。最常用的插值算法有3種:最近鄰插值、雙線性插值,、立方卷積插值,使用立方卷積插值達(dá)到的效果是最佳的,??紤]到最終算法需要在FPGA上完成,算法的復(fù)雜度直接影響FPGA內(nèi)部的邏輯資源和存儲(chǔ)塊的消耗量,,以及處理每個(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ì),,使高頻信號(hào)受損,,可能會(huì)使圖像在輪廓上有一定的模糊。
考慮到FPGA內(nèi)部豐富的存儲(chǔ)塊,,設(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ù)合視頻信號(hào)經(jīng)TW2867采樣輸出為108 M的4路復(fù)用總線的數(shù)字信號(hào)BT.656,,在FPGA中根據(jù)每個(gè)視頻不同的ID號(hào)分解出4路后,,經(jīng)過適當(dāng)?shù)募舨茫瑢⑵媾紙鼋徊娲鎯?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ā)寫入ddr2的另外一塊區(qū)域,,直至整幀圖像處理完畢。存儲(chǔ)在外部Flash中的圖片菜單等資源會(huì)在上電完成后自動(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ù),,前面存儲(chǔ)到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存儲(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è)線緩存的寫地址大于讀地址,,確保將要處理的像素值提前寫入線緩存,。
從線緩存讀數(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í),,首先需要確定期望輸出的視頻分辨率,通過原始輸入和期望輸出的分辨率確定縮放的比例,,如下式所示:
式中,,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不會(huì)超過設(shè)定的閾值即可保證數(shù)據(jù)的正常傳輸,。兩個(gè)線緩存具有相同的讀寫地址,對其進(jìn)行寫操作時(shí)利用片選信號(hào),,實(shí)現(xiàn)兩個(gè)線緩存的乒乓操作,,可以保證讀取到的視頻數(shù)據(jù)為同一行的數(shù)據(jù)[5]。
當(dāng)線緩存的寫地址至少領(lǐng)先讀地址10個(gè)單位時(shí),,后續(xù)模塊會(huì)讀取線緩存中的值并計(jì)算,,在讀的過程中會(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í)鐘無法完成過多的計(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是使能信號(hào),,c是處理后的輸出值,。
3 仿真與驗(yàn)證
本設(shè)計(jì)的解碼芯片為TW2867,編碼芯片為ADV7171,存儲(chǔ)器DDR2的型號(hào)是MT47H64M16,,共兩片,。在Quartus12.1開發(fā)平臺(tái)上使用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è)像素中,,讀地址會(huì)在最后一個(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角的黑色是正?,F(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.