(北京特種機械研究所,北京 100143)
目前實時視頻采集與處理系統(tǒng)在智能武器裝備、工業(yè)自動化生產(chǎn)等領(lǐng)域有著廣泛的應(yīng)用。由于實時視頻采集與處理系統(tǒng)要求處理器具有較高的數(shù)據(jù)帶寬和處理速度,這對于高配置的PC機系統(tǒng)能滿足要求,但PC機系統(tǒng)一般體積較大,操作系統(tǒng)規(guī)模大,不穩(wěn)定性增多,同時功耗較大,存在散熱問題;而對于多數(shù)DSP或單FPGA方案存在難以滿足高數(shù)據(jù)帶寬和處理速度的要求,對于DSP+FPGA的擴展方案,系統(tǒng)又變得復(fù)雜,且產(chǎn)品也難以滿足小型化、集成化要求。為此,本文基于Xilinx公司高性能Zynq-7000SoC芯片,設(shè)計了一種小型集成化通用視頻采集與處理平臺系統(tǒng),利用HLS工具將圖像預(yù)處理算法快速打包生成IP核,在PL中實現(xiàn)圖像算法硬件加速設(shè)計,提高了視頻采集與處理快速性和實時性,通過實例和性能對比測試驗證了系統(tǒng)的有效性。
基于SoC的實時視頻高速采集處理系統(tǒng)原理框圖如圖1所示,系統(tǒng)主要由高速CMOS攝像頭傳感器, Zynq-7000 SoC可擴展處理平臺、數(shù)據(jù)存儲單元DDR3和VGA視頻顯示器等組成。Zynq-7000 SoC可擴展平臺作為整個實時處理系統(tǒng)的核心,包括ARM處理系統(tǒng)(Processing System,PS)和FPGA可編程邏輯(Programmable Logic,PL)兩部分,其中PS部分包含了最高可運行在1 GHz的雙Cortex-A9核,高性能的DDR3控制接口和大量的通用外設(shè)接口,PL部分為Xilinx最新的28 nm工藝FPGA,可提供100 Gb/s的內(nèi)部帶寬,內(nèi)部邏輯資源非常豐富,PS和PL之間通過高速AXI總線互聯(lián)進行通信,片內(nèi)帶寬足夠大,消除了芯片間互聯(lián)存在的帶寬瓶頸問題。
根據(jù)數(shù)據(jù)流向,系統(tǒng)讀取外界視頻數(shù)據(jù)信息的流程為:PL部分負責(zé)從CMOS圖像傳感器中獲取視頻信息,通過數(shù)據(jù)轉(zhuǎn)換IP核將視頻數(shù)據(jù)從BAYER格式轉(zhuǎn)化為RGB數(shù)據(jù)格式,然后傳送到圖像預(yù)處理模塊實現(xiàn)對RGB像素信息的各種預(yù)處理,如灰度化、濾波、邊緣化等,此模塊利用Xilinx的HLS工具,通過C語言編程實現(xiàn)各種圖像預(yù)處理IP核的快速定制,而后通過VDMA IP核將處理后的視頻數(shù)據(jù)傳輸至DDR3內(nèi)存芯片中存儲,最后PS從DDR3內(nèi)存芯片中讀取經(jīng)幀緩沖的圖像數(shù)據(jù),進一步對視頻特征信息進行處理和計算,處理結(jié)果不僅可以通過千兆以太網(wǎng)進行遠傳,而且可以通過VDMA IP核、VGA接口控制IP核在顯示器上進行實時顯示。
圖1 系統(tǒng)原理框圖
攝像頭模塊采用OmniVision公司的0V5640攝像頭模塊,具有高幀頻、可配置、低功耗、低成本等優(yōu)點,該攝像頭模塊CMOS陣列大小為2592×1944,能夠采集多種分辨率的圖像,最高可支持500萬像素分辨率,在最高分辨率下幀率可達15fps,在1080p時幀率可達30fps。同時,可通過SPI口配置OV5640片上控制寄存器,實現(xiàn)對攝像頭時序、信號極性等功能靈活配置。
0V5640攝像頭使用Bayer顏色格式,即CMOS芯片的感光陣列中,每個單元都只含有紅、綠、藍三者之一的濾鏡。為了得到RGB像素,需要通過相應(yīng)的算法將Bayer顏色格式轉(zhuǎn)換為RGB格式,即首先根據(jù)攝像頭輸出的同步信號以及數(shù)據(jù)有效信號,采集攝像頭原始數(shù)據(jù);然后運用雙線性插值法將這些原始數(shù)據(jù)進行處理,最終得到RGB像素。該算法通過在PL內(nèi)封裝攝像頭數(shù)據(jù)轉(zhuǎn)換IP核實現(xiàn),以提高數(shù)據(jù)的處理速度。
視頻預(yù)處理模塊用于實現(xiàn)對視頻圖像的預(yù)處理功能,如灰度化、二值化、濾波、邊緣化等。本文利用Xilinx公司的HLS工具,將圖像預(yù)處理算法通過C語言代碼綜合、仿真生成高效的RTL電路,并打包生成IP核,在PL中實現(xiàn)了圖像預(yù)處理算法的并行計算,通過這種算法的硬件加速模式使視頻圖像處理的實時性得到極大提高。下文利用HLS工具對Sobel邊緣檢測算子的硬件加速過程進行了詳細介紹。
1.2.1 Sobel邊緣檢測
Sobel邊緣檢測算子主要用于灰度圖像的邊緣檢測,能夠有效檢測出物體的輪廓。Sobel算子包含兩組矩陣,大小為3×3,如圖2所示,分別為橫向算子和縱向算子。在一幅圖像中,用算子對圖像進行卷積運算,分別得到圖像橫向和縱向的亮度差分近似值。
圖2 Sobel算子
如果以A代表待處理的圖像,以GX和Gy分別代表經(jīng)過橫向、縱向算子卷積后的圖像灰度值,那么公式如(1)、(2)所示:
*A
(1)
(2)
以f(x,y)表示圖像A中(x,y)點的灰度值,那么由式(1)、(2)展開得式(3)、(4):
GX=[f(x+1,y-1)+2×f(x+1,y)+
f(x+1,y+1)]-[f(x-1,y-1)+2×f(x-1,y)+
f(x-1,y+1)]
(3)
Gy=[f(x-1,y-1)+2×f(x,y-1)+
f(x+1,y-1)]-[f(x-1,y+1)+2×f(x,y+1)+
f(x+1,y+1)]
(4)
圖像中每一個像素的橫向及縱向灰度值大小由式(5)計算得到。
(5)
為了在FPGA中提高運算效率,將式(5)近似為式(6)。
G=|GX|+|Gy|
(6)
1.2.2 HLS實現(xiàn)Sobel算子
在HLS工具中,包含了一個專用于視頻處理的Vivado HLS視頻處理開源函數(shù)庫,庫中的函數(shù)和OpenCV函數(shù)具有相似的接口和算法,可用于實現(xiàn)很多基本的OpenCV函數(shù)功能,但它是針對FPGA架構(gòu)實現(xiàn)的圖像處理函數(shù),與OpenCV函數(shù)又有著本質(zhì)的區(qū)別。由于在HLS視頻處理函數(shù)庫中有Sobel函數(shù),因此可以直接采用此函數(shù)通過C或C++代碼綜合、仿真生成高效的RTL電路,而后打包生成功能IP核,從而大大提高了圖像預(yù)處理算法開發(fā)效率。Sobel算子IP核的開發(fā)設(shè)計流程如圖3所示。
圖3 基于HLS實現(xiàn)Sobel算子設(shè)計流程
首先利用HLS工具自帶約束指令將接口約束為AXl4-Stream總線,并利用HLS視頻處理函數(shù)庫中提供的AXl4-Stream與hls::Mat轉(zhuǎn)換函數(shù)實現(xiàn)Mat類型的轉(zhuǎn)換,定義hls::Mat類型的變量,用于存放處理過程中的臨時Mat。
然后,將Mat類型的圖像由三通道的彩色圖像轉(zhuǎn)換成單通道的灰度圖像:
RGB_IMAGE src(rows,cols);
GRAY_IMAGE gray(rows,cols);
GRAY_IMAGE sobel(rows,cols);
其中,RGB-IMAGE與GRAY-IMAGE的區(qū)別在于通道數(shù),RGB_IMAGE有三通道,GRAY-IMAGE有一個通道。每個hls::Mat的高度為rows,寬度為cols。
而后通過調(diào)用HLS函數(shù)庫中的Sobel算法對灰度化圖像進行邊緣化處理,并將處理后的Mat類型圖像轉(zhuǎn)換成視頻流的格式輸出,核心函數(shù)為:
#program HLS dataflow
hls::AXIvideo2Mat(input,src);
hls::CvtColor
hls::Sobel<1,0,3>(gray,sobel);
hls::Mat2AXIvideo(sobel,output);
最后進行代碼綜合,綜合完畢后,需要對HLS的RTL進行仿真。HLS工具可以通過調(diào)用hls_opencv.h頭文件,調(diào)用OpenCV函數(shù),對生成的模塊進行功能仿真,最終打包生成sobel算子IP核。在打包生成IP核同時也生成了一些頭文件和C文件,這些文件中包含IP核的寄存器定義和偏移地址,以及IP核的驅(qū)動函數(shù)API等。
存儲器直接訪問(Direct Memory Access,DMA)技術(shù)是用于數(shù)據(jù)快速交換的一種重要技術(shù),它具有獨立于CPU的后臺批量數(shù)據(jù)傳輸能力,能夠滿足實時圖像處理中高速數(shù)據(jù)傳輸要求,利用PS上的AXI_HP高速接口完成把經(jīng)預(yù)處理的圖像經(jīng)過VDMA(視頻直接內(nèi)存存取)直接緩存在由設(shè)備驅(qū)動程序預(yù)設(shè)的DDR3內(nèi)存中,從而大大提高可編程邏輯部分與處理器部分圖像傳輸速度,為視頻數(shù)據(jù)高速傳輸提供了保障。
在本系統(tǒng)中,VDMA IP核將AXI4-Stream數(shù)據(jù)轉(zhuǎn)換成AXI4總線,實現(xiàn)視頻數(shù)據(jù)的DDR3存儲;同樣也將AXI4總線轉(zhuǎn)換成AXI4-Stream數(shù)據(jù)流,實現(xiàn)存儲器數(shù)據(jù)的讀取;具體的讀寫地址、讀寫數(shù)據(jù)量的大小等由PS端通過AXI4-Lite總線進行配置。VDMA IP核實質(zhì)是一個總線轉(zhuǎn)換IP,實現(xiàn)AXl4-Stream與AXl4總線間數(shù)據(jù)的高速轉(zhuǎn)換。本文調(diào)用了Vivado中自帶的VDMA IP核,其結(jié)構(gòu)如圖4所示。
圖4 VDMA IP核結(jié)構(gòu)框圖
該模塊實現(xiàn)將VDMA 的AXI4-Stream格式的輸出信號轉(zhuǎn)換成VGA時序信號,以便能夠和VGA接口顯示器相連。FPGA并行計算的優(yōu)勢,滿足了VGA數(shù)據(jù)實時更新與顯示的要求。VGA接口控制IP核的結(jié)構(gòu)如圖5所示,主要由異步FIFO、FIFO的寫邏輯、輸出同步模塊以及數(shù)據(jù)格式轉(zhuǎn)換器等組成。AXI4-Stream的Valid信號控制FIFO的寫使能,而Ready信號則由FIFO的滿信號取反得到,輸出同步模塊根據(jù)FIFO的狀態(tài)參數(shù)(如當前FIFO內(nèi)數(shù)據(jù)個數(shù)等)、eol、sof等參數(shù)信號,讀取FIFO,其功能是將video時序信號與FIFO讀取出的AXl4-Stream的數(shù)據(jù)進行同步。通過Verilog語言編寫的邏輯程序,數(shù)據(jù)格式轉(zhuǎn)換器將輸出視頻信號的行場同步數(shù)據(jù),數(shù)據(jù)有效信號等轉(zhuǎn)換成VGA接口需要的RGB數(shù)據(jù),行場同步以及VGA時鐘。其中,轉(zhuǎn)換出的24位RGB數(shù)據(jù)信號分別為8位的R信號,8位的G信號, 8位的B信號。不同分辨率下,VGA接口控制模塊的像素時鐘不同,像素時鐘根據(jù)需求由可配置時鐘模塊產(chǎn)生。
圖5 VGA接口控制IP核
系統(tǒng)硬件工程在Vivado綜合完畢后,在生成PL硬件Bit流的同時,會生成一個BSP板級支持包,在PL內(nèi)部通過AXl4-Lite總線與PS相連的各功能IP核的物理地址信息都包含在這個BSP板級支持包里。系統(tǒng)驅(qū)動軟件基于BSP包內(nèi)地址信息實現(xiàn)各IP核初始化配置,通信控制等功能。
系統(tǒng)軟件基于Vivado自帶的SDK開發(fā)平臺進行設(shè)計,采用C語言編程,系統(tǒng)軟件流程圖如圖6所示。首先,系統(tǒng)上電后,PS先啟動,經(jīng)過硬件平臺初始化,IO輸入輸出接口(GPIO)初始化,攝像頭參數(shù)配置,基于BSP包的各IP核配置以及VDMA配置等一系列配置操作后,PL部分的IP核開始進入正常工作模式。配置結(jié)束后,軟件進入主循環(huán),分配VDMA的讀寫緩沖區(qū),分配完畢后從緩沖區(qū)中讀取、處理圖像,并寫入DDR3相應(yīng)地址。每一次循環(huán)都需要重新分配緩沖區(qū)的地址,最后將處理完畢的圖像通過千兆以太網(wǎng)進行遠傳或者在顯示器上進行實時顯示。
圖6 系統(tǒng)軟件流程圖
系統(tǒng)功能和性能在SnowLeo開發(fā)平臺上進行測試,該開發(fā)平臺大小為80 cm×60 cm,板載Zynq-7020SoC芯片,外設(shè)主要由CMOS攝像頭、VGA顯示器、上位機組成。上位機通過仿真器與SnowLeo平臺連接,將系統(tǒng)軟件燒寫到芯片中,SnowLeo平臺通過VGA接口與顯示屏VGA接口相連,用于顯示視頻處理結(jié)果。SoC視頻處理系統(tǒng)功能測試連接關(guān)系如圖7所示,圖8為系統(tǒng)功能的驗證結(jié)果,圖8(a)所示為視頻圖像原始信息,圖8(b)為圖8(a)經(jīng)Sobel算子加速后得到的處理結(jié)果,可見系統(tǒng)功能正常,能夠正確檢測并清晰顯示圖像的邊緣信息。
圖7 系統(tǒng)測試連接關(guān)系
圖8 系統(tǒng)功能測試結(jié)果
為了測試本文提出的視頻處理系統(tǒng)的性能,利用Opencv在PS部分應(yīng)用層軟件也實現(xiàn)了Sobel邊緣檢測算法,然后對圖像處理的幀率進行了比較測試。
基于Opencv的Sobel圖像處理函數(shù)的API定義如下:
void sobel(char*rgb_data_in,char*rgb_data_out,int height,int width,int stride)
其中,*rgb_data_in為指向輸入端某一幀幀緩存圖像初始地址rgb_data_in的指針。*rgb_data_out為指向輸出端某一幀幀緩存圖像初始地址rgb_data_out的指針。形參中還包括height,width與stride三個參數(shù),表示了一幀圖像的高度、寬度與步長。
對于本文提出的基于PL硬件實現(xiàn)Sobel邊緣檢測,由于沒有PS參與處理,因此通過示波器測量圖像處理模塊IP核的中斷信號測試幀率。對于基于Opencv軟件實現(xiàn)Sobel邊緣檢測算法,每一幀處理完畢都會產(chǎn)生一個中斷信號,因此只需測量相鄰兩個中斷信號之間的時間,即可計算出幀率。表1為基于PL硬件實現(xiàn)Sobel邊緣檢測和基于Opencv軟件實現(xiàn)Sobel邊緣檢測兩種情況下幀率的測試結(jié)果,為了提高測試精度,各測試3次,每次測20幀圖像數(shù)據(jù),然后求平均時間。測試攝像頭分辨率配置成640x480,幀率為30 fps。
表1 性能測試結(jié)果對比
可見,將基于PL硬件實現(xiàn)Sobel邊緣檢測平均時間換算成幀率,仍為攝像頭的幀率,這是因為硬件中,窗口數(shù)據(jù)的處理為實時的流處理,只要滿足時序約束,圖像處理的幀率即和攝像頭輸入幀率保持一致。而基于Opencv軟件實現(xiàn)Sobel邊緣檢測由于采取的是純軟件串行處理的模式,幀率只有攝像頭輸入幀率的1/15倍,可見本文提出的系統(tǒng)視頻圖像信息處理的快速性和實時性較好。
本文基于Xilinx公司高性能Zynq-7000 SoC芯片,提出了一種小型集成化通用視頻采集處理系統(tǒng)設(shè)計方法,利用HLS工具將圖像預(yù)處理算法快速打包生成IP核,在PL中實現(xiàn)了圖像預(yù)處理算法的硬件加速,與傳統(tǒng)設(shè)計方案相比,視頻圖像處理的快速性和實時性得到了極大提高,而且滿足了視頻處理設(shè)備小型化、集成化、低功耗發(fā)展需求,通過設(shè)計實例驗證了系統(tǒng)的有效性。本設(shè)計采用的基于可編程SoC視頻圖像處理技術(shù),將會是未來視頻圖像處理技術(shù)的發(fā)展方向,在智能武器裝備,工業(yè)自動化生產(chǎn)等軍民領(lǐng)域具有廣闊的應(yīng)用前景。