1、 数字信号处理 课程小 论文 题 目: 基于 ARM 嵌入式图像处理系统的研究 学生姓名: 学号: 院(系): 专业: 入学时间: 年 月 导师姓 名: 职称 /学位: 导师所在单位: 完成时间: 年 月 基于 ARM嵌入式图像处理系统的研究 摘 要 传统的基于 PC 机 的图像处理系统,体积庞大,不具有便携性,而限制了其在移动通信、便携设备等领域的应用。开发低功耗、小型化、便携性的嵌入式图像处理系统具有现实的意义和广泛的应用前景。本文对系统进行功能分析和总体设计,介绍了 ARM 的嵌入式硬件平台的设计与实现,包括系统基本模块的硬件设计和开发过程,具体有电源电路和时钟电路、存储电路、 USB
2、摄像头接口电路和 LCD 电路等,完成了 Linux 操作系统内核的定制和交叉编译、 BootLoader、驱动程序的开发,对图像进行灰度化和均衡化等预处理,得到比较清晰的图像。最后总结了本课 题研究所取得的成果及其不足之处 ,对研究进行了总结和展望。 关键词: 图像处理 ;嵌入式平台; ARM; Linux Study on Image Processing System Based on ARM Embedded System Abstract Traditional image processing system based on PC is large and non-portable
3、 which restrict the application in the field such as mobile communications, portable devices and so on. Developing a low power, small size, portability of embedded image processing system has practical significance and wide range of application prospects. This article analysis the function and desig
4、ns the system, it introduces the design and realization of hardware platform, including hardware design and development process. It has a power circuit and the clock circuit, the storage circuit, interface circuit of USB cameras and LCD circuits. It customized Linux kernel and completed the developm
5、ent of cross-compiler, BootLoader, and driver. It implied the image pretreatment such as gray and equalization and got a clearer picture. In the end, the paper summarized the results and the inadequacies of the subject and showed the prospects the research. Keywords: mage processing; embedded platfo
6、rm; ARM; Linux 目 录 1 绪论 . 1 1.1 选题背景 . 1 1.2 本文研究目的 . 1 2 系统设计原理 . 1 2.1 图像处理技术原理和 成像原理 . 1 2.2 图像显示原理 . 2 3 系统的软硬件平台 . 2 3.1 基础硬件平台 . 2 3.2 系统软件平台构建 . 3 3.3 LCD 显示模块 . 3 3.4 USB 摄像头模块 . 3 4 图像的采集与处理 . 6 4.1 图像采集的实现 . 6 4.1.1 打开设备: . 7 4.1.2 读取设备信息 . 7 4.1.3 进行视频采集 . 8 4.1.4 图像的显示 . 8 4.1.5 关闭视频设备。
7、. 9 4.2 图像处理 . 9 4.2.1 灰度图 . 9 4.2.2 灰度直方图 . 10 4.2.3 直方图均衡化 . 11 4.3 图像处理结果 . 12 5 总结 . 14 主要参考文献 . 16 致 谢 . 17 1 1 绪论 1.1 选题背景 随着科学技术的发展,更高速,更可靠,更低成本成为各种技术开发的要求。图像采集与处理技术的应用越来越广泛,技术要求也越来越高 。图像处理技术在工业自动化、仪表检测安全、以及安全、消费电子、医学中被越来越广泛的应用。在现代战争中,利用图像进行精确制导、火控、无人飞机的电视导航等,在国防中也受到了高度的重视。图像处理算法中常有大量的运算,特别是在
8、实时图像处理方面,因此通常采用 DSP1或 FPGA3来实现。但随着微处理器技术的突飞猛进,现代 MPU1也可以完成高速的数字图像处理。设计能实现图像采集与图像处理一体化、结构紧凑、并能有效降低成本的专用图像处理系统,将具有很大的市场应用前景,这种系统具有安装方便、配置灵活、便于携带等突 出优点。 作为嵌入式图像处理技术,其主要技术包括两个方面,一个是图像处理技术,另一个则是嵌入式系统 4应用技术。本文主要研究图像处理技术在嵌入式系统中的应用。 1.2 本文研究目的 本文的目的旨在研究一种能够进行高速图像处理 5的嵌入式系统架构的设计与实现方法。针对嵌入式系统本身的特点,设计出具有较强通用性的
9、嵌入式图像处理平台。利用嵌入式系统进行图像处理是对传统的图像处理硬件实现方法的挑战 .它的完成将为图像处理的开辟新的实现途径,并且为嵌入式系统的应用再次打开一片新的领域,同时,由于图像处理的应用十分 广泛,其本身也有广泛的应用前景。 图像数据是一种重要的信息资源,随着以计算机和计算机技术为核心的信息科学的发展,图像处理在通讯、管理、医学、地震、气象、航空航天以及教育等领域,发挥着愈来愈重要的作用。但传统的图像处理技术主要依赖于大批量的电子计算设备,它们带来巨大的保养、增加行业成本。嵌入式平台拥有小巧、价格低廉、功耗小及维护成本低等优点。因此基于嵌入式平台构建图像处理系统可以降低其生产维护成本,
10、提高其可靠性和可控件,具有较高的市场价值。 2 系统设计原理 2.1 图像处理技术原理和成像原理 图像处理技 术又称“机器视觉” 5,乃是将被测对象的图像作为信息的载体,从中提取有用的信息来达到测量的目的,具有非接触、高速、获得信息丰富等优点。系统一般通过摄像头采集对象的图像信息,然后通过处理系统对采集到的图像进行数字化的处理和分析,根据检测要求可得到对象的特征信息,随后进一步对此进行判断并输出结果。如图2.1 所示,连杆的表面缺陷通过一个方形 LED 漫反射光源均匀照亮待检测的破口区域,光线照射到对象表面后,通过光学镜头成像在摄像头内的光电耦合 CCD 元件 3上并转化成相应的数字图像信号,
11、 CCD 元件可理解为一个 由感光像素组成的点阵,每一个像素都一一对应了被测对象的二维图像特征。数字图像信号经过图像处理系统对图像特征信息的提取2 和计算得到所需的测量值,随后通过 RS232 通讯接口把数据传输给 PLC 进行逻辑判断,判断的结果直接通过设备前面板上的指示灯输出。 CCD 透镜 LED 光源 对象 CCD 摄像机 图 1: 摄像头采集对象的图像信息 2.2 图像显示原理 本 论文 设计采用的是一个 240X320 分辨率的 16位液晶屏幕,可以通过操 作 S3C2410内部的相关寄存器来直接控制显示,由于采用了 ARM Linux 作为操作系统,可以直接操作 Linux 下的
12、 Framebuffer 设备来完成图像的显示,帧缓冲 (Framebuffer)是 Linux 为显示设备提供的一个接口,把显存抽象后的一种设备,他允许上层应用程序在图形模式下直接对显示缓冲区进行读写操作。这种操作是抽象的、统一的。用户不必关心物理显存的位置、换页机制等等具体细节。这些都是由 Framebuffer 设备驱动来完成的。在应用程序中首先要打开 Framebuffer 设备,在 Linux 系统中 Framebuffer 设备一般映射为 /dev/fb,可以有多个设备。然后调用 ioctl 提供的借口获取设备信息,主要是获得当 Framebuffer设备的分辨率、色深、每一行数据
13、占的字节数。关键的一步是将屏幕缓冲区映射到用户空间, 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_pi
14、xel) 3) +y*fb_finfo.line_length,对这个位置赋相应的颜色值就可以再屏幕上显示出来。需要注意的是当色深( fb_vinfo.bits_per_pixel)不同时,颜色值的格式也不一样。 把经过图像处理后的图像数据或者采集到的原始图像数据转化成 Framebuffer 设备的颜色数据格式( RGB565、 RGB888 等)后,将数据复制到从地址 pfb 开始的内存中,就可以事先图像的显示。 3 系统的软硬件平台 3.1 基础 硬件平台 数字图像处理系统是执行处理图像、分析理解图像信息任务的计算机系统 .尽管图像处理技术应用广泛,图像处理系统种类很多,但他们的基本组成
15、是相近的口它们主要含有 :图像输入设备、执行处理分析与控制的计算机图像处理机、输出设备、存储系统中的图像3 数据库、图像处理程序库与模型库。 其中 ,负责执行图像处理与分析的图像处理机是整个系统的核心部分,它关系着图像的处 理效果,及系统的整体性能。本系统选用的是韩国三星电子公司推出的一款基于ARM920T 内核的 S3C2410 嵌入式微处理器。 S3C2410 把外部复位信号作为一个中断处理,在系统复位时,程序指针 (PC)被设置为 0,程序跳转到 0x00000000 开始运行。此空间对应BankO,系统的 2MB 的 NORFIash 和处理器的 Bank0 相连接。在 NORFlas
16、h 中存储的是BootLoader,它负责配置处理器的结构、工作模式以及自动检测系统的各个硬件是否工作正常。系统经过初始化和自检后, BootLoader 负责把 16MBNANDFlash 的 zlmage(即软件系统的镜像文件 )复制到 0xc0008000 地址 (此地址是系统 64MB SDRAM 的首地址 )。然后,引导程序把 PC 指向 0xc0008000 地址,系统开始运行。 3.2 系统软件平台构建 结合 S3C2410 处理器的特点基于该芯片构建嵌入式图像处理系统,设计者必须考虑其通用性、响应速度及对于硬件的可操控性。正是基于这样的考虑,分三层构建嵌入式图像处理系统的软件体
17、系: ARM Linux 的建立;图形用户界面 (MiniGui)的移植;图像处理软件的设计编码。其中 ARM Linux 的建立是构建嵌入式 Linux 系统的通用步骤 。 3.3 LCD 显示模块 从 S3C2410 的 LCD 控制器出来的信号线包括 24根数据线和若干根控制线。这些信号线是经过 74HC245 隔离后接到 LCD 模块的,对于 256 色 LCD 只需要其中低 8 位数据线即可(如图所示 )。 LCD 模块除了需要控制信号和数据信号外,还需要一个 22V 左右的工作电压和上千伏的背光电压。前者 MAX629 升压后得到,后者由一个逆变器模块提供。 图 2: LCD 模块
18、的电路连接图 3.4 USB 摄像头模块 4 Video for Linux(简称 V4L)是 Linux 中关于视频设备的内核驱动,它为编写视频应用程序提供一系列接口函数,内核、驱动程序和应用程序以它为标准进行交流,因此视频类驱动程序的开发必须遵循此标准,应用 V4L API 函数进行设计。 videodev.o 模块即为视频部分的标准 Video for Linux。这个标准定义了一套接口,内核、驱动、应用程序以这个接口为标准进行通信。采集图像数据程序中需要各种图像数据参数,而 Video4Linux中一个重要的数据结构 video_device 提供了视频设备的信息,该结 构如下: ty
19、pedef struct int fd; int use_mmap; int width, height; int frame_rate; int frame_size; struct video_capability capability; struct video_buffer buffer; struct video_window vwin; struct video_picture picture; struct video_mmap vmmap; struct video_mbuf vmbuf; unsigned char *frame_buffer; int dev; video_
20、device; 其中 video_capability, video_picture, video_buffer 等数据结构包含设备名称、支持的最大最小分辨率、信号源、亮度、色度、对比度、深度、帧的大小、最多支持的帧数等基本信息,而 video_mmap 和 vdieo_mbuf 用于内存映射。 设备驱动程序是 Linux 内核与应用程序之间的接口,通过 USB 客户驱动程序提供的 USBD 接口和应用程 序接口,屏蔽了硬件实现的细节。应用程序将外部设备看成是一类特殊文件的设备文件,可以使用像操作普通文件一样的系统调用接口函数来完成对外部设备的打开、关闭、读写和 I/O 控制操作驱动程序的注册
21、、注销:所有的 USB 设备类驱动程序都要在 USBD 中进行注册和注销, Linux 中的驱动程序通常采用模块方式编写,使用函数 module_init 注册设备,使用函数 module_ exit 注销设备。 module_init(usb_gfkd_init); /*加载模块入口 ,调用函数 usb_register()注册设备*/ module_exit(usb_gfkd_exit); /*注销模块入口 ,调用函数 usb_deregister()注销设备 */ 5 驱动程序与 USBD 的接口: USBD 为每个设备驱动程序维护一个相关的 usb_driver 的数据结构,负责设备的
22、初始化和卸载。当总线上有设备连接操作时, USBD 通过该结构来查找相关的驱动程序,并调用初始化函数 probe()对设备初始化;当设备断开时, USBD 也通过该结构来查找相关的驱动程序,并调用设备卸载函数 disconnect ()对设备卸载。 USBD 接口的数据结构定义为: static struct usb_driver gfkd_driver = “gfkd“,gfkd_probe,gfkd_disconnect; 初始化函数 static void * gfkd_probe( )首先读取设备的 Usb dev 结构,根据设备的配置描述符判断该设备是否被驱动程序所支持 , 判断使用
23、接口是否正确,然后为驱动申请一块内存,再探测使用的摄像头,完成对摄像头的初始化,最后创建摄像头的设备文件结点。 卸载函数 static void gfkd_disconnect (struct usb_device *dev, void *ptr)的作用是终止数据传输、删除摄像头的设备文件结点、释放接口、将驱动占用的内存释放。 驱动程序与应用程序接口:摄像头驱动程序在 static struct file_operations gfkd_fops 中给应用程序提供了统一的外设操作函数接口,当应用程序对摄像头进行 open、 release、 read、内存映射 mmap 以及 I/O 控制等系
24、统调用操作时,将通过该结构访问驱动程序提供的函数。 static struct file_operations gfkd_fops = .owner = THIS_MODULE, .open = gfkd_open, .release = gfkd_close, .read = gfkd_read, .mmap = gfkd_mmap, .ioctl = gfkd_ioctl, .llseek = no_llseek, ; 打开摄像头函数 static int gfkd_open(struct inode *inode, struct file *file)作用是打开摄像头的设备文件 结点,并
25、为数据传输做好必要的准备工作。它先调用函数 gfkd _alloc()分配用于视频解码的临时数据缓冲区、帧缓冲区和数据缓冲区;然后初始化摄像头,用函数 gfkd _setMode()设置输出的视频格式和分辨率;再用函数 gfkd _setFrameDecoder()设置帧缓冲区接收到的视频帧的格式和分辨率;最后调用函数 gfkd _init_isoc()初始化数据传输设置、打开摄像头和分配提交 URB。 关闭摄像头函数 static int gfkd_close(struct inode *inode, struct file *file)作用是关闭摄像头的设备文件结点。它先调用函数 gfkd
26、 _stop_isoc()终止等时数据传输;再调用函数 CameraShutDown()关闭摄像头 。 最后使用函数 gfkd _dealloc()释放分配的各种缓冲区。内存映射函数 static int gfkd_mmap(struct file *file, struct vm_area_struct *vma)实现内核空间与用户空间6 的内存映射。先通过函数 vmalloc()申请分配足够大的内核态内存作为图像帧缓冲 区,并能存储两个 URB 采集的图像;然后用函数 remap_page_range()将其映射到用户空间中。这样提高了用户程序获取内核态图像帧缓冲区数据的速度。 读函数 s
27、tatic long gfkd_read(struct video_device *dev, char *buf, unsigned long count,int noblock)通过调用函数 copy_to_user()将图像数据从内核态的帧缓冲区拷贝到用户态的数据缓冲区。 I/O 控制函数 static int gfkd_ioctl(struct video_device *vdev, unsigned int cmd, void*arg)的功能是接收应用程序的各种命令,实现对摄像头的控制操作,如获得摄像头的参数、设置摄像头的分辨率、开始采集图像和设置帧同步。 由于 Linux 中任何 U
28、SB 传输都是通过 URB 实现的,每次 URB 传输都包括 URB 的建立、发出、回收、数据整理等阶段不产生有效数据,因此在具体实现中采用等时传输方式,通过建立两个 URB,使用双 URB 轮流通信的方法来提高图像的采集速度。 先 在驱动程序开发完成后需重新配置内核,让内核支持 usb-ohci 和 video for linux,再把驱动程序配置成 module,然后重新编译内核生成 .o 文件。将编译好的驱动放入文件系统,建立设备文件,然后将文件系统烧入 flash,再连接 USB 摄像头(如内置中芯微 Zc301P DSP),把模块加载进内核并注册就可以找到该摄像头并显示: gfkd
29、_core.c: USB gfkd camera found. Type Vimicro Zc301P 0x301b gfkd _core.c: gfkd driver 00.57.06LE registered 4 图像的采集与处理 图像是人类最重要的常用信息之一。数字图像处理技术就是将图像信号转换成数字格式并利用计算机进行处理的过程。它起源于 20 世纪 20 年代,当时通过海底电缆从英国伦敦利用数字压缩技术传输了一幅照片到达了美国纽约。随着科学技术的发展和数字化时代的到来,数字图像处理技术得到了极大的重视和长足的发展,并且在科学研究、工业生产、医疗诊断、交通、通信、天文等众多领域得到了广
30、泛的应用。图像处理 技术发展至今,学者们提出了许多的方法与理论,通常需要将不同的图像处理方法结合在一起,才能使在不同外界环境下更好取得图像中感兴趣的目标。 本文采用的图像处理方法是将采集到的彩色图像转为灰度图,输出图像的灰度直方图,并进行均衡化处理,得到比较清晰的图像。 4.1 图像采集的实现 对于 USB 摄像头,其驱动程序中需要提供基本的 I/O 操作接口函数 open、 read、write、 close 的实现。对中断的处理实现,内存映射功能以及对 I/O 通道的控制接口的实现,都定义在 struct file_operations 中。这样当应用程序对设备文件进行诸如 open、close、 read、 write 等系统调用操作时 , Linux 内核将通过 file_operations 结构访问驱动程序提供的函数。