“在研究远程数字图像处理与传输的过程中,需要在远端现场进行图像处理,本文提出一个集图像采集、处理与显示于一体的嵌入式数字图像处理系统,通过图像获取设备获取目标图像并进行相关的算法处理,通过模块化编程,将原始图像和图像处理结果独立显示出来,修改图像处理模块可以对不同的数字图像处理算法进行验证和分析。
”在研究远程数字图像处理与传输的过程中,需要在远端现场进行图像处理,本文提出一个集图像采集、处理与显示于一体的嵌入式数字图像处理系统,通过图像获取设备获取目标图像并进行相关的算法处理,通过模块化编程,将原始图像和图像处理结果独立显示出来,修改图像处理模块可以对不同的数字图像处理算法进行验证和分析。利用本文所建立的系统可以大大提高远端数字图像处理的效率,并可利用该系统的网络功能实现远程传输,本文仅就系统的图像获取与处理功能作简要分析。
1 系统组成
硬件组成以S3C2410为HX,S3C2410内部集成了一个USB主控制器,所以无须外接USB控制芯片就可以做为USB主机.USB Host控制器与视频采集摄像头相连,通过在USB接口上外接的带USB口的摄像头,实现图像采集。处理后的图像可以显示在一个320X240分辨率的液晶屏幕上,Flash用作存储器保存系统软件和图像采集、处理的结果。图1给出了系统的硬件组成框图,图2给出了系统的软件层次结构图。
软件组成可以分为引导程序、操作系统和图像采集与处理三部分。
引导程序的作用是初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为Z终调用操作系统内核或用户应用稃序准备好正确的环境。在本应用中采用的是ViVi作为引导程序来引导操作系统。
本系统选择的是ARM-Linux作为操作系统,针对本系统的具体应用,需要配置操作系统内核支持Video For Linux和USB OV511 Camera,同时去掉一些不需要的模块以减小操作系统内核的体积。操作系统内核是通过引导程序ViVi来XZ到Flash存储器上的,而引导程序ViVi则是通过JtagXZ到Flash存储器中的。
图像的采集、处理、显示的程序是运行在ARM-Linux操作系统之上的,其中图像采集与图像显示模块与操作系统平台紧密相关,而图像处理算法部分与平台无关。
2 图像采集
在本设计中通过USB摄像头来采集图像,在Linux内核中视频部分的接口是Video For Linux(V4L),V4L标准定义了一套接口,内核、驱动、应用程序遵循这个接口标准就可以使视频设备正常工作。目前V4L涵盖了视、音频流捕捉与处理方面的内容,USB摄像头也属于V4L支持的范畴。
在ARM-Linux中,摄像头设备映射为/dev/v41/vide00,所以只需对这个设备按照V4L标准规定的流程进行操作就可以了。以下是关键步骤的程序代码。
DY步:打开采集设备
Fd_video=open(”/dev/v41/video0”,0_RDWR);
第二步:查询设备属性
rc=ioctl(Fd_video,VIDIOCGCAP,&vC);通过设备驱动程序提供的ioctl接口来查询设备的相关属性,具体属性用struct tvideo_capture类型的结构体变量vc来存储。video_capture是Linux下对视频设备描述的结构体变量类型之一。
第三步:查询、设置将要采集的图像的格式,包括大小、颜色位数、图像数据表示格式等信息。在Linux中,这些信息保存在一个struct video_picture类型的变量中。在本设计中用全局变量vp来保存查淘的信息。
ret=iocfl(Fd_video,VIDIOCGPICT,&vp);//图像相关信息保存在vP变量中
可以通过以VIDIOCSPICT为参数的ioctl调用来设置图像的类型,如在本系统中支持如下几种类型的图像:24位RGB888格式的彩色图像、16位RGB565格式的彩色图像、256级灰度的灰度图像。设置方法是先对vp的成员变量vp.palette进行赋值,如VIDEO_PALETTE_RGB24、VIDEO_PALETFE_RGB565或者VIDEO_PALETYE_GREY等之一,然后调用ioetl(video,VIDIOCSPICT,&vp)来设置。同样也可以设置分辨率等其它参数,方法与设置数据格式大同小异,不再赘述。
第四步:建立内存映射,把视频设备的数据缓冲区地址映射到用户进程地址空间,这样做比直接调用read()函数读取数据的速度要快的多。在本设计中定义了一个unsigned char * 型的指针变量memoryMap来保存数据缓冲区的映射地址。
memoryMap = (unsigned char *) mmap (0,memoryBuffer.size,PROT_READ | PROT_WRITE,MAP_SHARED,Fd_video, 0 );//建立数据缓冲区的映射
第五步:读取数据。到这一步就可以采集图像数据了,可以在采集到一幅图像的数据后触发下一个幅图像开始采集的信号,然后在这段时间里进行图像处理的运算,这样可以Z大限度的利用图像采集设备,从而提高系统的效率。摄像头的驱动提供了这种双缓冲机制,通过向摄像头发送VIDIOCMCAPTURE控制命令,就会触发采集图像数据到指定的缓冲区中,这一步是不会阻塞当前进程的,程序会执行下一条指令而不是等到数据采集完毕。通过向摄像头发送VIDIOCSYNC控制命令,当前进程就会阻塞直到指定的缓冲区数据填满。处理的流程如下所示:
VIDIOCMCA玎uRE buffer 0//触发buffer0开始采集
While(1)
{
VIDIOCMCAPTURE buffer 1 //触发buffer1开始采集
VIDIOCSYNC buffer 0 //同步buffer0中的数据
...
//process buffer 0 //处理得到的buffer0中数据
...
VIDIOCMCAPTURE buffer 0//触发buffer0开始采集
VIDIOCSYNC buffer 1 //同步buffer1中的数据
...
//process buffer 1 //处理得到的bufferl中数据
...
}
3 图像处理
图像处理是一门复杂的技术,它涉及到图像预处理、图像分析、图像理解等多个方面。它和其它多个学科有着密切的联系,尤其是近年来模式识别理论和技术、人工智能理论、分形理论以及小波分析技术等相关理论和技术的发展,为图像处理技术的研究提供了坚实的理论基础和新的分析手段。针对于不同应用背景采用的处理流程和算法各不相同,但是都必须首先获得图像的数据,然后在根据需要选择处理流程和相关算法。在这里本文并不详细介绍图像处理的流程和算法,只给出在本系统平台上实现的图像处理算法的效果图。图3是通过摄像头采集到的彩色图像,图4是经过灰度转化、二值化、边缘检测、细化和连通域榆测后的效果图。
4 图像显示
本设计采用的是一个240X320分辨率的16位液晶屏幕,可以通过操作S3C2410内部的相关寄存器来直接控制显示,由于采用了ARM-Linux作为操作系统,可以直接操作Linux下的Framebuffer设备来完成图像的显示,帧缓冲(Framebuffer)是Linux为显示设备提供的一个接口,把显存抽象后的一种设备,他允许上层应用程序在图形模式下直接对显示缓冲区进行读写操作。这种操作是抽象的、统一的。用户不必关心物理显存的位置、换页机制等等具体细节。这些都是由Framebuffer设备驱动来完成的。
在应用程序中首先要打开Framebuffer设备,在Linux系统中Framebuffer设备一般映射为/dev/fb,可以有多个设备。然后调用ioctl提供的接口获取设备信息,主要是获得当前Framebuffer设备的分辨率、色深、每一行数据占的字节数。关键的一步是将屏幕缓冲区映射到用户空间,Framebuffer设备可以看成是显存的映像,但是Linux所有的设备驱动均在内核态工作,所以无法在当前进程空间中直接访问,通过映射机制可以直接把显存的起始地址映射到当前进程的地址空间,从而可以快速方便的实现显示,建立映射的方法如下:
pfb=mmap (0,FBDraw_finfo.smem_len,PROT_READ | PROT_WRITE,MAP_SHARED,fd,0); //以read、write和share方式映射
屏幕上坐标为(x,y)的点在显存中的位置是:
pro x * (fb_vinfo.bits_per_pixel>>3) Y * fb_finfo.line_length, 对这个位置赋响应的颜色值就可以在屏幕上显示出来。需要注意的是当色深(fb_vinfo.bits_per_pixel)不同时,颜色值的格式也不一样。
把经过图像处理后的图像数据或者采集到的原始图像数据转化成Framebuffer设备的颜色数据格式(RGB565、RGB888等)后,将数据复制到从地址pfb开始的内存中,就可以实现图像的显示。
5 结束语
本文设计了以ARM核处理器S3C2410为计算与控制HX,以ARM-Linux为操作系统的图像采集、处理、显示的一个平台,用于图像处理中算法验证,调试与实际使用表明,该系统具有良好的使用效果和较高的丁作效率,现已用于战场侦察系统的演示。同时本系统具有功耗小、体积小、网络功能强等特点,可以方便的扩展到侦察、安防、视频采集等领域。
本文创新点:利用ARM平台,结合嵌入式操作系统进行图像采集和处理,在较小的系统内实现了主要的图像系统功能,取得较好的效果,并具有良好的应用前景。
分享到:
猜你喜欢