朱高鋒
(重慶交通大學(xué) 機(jī)電與車輛工程學(xué)院,重慶,400074)
得益于近年計算機(jī)視覺與底層硬件電路的飛速發(fā)展,實時視頻處理與加速在通信系統(tǒng)、醫(yī)療成像乃至安全防護(hù)領(lǐng)域[1]都有重要作用。
圖像邊沿檢測算法可以提取到圖像中像素發(fā)生明顯變化的像素點,即視覺圖像中的邊緣,是實時視頻處理發(fā)展中必不可少的一環(huán)。由于視頻分辨率的不斷提高,(常規(guī)分辨率數(shù)據(jù)量),傳統(tǒng)邊沿提取算法在嵌入式軟件中的表現(xiàn)一直不佳,其實時性與功耗一直難以滿足要求[2-4],丟幀現(xiàn)象也時有發(fā)生。
FPGA作為可并行處理數(shù)據(jù)、硬件資源豐富的可重構(gòu)系統(tǒng),其特點可完美契合實時視頻處理需求[5],將視頻傳輸數(shù)據(jù)以數(shù)據(jù)流的形式傳遞與計算,并能根據(jù)圖像處理算法的變化重構(gòu)硬件系統(tǒng),是未來圖像處理的主流平臺之一。
本文采用OV5640攝像頭采集視頻數(shù)據(jù),Xinlinx公司的Kintex 7系列FPGA芯片XC7K325T作為主控芯片,在Vivado2019.2上通過Verilog編寫實現(xiàn)了視頻圖像接收與格式轉(zhuǎn)換、圖像預(yù)處理、視頻數(shù)據(jù)緩存控制以及HDMI驅(qū)動顯示等功能。經(jīng)測試,該系統(tǒng)可完成1280×720分辨率、30fps的圖像采集、預(yù)處理及顯示,實現(xiàn)了一種基于SOBEL算子的實時視頻采集與顯示系統(tǒng)設(shè)計。
本系統(tǒng)采用Xinlinx公司的XC7K325T芯片作為開發(fā)平臺,作為Xinlinx廠家7系列FPGA芯片,Kintex系列與Spartan、Artix以及Virtex系列相比具有最佳的性價比。同時,作為28納米制程芯片,XC7K325T基于6輸入查找表,具有200萬邏輯單元容量,支持高達(dá)1866Mb/s的DDR3接口,25×18的乘法器、48位累加器以及預(yù)加法器的DSP片,提供了多種硬核IP等特性都十分適合視頻實時處理領(lǐng)域應(yīng)用。外部搭載了DDR3 SDRAM大容量高速緩存芯片、HDMI接口、用于固化程序的FLASH等硬件用于實現(xiàn)系統(tǒng)功能。
系統(tǒng)采用自頂而下的模塊化設(shè)計方法,將FPGA內(nèi)部邏輯劃分為系統(tǒng)初始化、圖像預(yù)處理模塊、數(shù)據(jù)交互三大模塊。其中,系統(tǒng)初始化模塊作用為完成對OV5640攝像頭的初始化,包含I2C通信模塊、寄存器初值存儲模塊、配置延遲模塊;圖像預(yù)處理模塊負(fù)責(zé)完成視頻圖像的預(yù)處理操作,包括RGB888轉(zhuǎn)Ycbcr模塊、中值濾波模塊、Sobel邊緣提取模塊、開操作模塊;數(shù)據(jù)交互模塊負(fù)責(zé)FPGA與外部數(shù)據(jù)交互,包括攝像頭接收模塊、視頻數(shù)據(jù)緩存模塊、HDMI驅(qū)動模塊。
系統(tǒng)整體邏輯方案如圖1所示。首先由攝像頭初始化模塊通過I2C接口對OV5640進(jìn)行配置,主要參數(shù)配置為:分辨率1280×720、幀率30fps、輸出圖像格式RGB565、輸出接口DVP、輸出時鐘PCLK42MHz;通過圖像接收模塊對視頻進(jìn)行接收的同時將圖像視頻格式轉(zhuǎn)換為RGB888輸入圖像預(yù)處理模塊;在預(yù)處理模塊中,首先將RGB888轉(zhuǎn)為對邊緣提取有益的Ycbcr格式,并經(jīng)過中值濾波初步濾除圖像噪點,然后經(jīng)過SOBEL算子與先腐蝕后膨脹操作完成視頻數(shù)據(jù)預(yù)處理操作;視頻數(shù)據(jù)緩存控制模塊將預(yù)處理后的視頻數(shù)據(jù)緩存入DDR3 SDRAM外部存儲器中,該模塊調(diào)用了MIG核進(jìn)行片外DDR3讀寫控制,讀出的視頻緩存數(shù)據(jù)后經(jīng)由HDMI驅(qū)動模塊輸出至顯示屏觀察系統(tǒng)設(shè)計效果。
圖1 系統(tǒng)邏輯框圖
本設(shè)計采用OV5640高清攝像頭,設(shè)置輸入時鐘XCLK頻率為24M,通過I2C接口賦值寄存器設(shè)置相關(guān)參數(shù),I2C時鐘速率設(shè)置為400K。
本文系統(tǒng)中,分辨率為1280×720,幀率設(shè)置為30fps,其中幀率由總水平輸出寬度HTS、總豎直輸出寬度VTS和輸出時鐘PCLK頻率共同決定。
攝像頭輸出接口設(shè)置為DVP接口,則攝像頭輸出分辨率為DVP輸出水平與豎直寬度,在配置文件中,攝像頭寄存器0X3808內(nèi)數(shù)據(jù)bit[3:0]與0X3809內(nèi)數(shù)據(jù)bit[7:0]拼接控制DVP接口輸出水平寬度,DVP水平輸出為1280,即0X3808配置為05、0X3809配置為00。類似地,DVP輸出豎直寬度為720,即0X380A配置為02,0X380B配置為D0。
0X3035、0X3036、0X3037、0X3108等多個寄存器經(jīng)過倍頻與分頻操作得到輸出時鐘PCLK,本文PCLK配置為42MHz,并通過配置0X380C與0X380D設(shè)置HTS與VTS分別為1892、740。則攝像頭輸出幀率F為:
攝像頭輸出接口配置為DVP接口,輸出格式為RGB565,即一格圖像的數(shù)據(jù)位寬為16位。DVP時序圖如圖2所示。
圖2 DVP時序圖
圖中,VSYNS為幀同步有效信號,兩個VSYNS高電平信號中間輸出一幀圖像的數(shù)據(jù),而HREF為行同步有效信號,當(dāng)HREF信號為高,接口輸出一行圖像的數(shù)據(jù)。
DVP接口的數(shù)據(jù)寬度為8位,所以當(dāng)HREF信號為高時,需兩個PCLK輸出數(shù)據(jù)拼接為一位圖像數(shù)據(jù),在拼接接收到的視頻數(shù)據(jù)的同時,將數(shù)據(jù)RGB三個通道對應(yīng)的5、6、5位數(shù)據(jù)高位填0填充至8位,再將其拼接轉(zhuǎn)化為RGB888格式。
Ycbcr作為圖像色彩空間的一種格式,常用于圖像系統(tǒng)的編解碼中,其中Y分量代表了一格圖像的亮度成分。對于圖像來說,顏色的亮度分量在圖像邊緣處常常發(fā)生突變,更易于提取邊緣[6]。同時,通過將彩色視頻數(shù)據(jù)通過轉(zhuǎn)為Ycbcr格式,提取其中Y分量進(jìn)行后續(xù)的處理,可減少圖像的數(shù)據(jù)處理量。RGB888轉(zhuǎn)換至Ycbcr公式如下:
為避免小數(shù)計算,節(jié)省FPGA內(nèi)部邏輯資源,將RGB三個系數(shù)常量左移8位并量化為整數(shù),在計算后右移8位恢復(fù)量級,并將公式中的運(yùn)算分為乘積、求和、移位三級流水線以提升運(yùn)算速率,同時對相應(yīng)行、場同步信號做同步延遲。
源于排序基礎(chǔ)理論的中值濾波法是非線性濾波方式中抑制噪聲的有效方法之一,在能有效濾除常見的椒鹽噪聲或脈沖噪聲的同時可以保證圖像信息的完整性。本文采用中值濾波是因為該方法即不會造成圖像邊緣模糊,在保留了對常規(guī)圖像濾波效果的同時易于硬件加速實現(xiàn)。中值濾波的原理是采用一個鄰域中的中值來替換該鄰域內(nèi)其他值,其公式為:
其中,f(x,y)為圖像像素點的像素值,g(x,y)為中值濾波后的圖像像素值,W為待濾波的圖像模板。本文采用3×3的矩陣模板,即將臨近的像素點組成3×3的矩陣,并通過排序得出模板中的中值,最后將模板中的其他像素值替換為中值。
在FPGA內(nèi)部邏輯實現(xiàn)過程中,充分利用FPGA的并行能力,通過三級流水線進(jìn)行實現(xiàn):
(1)將三行數(shù)據(jù)分別進(jìn)行排序,得到每行數(shù)據(jù)的最大值、中間值、最小值;
(2)分別對三行數(shù)據(jù)的最大、最小與中間值進(jìn)行同時比較;
(3)將三個最大值比較得到的最小值、三個中間值得到的中間值以及三個最小值比較得到的最大值進(jìn)行比較,得到最后的中值。
在本模塊中,將得到的灰度圖像采用3*3的Sobel算子進(jìn)行水平方向與豎直方向的同步邊緣檢測。
Sobel算法第一步需采用水平算子與豎直算子與視頻每幀圖像進(jìn)行卷積運(yùn)算,其中的Sobel算法的水平算子Sobelx與豎直算子Sobely如式(4)、(5)所示:
對一幀圖像進(jìn)行3*3的卷積運(yùn)算需緩存前兩行的數(shù)據(jù)。本設(shè)計采用了Shiftram IP核對前兩行數(shù)據(jù)進(jìn)行緩存,因為Xinlinx的ShiftramIP核最大深度為1088,采用深度為1024與256的兩個IP核共同緩存一行數(shù)據(jù)。
第二步需計算圖像的梯度向量G,G等于Sobel算子在兩個方向得到的卷積值Gx與Gy的平方根,即:
其中,開方采用CORDIC核進(jìn)行運(yùn)算,其延遲為6個時鐘周期。
第三步將得到的梯度值G與閾值比較,大于閾值則判定為邊緣,小于閾值則相反。將輸出的圖像數(shù)據(jù)值進(jìn)行翻轉(zhuǎn),即讓檢測到的圖像邊緣顯示為白色,非邊緣顯示為黑色。
本文系統(tǒng)中采用雙按鍵來控制Sobel閾值的加減,可使圖像輸出調(diào)整至最佳效果。
由于SOBEL運(yùn)算結(jié)果存在檢測邊緣過厚[7-8]的問題,對處理后的邊緣數(shù)據(jù)進(jìn)行開操作,即先腐蝕后膨脹。開操作可以消除圖像中的細(xì)小噪點,并能平滑邊緣輪廓。腐蝕與膨脹運(yùn)算與中值濾波類似,同樣采用3*3的腐蝕矩陣與膨脹矩陣模板對每幀圖像進(jìn)行運(yùn)算,若圖像數(shù)據(jù)生成的3*3矩陣模板為:
則對應(yīng)的腐蝕輸出Geros與膨脹輸出Gexpa分別為:
將得到的輸出Geros與Gexpa替代該模板中的其他像素值,就得到了輸出圖像。
本模塊采用DDR3存儲控制器MIG的IP核輔助完成數(shù)據(jù)緩存設(shè)計。作為整個系統(tǒng)中的時鐘域數(shù)據(jù)交互模塊,MIG核兩側(cè)分別采用兩個FIFO分別用于MIG的讀寫數(shù)據(jù)緩存以及數(shù)據(jù)的跨時鐘域操作。MIG核輸入差分時鐘頻率為200MHz,兩側(cè)時鐘比例設(shè)置為4:1。
FPGA內(nèi)部邏輯通過控制讀寫使能信號app_en、app_wdf_wren,以及觀測是否可以進(jìn)行讀寫的準(zhǔn)備信號app_rdy、app_wdf_wren進(jìn)行讀寫操作,并化用乒乓操作思想,通過地址總線與BANK地址來進(jìn)行視頻數(shù)據(jù)存儲位置切換,提升了實際帶寬,避免了視頻圖像拖影現(xiàn)象的產(chǎn)生。
本系統(tǒng)采用了常規(guī)HDMI驅(qū)動芯片Sil9134作為顯示橋接芯片,通過產(chǎn)生1280×720的VGA時序讀取讀FIFO內(nèi)的視頻采集數(shù)據(jù),并通過Sil9134芯片轉(zhuǎn)換為HDMI接口輸送至顯示屏顯示。其中1280×720的VGA時序圖見2,通過計數(shù)器產(chǎn)生VSYNC信號和HREF信號,其計數(shù)時序表如表1所示。
表1 VGA時序表
表1中,當(dāng)計數(shù)器在SYNC范圍內(nèi),將VSYNC、HREF信號置為高電平。而當(dāng)計數(shù)器處于DISP范圍內(nèi)時,將行、列有效信號置為高電平,數(shù)據(jù)有效信號DE在行、列信號同時為高時置為高電平。
將代碼下載至開發(fā)板進(jìn)行版級測試,初始閾值設(shè)置為23,測試圖如圖3所示。
圖3 測試原圖
采用中值濾波與Sobel算子結(jié)果如圖4所示,圖像邊緣提取過厚,且在邊緣提取后有細(xì)小噪點產(chǎn)生。
圖4 Sobel提取結(jié)果
加上腐蝕算法后結(jié)果如圖5所示,可以看到,腐蝕操作消除了Sobel提取后的船體體內(nèi)與桅桿周圍的噪點,并削弱了檢測邊緣厚度,但將船帆的左上邊緣、船體下部陰影邊緣以及船體右側(cè)細(xì)小邊緣隔斷或濾除。
圖5 Sobel與腐蝕提取結(jié)果
加上膨脹算法后結(jié)果為圖6所示,膨脹操作將腐蝕操作細(xì)化的邊緣進(jìn)行增強(qiáng),并平滑了船體的邊緣輪廓。
圖6 Sobel與開操作提取結(jié)果
實驗結(jié)果顯示,本文設(shè)計系統(tǒng)可以較好的完成預(yù)期功能,圖像主要邊緣提取效果好,圖像噪聲較低。
本文采用Xinlinx公司Kintex-7系列FPGA的XC7K325T芯片與0V5640高清攝像頭完成了基于Sobel算子的實時圖像采集與顯示系統(tǒng)設(shè)計,并通過版級調(diào)試測試了預(yù)處理算法各模塊的處理效果,驗證了系統(tǒng)工作正確性,為要求更高、算法更為復(fù)雜的實時視頻處理系統(tǒng)設(shè)計提供了參考。