基于ARM嵌入式图像处理系统的研究.docx
《基于ARM嵌入式图像处理系统的研究.docx》由会员分享,可在线阅读,更多相关《基于ARM嵌入式图像处理系统的研究.docx(24页珍藏版)》请在冰豆网上搜索。
基于ARM嵌入式图像处理系统的研究
数字信号处理
课程小论文
题 目:
基于ARM嵌入式图像处理系统的研究
学生姓名:
学号:
院(系):
专业:
入学时间:
年 月
导师姓名:
职称/学位:
导师所在单位:
完成时间:
年 月
基于ARM嵌入式图像处理系统的研究
摘要
传统的基于PC机的图像处理系统,体积庞大,不具有便携性,而限制了其在移动通信、便携设备等领域的应用。
开发低功耗、小型化、便携性的嵌入式图像处理系统具有现实的意义和广泛的应用前景。
本文对系统进行功能分析和总体设计,介绍了ARM的嵌入式硬件平台的设计与实现,包括系统基本模块的硬件设计和开发过程,具体有电源电路和时钟电路、存储电路、USB摄像头接口电路和LCD电路等,完成了Linux操作系统内核的定制和交叉编译、BootLoader、驱动程序的开发,对图像进行灰度化和均衡化等预处理,得到比较清晰的图像。
最后总结了本课题研究所取得的成果及其不足之处,对研究进行了总结和展望。
关键词:
图像处理;嵌入式平台;ARM;Linux
StudyonImageProcessingSystemBasedonARMEmbeddedSystem
Abstract
TraditionalimageprocessingsystembasedonPCislargeandnon-portablewhichrestricttheapplicationinthefieldsuchasmobilecommunications,portabledevicesandsoon.Developingalowpower,smallsize,portabilityofembeddedimageprocessingsystemhaspracticalsignificanceandwiderangeofapplicationprospects.Thisarticleanalysisthefunctionanddesignsthesystem,itintroducesthedesignandrealizationofhardwareplatform,includinghardwaredesignanddevelopmentprocess.Ithasapowercircuitandtheclockcircuit,thestoragecircuit,interfacecircuitofUSBcamerasandLCDcircuits.ItcustomizedLinuxkernelandcompletedthedevelopmentofcross-compiler,BootLoader,anddriver.Itimpliedtheimagepretreatmentsuchasgrayandequalizationandgotaclearerpicture.Intheend,thepapersummarizedtheresultsandtheinadequaciesofthesubjectandshowedtheprospectstheresearch.
Keywords:
mageprocessing;embeddedplatform;ARM;Linux
目 录
1绪论
1.1选题背景
随着科学技术的发展,更高速,更可靠,更低成本成为各种技术开发的要求。
图像采集与处理技术的应用越来越广泛,技术要求也越来越高。
图像处理技术在工业自动化、仪表检测安全、以及安全、消费电子、医学中被越来越广泛的应用。
在现代战争中,利用图像进行精确制导、火控、无人飞机的电视导航等,在国防中也受到了高度的重视。
图像处理算法中常有大量的运算,特别是在实时图像处理方面,因此通常采用DSP[1]或FPGA[3]来实现。
但随着微处理器技术的突飞猛进,现代MPU[1]也可以完成高速的数字图像处理。
设计能实现图像采集与图像处理一体化、结构紧凑、并能有效降低成本的专用图像处理系统,将具有很大的市场应用前景,这种系统具有安装方便、配置灵活、便于携带等突出优点。
作为嵌入式图像处理技术,其主要技术包括两个方面,一个是图像处理技术,另一个则是嵌入式系统[4]应用技术。
本文主要研究图像处理技术在嵌入式系统中的应用。
1.2本文研究目的
本文的目的旨在研究一种能够进行高速图像处理[5]的嵌入式系统架构的设计与实现方法。
针对嵌入式系统本身的特点,设计出具有较强通用性的嵌入式图像处理平台。
利用嵌入式系统进行图像处理是对传统的图像处理硬件实现方法的挑战.它的完成将为图像处理的开辟新的实现途径,并且为嵌入式系统的应用再次打开一片新的领域,同时,由于图像处理的应用十分广泛,其本身也有广泛的应用前景。
图像数据是一种重要的信息资源,随着以计算机和计算机技术为核心的信息科学的发展,图像处理在通讯、管理、医学、地震、气象、航空航天以及教育等领域,发挥着愈来愈重要的作用。
但传统的图像处理技术主要依赖于大批量的电子计算设备,它们带来巨大的保养、增加行业成本。
嵌入式平台拥有小巧、价格低廉、功耗小及维护成本低等优点。
因此基于嵌入式平台构建图像处理系统可以降低其生产维护成本,提高其可靠性和可控件,具有较高的市场价值。
2系统设计原理
2.1图像处理技术原理和成像原理
图像处理技术又称“机器视觉”[5],乃是将被测对象的图像作为信息的载体,从中提取有用的信息来达到测量的目的,具有非接触、高速、获得信息丰富等优点。
系统一般通过摄像头采集对象的图像信息,然后通过处理系统对采集到的图像进行数字化的处理和分析,根据检测要求可得到对象的特征信息,随后进一步对此进行判断并输出结果。
如图2.1所示,连杆的表面缺陷通过一个方形LED漫反射光源均匀照亮待检测的破口区域,光线照射到对象表面后,通过光学镜头成像在摄像头内的光电耦合CCD元件[3]上并转化成相应的数字图像信号,CCD元件可理解为一个由感光像素组成的点阵,每一个像素都一一对应了被测对象的二维图像特征。
数字图像信号经过图像处理系统对图像特征信息的提取和计算得到所需的测量值,随后通过RS232通讯接口把数据传输给PLC进行逻辑判断,判断的结果直接通过设备前面板上的指示灯输出。
CCD透镜LED光源对象
CCD摄像机
图1:
摄像头采集对象的图像信息
2.2图像显示原理
本论文设计采用的是一个240X320分辨率的16位液晶屏幕,可以通过操作S3C2410内部的相关寄存器来直接控制显示,由于采用了ARM—Linux作为操作系统,可以直接操作Linux下的Framebuffer设备来完成图像的显示,帧缓冲(Framebuffer)是Linux为显示设备提供的一个接口,把显存抽象后的一种设备,他允许上层应用程序在图形模式下直接对显示缓冲区进行读写操作。
这种操作是抽象的、统一的。
用户不必关心物理显存的位置、换页机制等等具体细节。
这些都是由Framebuffer设备驱动来完成的。
在应用程序中首先要打开Framebuffer设备,在Linux系统中Framebuffer设备一般映射为/dev/fb,可以有多个设备。
然后调用ioctl提供的借口获取设备信息,主要是获得当Framebuffer设备的分辨率、色深、每一行数据占的字节数。
关键的一步是将屏幕缓冲区映射到用户空间,Framebuffer设备可以看成是显存的映像,但是Linux所有的设备驱动均在内核态工作,所以无法在当前进程空间中直接访问,通过映射机制可以直接把显存的起始地址映射到当前进程的地址空间,从而可以快速方便的实现显存,建立映射的方法如下:
Pfd=mmap(0,FBDraw_finfo,smem_len,PROT_READ|PROT_WRFTE,MAP_SHARED,df,0);//以read、write和share方式映射屏幕上左边为(x,y)的点在显存中的位置是:
Pfd+x*(fb_vinfo.bits_pixel)>>3)+y*fb_finfo.line_length,对这个位置赋相应的颜色值就可以再屏幕上显示出来。
需要注意的是当色深(fb_vinfo.bits_per_pixel)不同时,颜色值的格式也不一样。
把经过图像处理后的图像数据或者采集到的原始图像数据转化成Framebuffer设备的颜色数据格式(RGB565、RGB888等)后,将数据复制到从地址pfb开始的内存中,就可以事先图像的显示。
3系统的软硬件平台
3.1基础硬件平台
数字图像处理系统是执行处理图像、分析理解图像信息任务的计算机系统.尽管图像处理技术应用广泛,图像处理系统种类很多,但他们的基本组成是相近的口它们主要含有:
图像输入设备、执行处理分析与控制的计算机图像处理机、输出设备、存储系统中的图像数据库、图像处理程序库与模型库。
其中,负责执行图像处理与分析的图像处理机是整个系统的核心部分,它关系着图像的处理效果,及系统的整体性能。
本系统选用的是韩国三星电子公司推出的一款基于ARM920T内核的S3C2410嵌入式微处理器。
S3C2410把外部复位信号作为一个中断处理,在系统复位时,程序指针(PC)被设置为0,程序跳转到0x00000000开始运行。
此空间对应BankO,系统的2MB的NORFIash和处理器的Bank0相连接。
在NORFlash中存储的是BootLoader,它负责配置处理器的结构、工作模式以及自动检测系统的各个硬件是否工作正常。
系统经过初始化和自检后,BootLoader负责把16MBNANDFlash的zlmage(即软件系统的镜像文件)复制到0xc0008000地址(此地址是系统64MBSDRAM的首地址)。
然后,引导程序把PC指向0xc0008000地址,系统开始运行。
3.2系统软件平台构建
结合S3C2410处理器的特点.基于该芯片构建嵌入式图像处理系统,设计者必须考虑其通用性、响应速度及对于硬件的可操控性。
正是基于这样的考虑,分三层构建嵌入式图像处理系统的软件体系:
ARMLinux的建立;图形用户界面(MiniGui)的移植;图像处理软件的设计编码。
其中ARMLinux的建立是构建嵌入式Linux系统的通用步骤。
3.3LCD显示模块
从S3C2410的LCD控制器出来的信号线包括24根数据线和若干根控制线。
这些信号线是经过74HC245隔离后接到LCD模块的,对于256色LCD只需要其中低8位数据线即可(如图所示)。
LCD模块除了需要控制信号和数据信号外,还需要一个22V左右的工作电压和上千伏的背光电压。
前者MAX629升压后得到,后者由一个逆变器模块提供。
图2:
LCD模块的电路连接图
3.4USB摄像头模块
VideoforLinux(简称V4L)是Linux中关于视频设备的内核驱动,它为编写视频应用程序提供一系列接口函数,内核、驱动程序和应用程序以它为标准进行交流,因此视频类驱动程序的开发必须遵循此标准,应用V4LAPI函数进行设计。
videodev.o模块即为视频部分的标准VideoforLinux。
这个标准定义了一套接口,内核、驱动、应用程序以这个接口为标准进行通信。
采集图像数据程序中需要各种图像数据参数,而Video4Linux中一个重要的数据结构video_device提供了视频设备的信息,该结构如下:
typedefstruct{
intfd;
intuse_mmap;
intwidth,height;
intframe_rate;
intframe_size;
structvideo_capabilitycapability;
structvideo_bufferbuffer;
structvideo_windowvwin;
structvideo_picturepicture;
structvideo_mmapvmmap;
structvideo_mbufvmbuf;
unsignedchar*frame_buffer;
intdev;
}video_device;
其中video_capability,video_picture,video_buffer等数据结构包含设备名称、支持的最大最小分辨率、信号源、亮度、色度、对比度、深度、帧的大小、最多支持的帧数等基本信息,而video_mmap和vdieo_mbuf用于内存映射。
设备驱动程序是Linux内核与应用程序之间的接口,通过USB客户驱动程序提供的USBD接口和应用程序接口,屏蔽了硬件实现的细节。
应用程序将外部设备看成是一类特殊文件的设备文件,可以使用像操作普通文件一样的系统调用接口函数来完成对外部设备的打开、关闭、读写和I/O控制操作驱动程序的注册、注销:
所有的USB设备类驱动程序都要在USBD中进行注册和注销,
Linux中的驱动程序通常采用模块方式编写,使用函数module_init注册设备,使用函数module_exit注销设备。
module_init(usb_gfkd_init);/*加载模块入口,调用函数usb_register()注册设备*/
module_exit(usb_gfkd_exit);/*注销模块入口,调用函数usb_deregister()注销设备*/
驱动程序与USBD的接口:
USBD为每个设备驱动程序维护一个相关的usb_driver的数据结构,负责设备的初始化和卸载。
当总线上有设备连接操作时,USBD通过该结构来查找相关的驱动程序,并调用初始化函数probe()对设备初始化;当设备断开时,USBD也通过该结构来查找相关的驱动程序,并调用设备卸载函数disconnect()对设备卸载。
USBD接口的数据结构定义为:
staticstructusb_drivergfkd_driver={"gfkd",gfkd_probe,gfkd_disconnect};
初始化函数staticvoid*gfkd_probe(…)首先读取设备的Usbdev结构,根据设备的配置描述符判断该设备是否被驱动程序所支持,判断使用接口是否正确,然后为驱动申请一块内存,再探测使用的摄像头,完成对摄像头的初始化,最后创建摄像头的设备文件结点。
卸载函数staticvoidgfkd_disconnect(structusb_device*dev,void*ptr)的作用是终止数据传输、删除摄像头的设备文件结点、释放接口、将驱动占用的内存释放。
驱动程序与应用程序接口:
摄像头驱动程序在staticstructfile_operationsgfkd_fops中给应用程序提供了统一的外设操作函数接口,当应用程序对摄像头进行open、release、read、内存映射mmap以及I/O控制等系统调用操作时,将通过该结构访问驱动程序提供的函数。
staticstructfile_operationsgfkd_fops={
.owner=THIS_MODULE,
.open=gfkd_open,
.release=gfkd_close,
.read=gfkd_read,
.mmap=gfkd_mmap,
.ioctl=gfkd_ioctl,
.llseek=no_llseek,};
打开摄像头函数staticintgfkd_open(structinode*inode,structfile*file)作用是打开摄像头的设备文件结点,并为数据传输做好必要的准备工作。
它先调用函数gfkd_alloc()分配用于视频解码的临时数据缓冲区、帧缓冲区和数据缓冲区;然后初始化摄像头,用函数gfkd_setMode()设置输出的视频格式和分辨率;再用函数gfkd_setFrameDecoder()设置帧缓冲区接收到的视频帧的格式和分辨率;最后调用函数gfkd_init_isoc()初始化数据传输设置、打开摄像头和分配提交URB。
关闭摄像头函数staticintgfkd_close(structinode*inode,structfile*file)作用是关闭摄像头的设备文件结点。
它先调用函数gfkd_stop_isoc()终止等时数据传输;再调用函数CameraShutDown()关闭摄像头。
最后使用函数gfkd_dealloc()释放分配的各种缓冲区。
内存映射函数staticintgfkd_mmap(structfile*file,structvm_area_struct*vma)实现内核空间与用户空间的内存映射。
先通过函数vmalloc()申请分配足够大的内核态内存作为图像帧缓冲区,并能存储两个URB采集的图像;然后用函数remap_page_range()将其映射到用户空间中。
这样提高了用户程序获取内核态图像帧缓冲区数据的速度。
读函数staticlonggfkd_read(structvideo_device*dev,char*buf,unsignedlongcount,intnoblock)通过调用函数copy_to_user()将图像数据从内核态的帧缓冲区拷贝到用户态的数据缓冲区。
I/O控制函数staticintgfkd_ioctl(structvideo_device*vdev,unsignedintcmd,void*arg)的功能是接收应用程序的各种命令,实现对摄像头的控制操作,如获得摄像头的参数、设置摄像头的分辨率、开始采集图像和设置帧同步。
由于Linux中任何USB传输都是通过URB实现的,每次URB传输都包括URB的建立、发出、回收、数据整理等阶段不产生有效数据,因此在具体实现中采用等时传输方式,通过建立两个URB,使用双URB轮流通信的方法来提高图像的采集速度。
先在驱动程序开发完成后需重新配置内核,让内核支持usb-ohci和videoforlinux,再把驱动程序配置成module,然后重新编译内核生成.o文件。
将编译好的驱动放入文件系统,建立设备文件,然后将文件系统烧入flash,再连接USB摄像头(如内置中芯微Zc301PDSP),把模块加载进内核并注册就可以找到该摄像头并显示:
gfkd_core.c:
USBgfkdcamerafound.TypeVimicroZc301P0x301b
gfkd_core.c:
gfkddriver00.57.06LEregistered
4图像的采集与处理
图像是人类最重要的常用信息之一。
数字图像处理技术就是将图像信号转换成数字格式并利用计算机进行处理的过程。
它起源于20世纪20年代,当时通过海底电缆从英国伦敦利用数字压缩技术传输了一幅照片到达了美国纽约。
随着科学技术的发展和数字化时代的到来,数字图像处理技术得到了极大的重视和长足的发展,并且在科学研究、工业生产、医疗诊断、交通、通信、天文等众多领域得到了广泛的应用。
图像处理技术发展至今,学者们提出了许多的方法与理论,通常需要将不同的图像处理方法结合在一起,才能使在不同外界环境下更好取得图像中感兴趣的目标。
本文采用的图像处理方法是将采集到的彩色图像转为灰度图,输出图像的灰度直方图,并进行均衡化处理,得到比较清晰的图像。
4.1图像采集的实现
对于USB摄像头,其驱动程序中需要提供基本的I/O操作接口函数open、read、write、close的实现。
对中断的处理实现,内存映射功能以及对I/O通道的控制接口的实现,都定义在structfile_operations中。
这样当应用程序对设备文件进行诸如open、close、read、write等系统调用操作时,Linux内核将通过file_operations结构访问驱动程序提供的函数。
4.1.1打开设备:
函数intCmera_open(char*dev,video_device*vd)负责打开设备,如果打开视频设备成功,则获取相应的文件描述符,以便后续函数对设备进行操作;若打开失败,返回错误信息。
4.1.2读取设备信息
structvideo_capabilitycap;
if(-1==ioctl(cam,VIDIOCGCAP,&cap)){
perror(“ioctlVIDIOCGCAP”)
exit(-1)}
Printf(“Devicename->%S\n”,cap.name);
Printf(“Devicetype->%d\n”,cap.type);
Printf(“Channels->%d\n”,cap.channels);
Printf(“Maxwidth->%d\n”,cap.maxwidth);
Printf(“Maxheight->%d\n”,cap.maxheight);
Printf(“Minwidth->%d\n”,cap.minwidth);
Printf(“Minheight->%d\n”,cap.minheight);
其中ioctl是设备驱动程序中对设备的I/O通道进行管理的函数。
调用如下:
int
ioctl(intfd,indcmd,…);fd就是用户程序打开设备时使用open函数返回的文件标示符,cmd是设备的控制命令,省略号是一些补充参数。
上面利用VIDIOCGCAP来取得视频设备文件的性能参数,包括名称、类型、通道数、图像宽度、图像高度等。
并存放到video_capability的结构里。
获取图像属性信息
structvideodaicturepic;
if(-1==ioctl(cam,VIDIOCSPICT,&pic)){
perrorfioctlVID10CSPICT);
exit(一1);
}
ioctl(cam,VIDIOCGPICT,&pic);
printf(Brightness->%d\n,pic.Brightness/256);
printf(Colour->%d\n,piccolour/256);
printf(Contrast->%d\n,pic.Contrast/256);
printfWhiteness->%d\n,pic.Whiteness/256);
printf(Depth->%d\n,pic.depth);
printf(Palette->%d\n,pic.palette);
通过传递VIDIOCGPICT给ioctl()来返回采集图像帧的属性,包括图像亮度、色彩、对比度等,比较重要的是图像帧的调色板参数palette,并存放到数据结构videoqoieture里。
4.1.3进行视频采集
structvideo_mmap