平臺(tái):zedboard + Webcam
工具:g++4.6 + VIVADO HLS + XILINX EDK + XILINX SDK
系統(tǒng):ubuntu12.04
總體設(shè)計(jì)思路
sobel 算法理論基礎(chǔ)
** 索貝爾算子**(Sobel operator)主要用作邊緣檢測(cè)即寡,在技術(shù)上硕并,它是一離散性差分算子,用來(lái)運(yùn)算圖像亮度函數(shù)的灰度之近似值。在圖像的任何一點(diǎn)使用此算子昏名,將會(huì)產(chǎn)生對(duì)應(yīng)的灰度矢量或是其法矢量芦鳍。
該算子包含兩組3x3的矩陣各拷,分別為橫向及縱向形病,將之與圖像作平面卷積,即可分別得出橫向及縱向的亮度差分近似值蛾找。如果以A代表原始圖像娩脾,Gx及Gy分別代表經(jīng)橫向及縱向邊緣檢測(cè)的圖像灰度值,其公式如下:
Gx = (-1)*f(x-1, y-1) + 0*f(x,y-1) + 1*f(x+1,y-1)
+ (-2)*f(x-1,y) + 0*f(x,y)+2*f(x+1,y)
+ (-1)*f(x-1,y+1) + 0*f(x,y+1) + 1*f(x+1,y+1)
= [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)]
Gy =1* f(x-1, y-1) + 2*f(x,y-1)+ 1*f(x+1,y-1)
+ 0*f(x-1,y) 0*f(x,y) + 0*f(x+1,y)
+ (-1)*f(x-1,y+1) + (-2)*f(x,y+1) + (-1)*f(x+1, y+1)
= [f(x-1,y-1) + 2f(x,y-1) + f(x+1,y-1)]-[f(x-1, y+1) + 2*f(x,y+1)+f(x+1,y+1)]
其中f(a,b),表示圖像(a,b)點(diǎn)的灰度值打毛;
圖像的每一個(gè)像素的橫向及縱向灰度值通過(guò)以下公式結(jié)合柿赊,來(lái)計(jì)算該點(diǎn)灰度的大小:
通常幻枉,為了提高效率 使用不開(kāi)平方的近似值:
如果梯度G大于某一閥值則認(rèn)為該點(diǎn)(x,y)為邊緣點(diǎn)
然后可用以下公式計(jì)算梯度方向:
Sobel算子根據(jù)像素點(diǎn)上下闹瞧、左右鄰點(diǎn)灰度加權(quán)差,在邊緣處達(dá)到極值這一現(xiàn)象檢測(cè)邊緣展辞。對(duì)噪聲具有平滑作用奥邮,提供較為精確的邊緣方向信息,邊緣定位精度不夠高罗珍。當(dāng)對(duì)精度要求不是很高時(shí)洽腺,是一種較為常用的邊緣檢測(cè)方法。
流程
HLS算法驗(yàn)證與實(shí)現(xiàn)
算法驗(yàn)證包括算法C/C++實(shí)現(xiàn)覆旱,綜合編譯仿真蘸朋,實(shí)現(xiàn)導(dǎo)出pcore用于------->XLINX EDK
EDK硬件 工程搭建
EDK中主要搭建zedboard硬件平臺(tái),實(shí)現(xiàn)VDMA(用AXI-Stream)扣唱,HDMI藕坯,DDR等等团南,生成system.bit,用于連同uboot、fsbl生成zedboard bootload (BOOT.BIN)
參考:zedboard啟動(dòng)過(guò)程分析 , zedboard 構(gòu)建嵌入式linux
LINUX系統(tǒng)移植
準(zhǔn)備一張>8G的SD卡炼彪,分區(qū)為FAT32+EXT4(其中EXT4為文件系統(tǒng)>4GB吐根,F(xiàn)AT分區(qū)為內(nèi)核 設(shè)備樹(shù) bootloader) 可以采用gparted分區(qū)工具完成,apt-get install gparted
系統(tǒng)移植包括內(nèi)核鏡像的編譯辐马,bootloader的移植拷橘,設(shè)備樹(shù)的編譯,文件系統(tǒng)的移植
具體移植步驟參見(jiàn)
內(nèi)核鏡像地址:git clone http://github.com/Digilent/linux-3.3.digilent.git)
uboot源碼: git clone git://git.xiinx.com/u-boot-xarm.git
設(shè)備樹(shù)在內(nèi)核中可以找到喜爷,將設(shè)備樹(shù)冗疮,內(nèi)核鏡像,BOOT.BIN拷貝到SD卡中FAT分區(qū)中
文件系統(tǒng) , 直接拷貝到SD卡中EXT4分區(qū)中
LINUX VDMA驅(qū)動(dòng)應(yīng)用程序編寫(xiě)與實(shí)現(xiàn)
編寫(xiě)驅(qū)動(dòng)程序是為了我們能在PS中對(duì)VDMA進(jìn)行管理和控制檩帐。前提是在底層中我們已經(jīng)做好了所有相關(guān)的硬件設(shè)計(jì)等等术幔。
移植OPENCV庫(kù):用于對(duì)比FPGA算法處理速度比較,有兩種方法移植OPENCV庫(kù)湃密,
1: apt-get install libopencv-dev python-opencv
2: opencv下載源碼地址
編譯步驟參考:基于opencv網(wǎng)絡(luò)攝像頭在ubuntu下的視頻獲取
結(jié)果展示
處理時(shí)間顯示
結(jié)果分析
上圖處理時(shí)間中 640*480的視頻
1:opencv處理一幀的時(shí)間0.148554s 大約為7幀每秒
2:fpga硬件實(shí)現(xiàn)一幀總時(shí)間(算法時(shí)間+VDMA拷貝時(shí)間)
3:fpga硬件實(shí)現(xiàn)一幀的算法時(shí)間特愿,不包含拷貝DMA時(shí)間
在cortex A9 700MHZ 速度中 ,F(xiàn)PGA實(shí)現(xiàn)的算法速度比OPENCV軟件實(shí)現(xiàn)速度快50-100倍勾缭,F(xiàn)PGA一秒鐘可以處理500幀圖像,OPENCV只能處理10張不到
但是缺點(diǎn)是目养,視頻拷貝花費(fèi)了太多的時(shí)間俩由。所以我個(gè)人認(rèn)為FPGA處理圖像不在算法實(shí)現(xiàn)有多復(fù)雜與困難,因?yàn)镕PGA的并行率理論上是無(wú)窮的癌蚁,但是視頻流的輸入輸出的速度直接決定了處理速度幻梯。暫時(shí)沒(méi)想到好的方法解決。
參考
使用HLS各種問(wèn)題
Sobel邊緣檢測(cè)算法
shakithweblog博客
作者:xiabodan