微波EDA网,见证研发工程师的成长!
首页 > 应用设计 > 工业电子 > 基于ARM的嵌入式数字图像处理系统

基于ARM的嵌入式数字图像处理系统

时间:04-28 来源:互联网 点击:
引言

在研究远程数字图像处理与传输的过程中,需要在远端现场进行图像处理,本文提出一个集图像采集、处理与显示于一体的嵌入式数字图像处理系统,通过图像获取设备获取目标图像并进行相关的算法处理,通过模块化编程,将原始图像和图像处理结果独立显示出来,修改图像处理模块可以对不同的数字图像处理算法进行验证和分析。利用本文所建立的系统可以大大提高远端数字图像处理的效率,并可利用该系统的网络功能实现远程传输,本文仅就系统的图像获取与处理功能作简要分析。

1 系统组成

硬件组成以S3C2410为核心,S3C2410内部集成了一个USB主控制器,所以无须外接USB控制芯片就可以做为USB主机.USB Host控制器与视频采集摄像头相连,通过在USB接口上外接的带USB口的摄像头,实现图像采集。处理后的图像可以显示在一个320X240分辨率的液晶屏幕上,Flash用作存储器保存系统软件和图像采集、处理的结果。图1给出了系统的硬件组成框图,图2给出了系统的软件层次结构图。


图1 硬件组成构图


图2 软件层次结构阁

软件组成可以分为引导程序、操作系统和图像采集与处理三部分。

引导程序的作用是初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核或用户应用稃序准备好正确的环境。在本应用中采用的是ViVi作为引导程序来引导操作系统。

本系统选择的是ARM-Linux作为操作系统,针对本系统的具体应用,需要配置操作系统内核支持Video For Linux和USB OV511 Camera,同时去掉一些不需要的模块以减小操作系统内核的体积。操作系统内核是通过引导程序ViVi来下载到Flash存储器上的,而引导程序ViVi则是通过Jtag下载到Flash存储器中的。

图像的采集、处理、显示的程序是运行在ARM-Linux操作系统之上的,其中图像采集与图像显示模块与操作系统平台紧密相关,而图像处理算法部分与平台无关。

2 图像采集

在本设计中通过USB摄像头来采集图像,在Linux内核中视频部分的接口是Video For Linux(V4L),V4L标准定义了一套接口,内核、驱动、应用程序遵循这个接口标准就可以使视频设备正常工作。目前V4L涵盖了视、音频流捕捉与处理方面的内容,USB摄像头也属于V4L支持的范畴。

在ARM-Linux中,摄像头设备映射为/dev/v41/vide00,所以只需对这个设备按照V4L标准规定的流程进行操作就可以了。以下是关键步骤的程序代码。

第一步:打开采集设备

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 );//建立数据缓冲区的映射

第五步:读取数据。到这一步就可以采集图像数据了,可以在采集到一幅图像的数据后触发下一个幅图像开始采集的信号,然后在这段时间里进行图像处理的运算,这样可以最大限度的利用图像采集设备,从而提高系统的效率。摄像头的驱动提供了这种双缓冲机制,通过向摄像头发送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中数据
...
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top