<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

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

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

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


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

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

          3.3 FPGA程序移植過程
          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′);//打開文件
          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ù),但是實(shí)驗(yàn)表明使用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ù)的黑點(diǎn),甚至顯示不正常。顯存的設(shè)置在TFT-Controller IP中完成,顯存空間為2 MB,起始地址與SDRAM起始地址相同。
          3.3.2 程序移植[3]
           由于開發(fā)環(huán)境不同,移植后程序在獨(dú)立系統(tǒng)上運(yùn)行,需要對(duì)OpenCV仿真程序做一些改正。FPGA編程系統(tǒng)支持C語言標(biāo)準(zhǔn)庫函數(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幅圖像(降低分辨率源圖像、濾波圖像、閾值分割圖像、圖像),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);}//驗(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;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è)計(jì)與研究

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


          上一頁 1 2 下一頁

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

          評(píng)論


          相關(guān)推薦

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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();