首 页文档资料下载资料维修视频包年699元
请登录  |  免费注册
当前位置:精通维修下载 > 文档资料 > 家电技术 > 单元电路介绍 > 其它电路
基于FPGA的铁轨检测算法设计与研究
来源:本站整理  作者:佚名  2011-10-07 07:50:06



3.3 FPGA程序移植过程
3.3.1 图像输入与显示[3]

 本项目把图像数据转换为.ELF文件格式,烧录到NOR-Flash,在XPS的菜单下点击Program Flash Memory,选择自动格式转换,即可进行烧录,而且可以指定烧录数据的位置。数据格式转换利用Matlab软件完成,程序如下:
fid = fopen(′pIC.elf′, ′w′);//打开文件
img =imread(′Image03.BMP′);//读图像数据
imshow(img);//显示图像
fwrite(fid,img.′);//写数据
fclose(fid);//关闭文件
 由于是灰度图像,只读取其亮度值。图像分辨率为640×480。写数据可以用FPrintf函数或fwrite函数,但是实验表明使用fprintf函数写数据,文件大小302 kB,显示图像不正常;而使用fwrite函数写数据文件仅300 kB,显示图像正常。说明两种函数写数据方式本质不同,造成写入数据格式不同。
 图像显示过程:先从Flash中每次一行把数据读入BRAM,然后把每一位亮度值移位变为R、G、B三位,再从BRAM读数据到SDRAM显存,如此循环480次,用以显示图片。由于R、G、B值相同,显示的便是灰度图像。如果直接从Flash读数据到SDRAM显存,显示图像每行有不规则不连续的黑点,甚至显示不正常。显存的设置在TFT-Controller IP中完成,显存空间为2 MB,起始地址与SDRAM起始地址相同。
3.3.2 图像处理程序移植[3]
 由于开发环境不同,移植后程序在独立系统上运行,需要对OpenCV仿真程序做一些改正。FPGA编程系统支持C语言标准库函数,所以打印输出显示函数print()、动态内存分配函数malLOC()可以直接使用。尽管printf()函数也可以用于打印输出结果,但目的是把程序放入大小为32 KB的BRAM,实验表明它比print()函数占用空间大一倍。在OpenCV中,可以直接使用cvShowImage()、cvReleaseImage()、cvDestroyWindow()函数显示图像和释放内存空间,在移植程序中要自行设计这些函数。移植程序中subplot()函数用于在屏幕上显示4幅图像(降低分辨率源图像、滤波图像、阈值分割图像、铁轨检测图像),DeleteAllPointElEMS()函数用于释放内存空间。其他函数,例如降低分辨率函数Dec()、滤波函数fiLTEr()、边缘检测函数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);
//为图像分配内存空间
if (SourceImage==NULL)
  {print("rn--mem allo fail--rn");
  exit(1);}//验证空间是否分配成功
  XTft_Initialize(&Tft, TFT_DEVICE_ID);
  //TFT显示初始化
XromTftTestColor("black", 0);
//显示背景设置为黑色
flbuf=(unsigned char*)Flash_BASEADDR;
//设置Flash图像基地址指针
p=SourceImage;//设置源图像指针
for (y=0;y<HEIGHT;y++)
{rowpoint1=flbuf+y*WIDTH;
  for(x=0;x<WIDTH;x++)
  {data1=*(rowpoint1+x);
       *p++=data1;
    } }//读源图像数据
dec(SourceImage,DecImage);
filter(DecImage,FilterImage,320);
edge(FilterImage,EdgeImage,320);
 //图像降低分辨率、滤波、边缘化
nt areanum=0;
GetFeature(EdgeImage,320,240,
ConnLabel,pFeatures,&areanum);
//边缘提取,搜索连通域
 GetRailArea(320,240,pFeatures,
areanum,lowLeftRail,lowRightRail);
//搜索铁轨区域,获得左右轨
 int i, j;
 for (i=1; i <= areanum;i++){
 DeleteAllPointElems(pFeatures[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;}}}
 //填充铁轨左右轨之间区域
subplot(DecImage,1);
subplot(FilterImage,2);
subplot(EdgeImage,3);
subplot(TrackImage,4);
 //显示4幅处理图像
print("-- Exiting main() --rn");
   }
 FPGA图像处理结果如图5所示。

 本文实现基于FPGA的铁轨检测算法,首先完成OpenCV程序仿真,然后移植到FPGA构建的硬件系统中,可以成功检测出铁轨所在区域,并在一定条件下进行铁轨智能延长。研究结果表明,检测一幅分辨率为640×480图像,大约需要30 s,如果应用于实时视频流系统中,则硬件平台设计需要进行精简,以提高速度。也可考虑基于硬核、多核技术,来提高处理速度,以满足实时视频流处理。
参考文献
[1] 赵泽才,常青.基于MicroBlaze的嵌入式系统设计[D].湖南:国防科学技术大学,2005.
[2] 李俊,杨春金.基于边缘特征及对称差分的铁路安全图像处理技术研究[D].武汉:武汉理工大学,2009.
[3] 杨杰,黄朝兵.数字图像处理及MATLAB实现[M].北京:电子工业出版社,2010.

上一页  [1] [2] 

关键词:

文章评论评论内容只代表网友观点,与本站立场无关!

   评论摘要(共 0 条,得分 0 分,平均 0 分)
Copyright © 2007-2017 down.gzweix.Com. All Rights Reserved .
页面执行时间:142,484.40000 毫秒