新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 基于FPGA的鐵軌檢測算法設(shè)計與研究

基于FPGA的鐵軌檢測算法設(shè)計與研究

作者: 時間:2011-09-27 來源:網(wǎng)絡(luò) 收藏


3.2 OpenCV仿真結(jié)果
 本項目程序首先實現(xiàn)OpenCV仿真,然后移植到FPGA中。OpenCV提供的算法非常豐富,并且部分程序以C語言編寫,處理得當(dāng),不需要添加新的外部支持就可以完整的編譯連接生成執(zhí)行程序進(jìn)行算法移植。本次仿真只運用“cv.h”和“highhui.h”兩個OpenCV庫,主要是運用其圖像加載、圖像顯示等函數(shù),而中值濾波、邊緣檢測、鐵軌搜索函數(shù)自行編寫。仿真結(jié)果如圖4所示。

基于FPGA的鐵軌檢測算法設(shè)計與研究

3.3 FPGA程序移植過程
3.3.1 圖像輸入與顯示[3]

 本項目把圖像數(shù)據(jù)轉(zhuǎn)換為.ELF文件格式,燒錄到NOR-Flash,在XPS的菜單下點擊Program Flash Memory,選擇自動格式轉(zhuǎn)換,即可進(jìn)行燒錄,而且可以指定燒錄數(shù)據(jù)的位置。數(shù)據(jù)格式轉(zhuǎn)換利用Matlab軟件完成,程序如下:
fid = fopen(′pic.elf′, ′w′);//打開文件
img =imread(′Image03.BMP′);//讀圖像數(shù)據(jù)
imshow(img);//顯示圖像
fwrite(fid,img.′);//寫數(shù)據(jù)
fclose(fid);//關(guān)閉文件
 由于是灰度圖像,只讀取其亮度值。圖像分辨率為640×480。寫數(shù)據(jù)可以用fprintf函數(shù)或fwrite函數(shù),但是實驗表明使用fprintf函數(shù)寫數(shù)據(jù),文件大小302 kB,顯示圖像不正常;而使用fwrite函數(shù)寫數(shù)據(jù)文件僅300 kB,顯示圖像正常。說明兩種函數(shù)寫數(shù)據(jù)方式本質(zhì)不同,造成寫入數(shù)據(jù)格式不同。
 圖像顯示過程:先從Flash中每次一行把數(shù)據(jù)讀入BRAM,然后把每一位亮度值移位變?yōu)镽、G、B三位,再從BRAM讀數(shù)據(jù)到SDRAM顯存,如此循環(huán)480次,用以顯示圖片。由于R、G、B值相同,顯示的便是灰度圖像。如果直接從Flash讀數(shù)據(jù)到SDRAM顯存,顯示圖像每行有不規(guī)則不連續(xù)的黑點,甚至顯示不正常。顯存的設(shè)置在TFT-Controller IP中完成,顯存空間為2 MB,起始地址與SDRAM起始地址相同。
3.3.2 程序移植[3]
 由于開發(fā)環(huán)境不同,移植后程序在獨立系統(tǒng)上運行,需要對OpenCV仿真程序做一些改正。FPGA編程系統(tǒng)支持C語言標(biāo)準(zhǔn)庫函數(shù),所以打印輸出顯示函數(shù)print()、動態(tài)內(nèi)存分配函數(shù)malloc()可以直接使用。盡管printf()函數(shù)也可以用于打印輸出結(jié)果,但目的是把程序放入大小為32 KB的BRAM,實驗表明它比print()函數(shù)占用空間大一倍。在OpenCV中,可以直接使用cvShowImage()、cvReleaseImage()、cvDestroyWindow()函數(shù)顯示圖像和釋放內(nèi)存空間,在移植程序中要自行設(shè)計這些函數(shù)。移植程序中subplot()函數(shù)用于在屏幕上顯示4幅圖像(降低分辨率源圖像、濾波圖像、閾值分割圖像、圖像),DeleteAllPointElems()函數(shù)用于釋放內(nèi)存空間。其他函數(shù),例如降低分辨率函數(shù)Dec()、濾波函數(shù)filter()、邊緣檢測函數(shù)edge(),可以完全使用OpenCV中的程序,不需要做修改。移植后主程序如下:
int main()
{ print("rn-- Entering main() --rn");
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("rn--mem allo fail--rn");
exit(1);}//驗證空間是否分配成功
XTft_Initialize(Tft, TFT_DEVICE_ID);
//TFT顯示初始化
XromTftTestColor("black", 0);
//顯示背景設(shè)置為黑色
flbuf=(unsigned char*)Flash_BASEADDR;
//設(shè)置Flash圖像基地址指針
p=SourceImage;//設(shè)置源圖像指針
for (y=0;yHEIGHT;y++)
{rowpoint1=flbuf+y*WIDTH;
for(x=0;xWIDTH;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;i240; 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() --rn");
}
 FPGA結(jié)果如圖5所示。

基于FPGA的鐵軌檢測算法設(shè)計與研究

 本文實現(xiàn)基于FPGA的算法,首先完成OpenCV程序仿真,然后移植到FPGA構(gòu)建的硬件系統(tǒng)中,可以成功檢測出鐵軌所在區(qū)域,并在一定條件下進(jìn)行鐵軌智能延長。研究結(jié)果表明,檢測一幅分辨率為640×480圖像,大約需要30 s,如果應(yīng)用于實時視頻流系統(tǒng)中,則硬件平臺設(shè)計需要進(jìn)行精簡,以提高速度。也可考慮基于硬核、多核技術(shù),來提高處理速度,以滿足實時視頻流處理。


上一頁 1 2 下一頁

關(guān)鍵詞: 圖像處理 鐵軌檢測

評論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉