楊美娜 肖世偉 馮祥虎 杜 軍
(哈爾濱師范大學(xué)計算機科學(xué)與信息工程學(xué)院,黑龍江 哈爾濱 150025)
隨著數(shù)字圖像處理領(lǐng)域的不斷發(fā)展,能夠高效優(yōu)秀處理數(shù)據(jù)的嵌入式圖像處理數(shù)據(jù)系統(tǒng)逐漸成為學(xué)界研究的熱潮。FPGA(Field Programmable GateArray,現(xiàn)場可編程邏輯門陣列)在圖像處理領(lǐng)域有著巨大優(yōu)勢。其內(nèi)部包括眾多的可配置邏輯模塊,可編程存儲資源,內(nèi)部總線和I/O模塊組成的專用電路。另一方面,它還具有優(yōu)秀的并行計算能力而且提供一定的帶寬資源。因此FPGA可以完美契合實時視頻處理需求,將視頻傳輸數(shù)據(jù)以數(shù)據(jù)流的形式傳遞與計算,并能根據(jù)圖像處理算法的變化重構(gòu)硬件系統(tǒng)。
邊緣檢測是進行計算機以及人類視覺和模式識別與圖像處理技術(shù)的重要前提,它不僅可以減少圖像處理的數(shù)據(jù)量,同時能夠最大限度保留圖像中物體的形狀信息,所以它在目標(biāo)識別與跟蹤、計算機視覺領(lǐng)域廣泛應(yīng)用。它可以提取圖像中像素發(fā)生明顯變化的像素點,即圖像中的邊緣。由于視頻分辨率的不斷提高,傳統(tǒng)嵌入式邊緣檢測系統(tǒng)中一直存在丟幀和實時性與功耗無法滿足要求的現(xiàn)象。
為了更好地提高視頻流數(shù)據(jù)接收的實時性,本系統(tǒng)在視頻傳輸方式上選擇了第三代USB(Universal Serial Bus)接口,即USB3.0總線接口。其傳輸速度是上一代USB2.0接口的十倍以上,最高可以達到640MB/s,同時傳輸方式由原來的半雙工通信方式改為全雙工通信方式。
考慮以上內(nèi)容,本文提出了一種基于FPGA和USB3.0的實時邊緣檢測系統(tǒng),硬件采用AC6102開發(fā)板與OV5640攝像頭模塊設(shè)計實現(xiàn),最終達到了實時邊緣檢測的預(yù)期效果,并且片上資源占用率小于1%。
系統(tǒng)由OV5640攝像頭、FPGA、ARM9(FX3)、USB3.0和PC(Personal Computer)機組成,由FPGA控制采集并實時處理攝像頭采集到的數(shù)據(jù),同時將處理好的數(shù)據(jù)通過GPIF II接口(通用可編程接口)發(fā)送給ARM處理器,ARM處理器則負責(zé)接收數(shù)據(jù)并將數(shù)據(jù)按照USB3.0的視頻傳輸協(xié)議(UVC)通過USB3.0接口發(fā)送至PC上位機,在上位機安裝好驅(qū)動以及Cypress官方提供的VirtualDub工具就能查看到系統(tǒng)處理后的視頻,系統(tǒng)整體框架如圖1所示。
圖1 硬件總體框架
系統(tǒng)對OV5640攝像頭初始化模塊配置包括:攝像頭初始化配置與IIC總線控制模塊;攝像頭接收模塊增設(shè)寄存器對數(shù)據(jù)流進行時鐘控制。系統(tǒng)邏輯框圖如圖2所示。
圖2 系統(tǒng)邏輯框圖
(1)對攝像頭初始化的主要參數(shù)配置為:輸入與輸出時鐘為24MHz、幀率30fps、輸出圖像格式Y(jié)UV422、輸出接口DVP。由于OV5640支持圖像質(zhì)量控制:色飽和度調(diào)節(jié)、色調(diào)調(diào)節(jié)、自動曝光控制和色彩飽和度調(diào)整等,因此在初始化配置時也需要配置這些功能對應(yīng)的寄存器參數(shù)。
(2)采用IIC總線的原因是接口直接在組件之上,因此IIC總線占用的空間非常小,減少了電路板的空間和芯片管腳的數(shù)量,降低了互聯(lián)成本。不僅如此,IIC接口還具有簡單性和有效性、代碼簡潔等優(yōu)點。IIC接口有兩條總線線路,一條是串行數(shù)據(jù)線SDA,一條是串行時鐘線SCL。SCL為高電平時,SDA數(shù)據(jù)需保持穩(wěn)定;SCL為低電平時,SDA數(shù)據(jù)發(fā)生變化。在進行數(shù)據(jù)傳輸時狀態(tài)機包括:寫請求、起始位請求、讀請求、停止位請求、應(yīng)答位請求和無應(yīng)答請求。
圖像的邊緣通常被我們認為是圖像中灰度值或亮度發(fā)生明顯變化的局部區(qū)域,即圖像的亮度信息發(fā)生陡峭變化的區(qū)域。圖像邊緣可以劃分為三種形式:階梯型邊緣、斜坡型邊緣、線性邊緣。根據(jù)圖像的邊緣區(qū)域存在陡峭的灰度值或亮度變化這一特性,采取合適的數(shù)字方法,對目標(biāo)圖像進行檢測運算操作,能夠提取出目標(biāo)圖的邊界線。當(dāng)前的邊緣檢測方法大體可以分為三類:基于一階微分運算的梯度邊緣檢測方法,基于二階微分運算的邊緣檢測算子,以及運算復(fù)雜但是效果理想的Canny算子。由于Sobel算子在實際應(yīng)用的場景中檢測效率高,并且其算法的運算可由FPGA可編程宏功能模塊實現(xiàn),故選取Sobel算子作為邊緣檢測算法。
Sobel算子是一種基于一階微分運算的邊緣檢測算法,是圖像邊緣檢測中最重要的算子之一。該算子包含兩組3×3的矩陣,分別為橫向及縱向,將之與當(dāng)前時鐘的目標(biāo)圖像的3×3矩陣進行二維卷積操作,即可分別得出橫向及縱向的亮度差分近似值。其中Sobel算子的橫向算子與縱向算子如式(1)、(2)所示,其中A為目標(biāo)圖像3×3矩陣。
在得到縱向算子與橫向算子后,根據(jù)兩個方向的結(jié)果進行處理,求得圖像的梯度向量,計算公式如式(3)所示。很多系統(tǒng)設(shè)計者為了計算方便,而采用取模的方式代替公式(3),但是本系統(tǒng)為了追求邊緣檢測算法結(jié)果的精確性,依舊采取原公式對橫向算子與縱向算子進行計算。
對于視頻流處理,首先根據(jù)YUV422格式的數(shù)據(jù)存儲方式,設(shè)置計數(shù)器負責(zé)提取視頻流數(shù)據(jù)中的灰度數(shù)據(jù)(Y通道),其中剩余的色度分量會被覆蓋。其次將一維的視頻數(shù)據(jù)流轉(zhuǎn)變?yōu)橹辽倬彺鎯尚械母袷?,調(diào)用一個深度為3的Shift_RAM IP核對前兩行數(shù)據(jù)進行緩存,使用Shift_RAM移位寄存器的優(yōu)點是因為可以進行自動移位換行,Shift_RAM的工作原理是移位存儲,后一個數(shù)據(jù)進入后將前一個數(shù)據(jù)往前推,當(dāng)填滿此行時,跳到下一行再繼續(xù)移位存儲,最終得到3×3陣列,其數(shù)據(jù)流原理如圖3所示。Shift_RAM可以實時存儲當(dāng)前時鐘的一幀圖像的3×3矩陣數(shù)據(jù),隨著時鐘的跳變,達到二維卷積中的滑窗操作。
圖3 Shift_RAM原理
得到當(dāng)前3×3陣列后將其與Sobel算子分別進行乘加運算,得到縱向算子與橫向算子,其中乘2運算使用左移一位實現(xiàn)。將算子分別與自己相乘求和得到需要求平方根的數(shù)據(jù),在這里調(diào)用了altsqrt IP核進行開平方的運算。將得到的梯度值與閾值(設(shè)置為100)比較,大于閾值則判定為邊緣,小于閾值則相反。將輸出圖像數(shù)據(jù)值進行翻轉(zhuǎn),即讓檢測到的圖像邊緣為白色,非邊緣顯示為黑色。
UVC(全稱USB video class)是USB規(guī)范協(xié)議中設(shè)備類規(guī)范的其中一種。根據(jù)UVC協(xié)議的視頻功能可以分為單元和終端兩種實體,它們分別有自己的描述符,每個單元的描述符包含了這個單元的所有信息,終端描述符則提供了所有終端的信息。單元描述符和端點描述符一起描述了端點和單元的組合方式。視頻的終端有輸入和輸出終端,在此基礎(chǔ)上擴展功能的相機終端和媒體傳輸終端。視頻的單元包含選擇單元、處理單元和擴展單元。對于一個USB視頻類設(shè)備,它們在接入主機后主要通過描述符讓主機獲得各自的屬性和被確認為標(biāo)準(zhǔn)的USB類設(shè)備,這些描述符是標(biāo)準(zhǔn)的USB描述符并在其子描述符中定義了USB設(shè)備的各種功能。從端口來看,主要可以分為視頻控制端口和視頻流端口兩個部分。
按照UVC協(xié)議的規(guī)定,在傳輸無壓縮的視頻數(shù)據(jù)時需要在前面加一個12B的包頭,主要是包含一些傳輸圖像的屬性信息,對于每一次圖像傳輸都要加上UVC的包頭。由于USB3.0圖像采集系統(tǒng)需要傳輸大量的視頻數(shù)據(jù),所以在傳輸時本系統(tǒng)采用USB3.0塊傳輸?shù)姆绞?,傳輸?shù)淖畲笸话l(fā)為16,數(shù)據(jù)包的最大字節(jié)數(shù)為1024,一次USB3.0傳輸?shù)臄?shù)據(jù)量最大為16KB。
這部分設(shè)計使用到了Cypress官方提供的GPIF II Designer、EZ USB Suite、Control Center工具。通過GPIFIIDesigner工具對GPIFII接口進行配置端口與狀態(tài)機設(shè)計,配置完成后需要生成相應(yīng)的.h頭文件以用來后面的固件程序開發(fā);通過EZ USB Suite工具進行固件架構(gòu)設(shè)計,其作用包括接收FPGA發(fā)來的數(shù)據(jù),并將數(shù)據(jù)按照UVC協(xié)議的通信方式傳給上位機,固件總體架構(gòu)如圖4所示。
圖4 固件總體框架
該系統(tǒng)主程序main()函數(shù)部分主要用來對芯片時鐘、端口的初始化,在主程序中啟動ThreadX RTOS后,為固件應(yīng)用創(chuàng)建兩個線程:一個是UVC應(yīng)用線程,主要用來接收圖像數(shù)據(jù);另一個是UVC控制線程,主要用于響應(yīng)用戶的請求命令。在應(yīng)用線程入口函數(shù)中初始化UART端口,構(gòu)建DMA通道,配置Endpoint端口,在UVC控制線程入口函數(shù)中設(shè)置圖像的亮度、對比度等參數(shù)。
ARM9處理器完成外設(shè)間的配置后,DMA結(jié)構(gòu)直接管理傳輸,不需要CPU干預(yù),其數(shù)據(jù)傳輸寬帶不會受到CPU性能影響,提高了數(shù)據(jù)傳輸速度。傳輸過程中為圖像傳輸創(chuàng)建了兩個DMA通道,每個DMA通道都有兩個端口,分別為producer socket和consumer socket。在這里兩個DMA通道共用一個consumer socket,傳輸數(shù)據(jù)采用乒乓的方式,兩個DMA輪流接收來自FPGA的數(shù)據(jù)。其DMA結(jié)構(gòu)如圖5所示。
圖5 DMA通道結(jié)構(gòu)圖
根據(jù)系統(tǒng)結(jié)構(gòu)設(shè)計,將編寫好的代碼編譯運行和燒錄下載后,即可在上位機查看視頻結(jié)果。為了更直觀地查看結(jié)果,首先燒錄的是進行Sobel邊緣檢測前的程序得到其原圖,其結(jié)果如圖6(a)所示。然后燒錄加入Sobel算子處理的程序,其結(jié)果如圖6(b)所示??梢钥闯?,設(shè)計的基于FPGA和USB3.0的實時Sobel邊緣檢測系統(tǒng)能夠達到預(yù)期的效果,可以很好地提取圖像邊緣信息,幀率達到30fps。并且片上資源占用率小于1%,為后續(xù)設(shè)計提供了足夠的硬件資源。
圖6 系統(tǒng)結(jié)果對比
本文對Sobel邊緣檢測進行了深入研究與設(shè)計,提出了一種軟件與硬件結(jié)合的架構(gòu)即USB3.0高速接口與FPGA流水線的架構(gòu)。通過實驗所得的圖像可以看出,設(shè)計的系統(tǒng)達到了預(yù)期效果,實現(xiàn)了實時的邊緣檢測系統(tǒng)。不僅如此,系統(tǒng)占用資源極少,為后續(xù)的圖像處理操作留下了大量的系統(tǒng)空間?;谝陨蟽?nèi)容,接下來將繼續(xù)使用該架構(gòu)實現(xiàn)更高層次的實時數(shù)字圖像處理系統(tǒng)。