摘 要: 介紹一種基于FPGA的鐵軌檢測(cè)方法,包括嵌入式圖像處理系統(tǒng)的硬件平臺(tái)搭建和基于FPGA的圖像處理算法的研究,。采用基于FPGA的軟核技術(shù),,完成圖像增強(qiáng)和復(fù)原、邊緣檢測(cè),、閾值分割,、連通域搜索等圖像處理基本算法,實(shí)現(xiàn)在圖像中完成鐵軌區(qū)域的提取,。
關(guān)鍵詞: FPGA;嵌入式系統(tǒng),; 圖像處理,;鐵軌檢測(cè)
1 基于FPGA的嵌入式系統(tǒng)開(kāi)發(fā)流程
設(shè)計(jì)一個(gè)嵌入式系統(tǒng),主要包括硬件平臺(tái)搭建和應(yīng)用軟件編寫(xiě),?;贔PGA技術(shù),,硬件平臺(tái)搭建和軟件編寫(xiě)都可在相應(yīng)的軟件平臺(tái)上完成。EDK(Embedded Development Kit)是Xilinx公司開(kāi)發(fā)嵌入式系統(tǒng)的套件工具,。EDK套件工具主要包括硬件平臺(tái)產(chǎn)生器,、軟件平臺(tái)產(chǎn)生器、仿真模型生成器和軟件編譯調(diào)試等工具,,利用其集成開(kāi)發(fā)環(huán)境XPS(platform studio)可以方便地完成嵌入式系統(tǒng)的開(kāi)發(fā)設(shè)計(jì)[1],,設(shè)計(jì)流程如圖1所示。
2 硬件平臺(tái)搭建過(guò)程
分析系統(tǒng)需求中,,鐵軌檢測(cè)主要是進(jìn)行圖像的分析處理,,包括三個(gè)主要部分:圖像輸入、圖像處理和結(jié)果顯示,。本項(xiàng)目使用依元素公司生產(chǎn)的Xilinx Spartan-3a系列xc3s700a的FPGA開(kāi)發(fā)板,,軟件版本為Xilinx10.1。圖像輸入有下列途徑:USB接口,、RS232串口,、100 M以太網(wǎng)接口、EDK套件XMD調(diào)試平臺(tái)直接下載等,。本文將圖像數(shù)據(jù)轉(zhuǎn)換為.ELF文件格式,,直接燒寫(xiě)入Flash中。本文不追求實(shí)現(xiàn)視頻流處理,,并且圖像要多次使用,,源圖像存儲(chǔ)在Flash中最合理。圖像處理由Microblaze軟核系統(tǒng)和檢測(cè)程序共同完成,;圖像顯示由TFT控制器通過(guò)VGA輸出信號(hào)在液晶顯示屏顯示,。具體硬件平臺(tái)搭建過(guò)程如下:
(1)按照XPS應(yīng)用向?qū)В⒆钚∠到y(tǒng),,配置Microblaze軟核系統(tǒng)參數(shù)和添加UART外設(shè),。
(2)添加IP核,并連接到相應(yīng)總線,,主要為內(nèi)存控制器,、通信控制和GPIO等。
(3)添加自定義的IP,。盡管Xilinx提供了許多免費(fèi)IP,,但是免費(fèi)的IP不能滿(mǎn)足用戶(hù)的所有設(shè)計(jì)。本項(xiàng)目需要自定義的IP有用于控制液晶顯示的TFT_Controller和用于內(nèi)存地址總線及數(shù)據(jù)總線復(fù)用的Mux_logic IP,。PLB_TFT_Controller主要產(chǎn)生RGB信號(hào),、行場(chǎng)掃描、同步信號(hào)等,Mux_logic IP用于對(duì)SDRAM和Flash總線復(fù)用進(jìn)行控制,,輸入為SDRAM和Flash的控制IP產(chǎn)生的地址總線信號(hào)和數(shù)據(jù)總線信號(hào)及使能信號(hào),,輸出為復(fù)用地址總線、數(shù)據(jù)總線信號(hào),。
(4)配置相應(yīng)IP,,并進(jìn)行信號(hào)互聯(lián),將需要控制硬件的port連接到外部,。分配地址空間,,添加UCF配置文件。
(5)生成硬件比特流文件和硬件驅(qū)動(dòng)文件,。硬件結(jié)構(gòu)原理圖如圖2所示,。
3 軟件設(shè)計(jì)過(guò)程
3.1 鐵軌檢測(cè)原理
本項(xiàng)目中鐵軌檢測(cè)主要考慮兩種方案[2]:基于邊緣特征和基于區(qū)域特征。(1)基于邊緣特征檢測(cè)方法先在全局范圍檢測(cè)出邊緣線,,再通過(guò)模型或特征限制條件,,從邊緣圖中獲得目標(biāo)邊緣。(2)基于區(qū)域特征的鐵軌檢測(cè),,利用區(qū)域統(tǒng)計(jì)特性,,即鐵軌區(qū)域區(qū)別于周?chē)h(huán)境獨(dú)特統(tǒng)計(jì)特性來(lái)判斷鐵軌區(qū)域。兩種方法中,,前者檢測(cè)到的鐵軌線較為準(zhǔn)確,,但是其對(duì)二值化閾值嚴(yán)重依賴(lài);后者抗噪性較好,,但檢測(cè)的鐵軌線不夠準(zhǔn)確,,本文主要討論基于區(qū)域特征的鐵軌檢測(cè)。
基于區(qū)域特征鐵軌檢測(cè)流程如圖3所示,,分為四個(gè)步驟:
(1)降低分辨率,。在濾波之前,先降低圖像分辨率,,以消除圖像細(xì)節(jié),,也可減輕后續(xù)處理的計(jì)算負(fù)擔(dān)。
(2)濾波處理,。分辨率降低后,,圖像中仍有很多的突兀點(diǎn),這是因?yàn)殍F軌上各種電磁信號(hào)的存在,,攝像頭采集到的圖像不可避免地受到高斯噪聲,、系統(tǒng)噪聲的污染??紤]到圖像特征,,選用中值濾波,它在平滑脈沖噪聲方面非常有效,同時(shí)可以保護(hù)圖像尖銳的邊緣,。
(3)邊緣提取。利用邊緣檢測(cè)算子檢查每個(gè)像素的鄰域并對(duì)灰度變化率進(jìn)行量化,,包括方向的確定,。Sobel邊緣檢測(cè)算子方向性靈活,可以設(shè)置不同的系數(shù),,抑制噪聲效果較好,,使用范圍廣泛,因此選用Sobel算子,。同時(shí)鐵軌圖像橫向變化不大,,而在縱向有很大的延伸,故也只考慮圖像垂直邊緣響應(yīng),。
(4)連通域搜索,。二值化處理后邊緣圖包含了鐵軌信息,也含有很多非鐵軌邊緣,。使用八連通區(qū)域搜索法,,進(jìn)行標(biāo)號(hào)處理,記錄相互獨(dú)立的連通區(qū)域個(gè)數(shù)并進(jìn)行標(biāo)號(hào),。對(duì)連通區(qū)域按照長(zhǎng)度大小進(jìn)行排列,,直到搜索出縱向最長(zhǎng)的兩根鐵軌,然后判斷并標(biāo)記左右兩鐵軌,,之后進(jìn)行區(qū)域填充,,最終可以看到標(biāo)記的鐵軌區(qū)域。
3.2 OpenCV仿真結(jié)果
本項(xiàng)目程序首先實(shí)現(xiàn)OpenCV仿真,,然后移植到FPGA中,。OpenCV提供的圖像處理算法非常豐富,并且部分程序以C語(yǔ)言編寫(xiě),,處理得當(dāng),,不需要添加新的外部支持就可以完整的編譯連接生成執(zhí)行程序進(jìn)行算法移植。本次仿真只運(yùn)用“cv.h”和“highhui.h”兩個(gè)OpenCV庫(kù),,主要是運(yùn)用其圖像加載,、圖像顯示等函數(shù),而中值濾波,、邊緣檢測(cè),、鐵軌搜索函數(shù)自行編寫(xiě)。仿真結(jié)果如圖4所示,。
3.3 FPGA程序移植過(guò)程
3.3.1 圖像輸入與顯示[3]
本項(xiàng)目把圖像數(shù)據(jù)轉(zhuǎn)換為.ELF文件格式,,燒錄到NOR-Flash,在XPS的菜單下點(diǎn)擊Program Flash Memory,選擇自動(dòng)格式轉(zhuǎn)換,,即可進(jìn)行燒錄,,而且可以指定燒錄數(shù)據(jù)的位置。數(shù)據(jù)格式轉(zhuǎn)換利用Matlab軟件完成,,程序如下:
fid = fopen(′pic.elf′,, ′w′);//打開(kāi)文件
img =imread(′Image03.BMP′),;//讀圖像數(shù)據(jù)
imshow(img),;//顯示圖像
fwrite(fid,img.′),;//寫(xiě)數(shù)據(jù)
fclose(fid),;//關(guān)閉文件
由于是灰度圖像,只讀取其亮度值,。圖像分辨率為640×480,。寫(xiě)數(shù)據(jù)可以用fprintf函數(shù)或fwrite函數(shù),但是實(shí)驗(yàn)表明使用fprintf函數(shù)寫(xiě)數(shù)據(jù),,文件大小302 kB,,顯示圖像不正常;而使用fwrite函數(shù)寫(xiě)數(shù)據(jù)文件僅300 kB,,顯示圖像正常,。說(shuō)明兩種函數(shù)寫(xiě)數(shù)據(jù)方式本質(zhì)不同,造成寫(xiě)入數(shù)據(jù)格式不同,。
圖像顯示過(guò)程:先從Flash中每次一行把數(shù)據(jù)讀入BRAM,,然后把每一位亮度值移位變?yōu)镽、G,、B三位,,再?gòu)腂RAM讀數(shù)據(jù)到SDRAM顯存,如此循環(huán)480次,,用以顯示圖片,。由于R、G,、B值相同,,顯示的便是灰度圖像。如果直接從Flash讀數(shù)據(jù)到SDRAM顯存,,顯示圖像每行有不規(guī)則不連續(xù)的黑點(diǎn),,甚至顯示不正常。顯存的設(shè)置在TFT-Controller IP中完成,,顯存空間為2 MB,,起始地址與SDRAM起始地址相同,。
3.3.2 圖像處理程序移植[3]
由于開(kāi)發(fā)環(huán)境不同,移植后程序在獨(dú)立系統(tǒng)上運(yùn)行,,需要對(duì)OpenCV仿真程序做一些改正,。FPGA編程系統(tǒng)支持C語(yǔ)言標(biāo)準(zhǔn)庫(kù)函數(shù),所以打印輸出顯示函數(shù)print(),、動(dòng)態(tài)內(nèi)存分配函數(shù)malloc()可以直接使用,。盡管printf()函數(shù)也可以用于打印輸出結(jié)果,但目的是把程序放入大小為32 KB的BRAM,,實(shí)驗(yàn)表明它比print()函數(shù)占用空間大一倍。在OpenCV中,,可以直接使用cvShowImage(),、cvReleaseImage()、cvDestroyWindow()函數(shù)顯示圖像和釋放內(nèi)存空間,,在移植程序中要自行設(shè)計(jì)這些函數(shù),。移植程序中subplot()函數(shù)用于在屏幕上顯示4幅圖像(降低分辨率源圖像、濾波圖像,、閾值分割圖像,、鐵軌檢測(cè)圖像),DeleteAllPointElems()函數(shù)用于釋放內(nèi)存空間,。其他函數(shù),,例如降低分辨率函數(shù)Dec()、濾波函數(shù)filter(),、邊緣檢測(cè)函數(shù)edge(),,可以完全使用OpenCV中的程序,不需要做修改,。移植后主程序如下:
int main()
{ print("\r\n-- Entering main() --\r\n"),;
SourceImage=(Xuint8*)malloc(640×480);
DecImage=(Xuint8*)malloc(320×240),;
FilterImage=(Xuint8*)malloc(320×240),;
EdgeImage=(Xuint8*)malloc(320×240);
ResultImage3=(Xuint8*)malloc(320×240),;
//為圖像分配內(nèi)存空間
if (SourceImage==NULL)
{print("\r\n--mem allo fail--\r\n"),;
exit(1);}//驗(yàn)證空間是否分配成功
XTft_Initialize(&Tft,, TFT_DEVICE_ID),;
//TFT顯示初始化
XromTftTestColor("black", 0),;
//顯示背景設(shè)置為黑色
flbuf=(unsigned char*)Flash_BASEADDR,;
//設(shè)置Flash圖像基地址指針
p=SourceImage,;//設(shè)置源圖像指針
for (y=0;y<HEIGHT,;y++)
{rowpoint1=flbuf+y*WIDTH,;
for(x=0;x<WIDTH,;x++)
{data1=*(rowpoint1+x),;
*p++=data1;
} }//讀源圖像數(shù)據(jù)
dec(SourceImage,,DecImage),;
filter(DecImage,F(xiàn)ilterImage,,320),;
edge(FilterImage,EdgeImage,,320),;
//圖像降低分辨率、濾波,、邊緣化
nt areanum=0,;
GetFeature(EdgeImage,320,,240,,
ConnLabel,pFeatures,,&areanum),;
//邊緣提取,搜索連通域
GetRailArea(320,,240,,pFeatures,
areanum,,lowLeftRail,,lowRightRail);
//搜索鐵軌區(qū)域,,獲得左右軌
int i,, j;
for (i=1,; i <= areanum,;i++){
DeleteAllPointElems(pFeatures[i]);}
//釋放內(nèi)存空間
int Left,,Right,;
for(i=1,;i<240; i++){
Left=lowLeftRail[i],;
Right=lowRightRail[i],;
if((Left>0)&&(Right>0)){
for(j=Left;j<=Right,;j++){
*(TrackImage+i*320+j)=255,;}}}
//填充鐵軌左右軌之間區(qū)域
subplot(DecImage,1),;
subplot(FilterImage,,2);
subplot(EdgeImage,,3),;
subplot(TrackImage,4),;
//顯示4幅處理圖像
print("-- Exiting main() --\r\n");
}
FPGA圖像處理結(jié)果如圖5所示,。
本文實(shí)現(xiàn)基于FPGA的鐵軌檢測(cè)算法,,首先完成OpenCV程序仿真,然后移植到FPGA構(gòu)建的硬件系統(tǒng)中,,可以成功檢測(cè)出鐵軌所在區(qū)域,,并在一定條件下進(jìn)行鐵軌智能延長(zhǎng)。研究結(jié)果表明,,檢測(cè)一幅分辨率為640×480圖像,,大約需要30 s,如果應(yīng)用于實(shí)時(shí)視頻流系統(tǒng)中,,則硬件平臺(tái)設(shè)計(jì)需要進(jìn)行精簡(jiǎn),,以提高速度。也可考慮基于硬核,、多核技術(shù),,來(lái)提高處理速度,以滿(mǎn)足實(shí)時(shí)視頻流處理,。
參考文獻(xiàn)
[1] 趙澤才,,常青.基于MicroBlaze的嵌入式系統(tǒng)設(shè)計(jì)[D].湖南:國(guó)防科學(xué)技術(shù)大學(xué),2005.
[2] 李俊,,楊春金.基于邊緣特征及對(duì)稱(chēng)差分的鐵路安全圖像處理技術(shù)研究[D].武漢:武漢理工大學(xué),,2009.
[3] 楊杰,黃朝兵.數(shù)字圖像處理及MATLAB實(shí)現(xiàn)[M].北京:電子工業(yè)出版社,,2010.