控制/MCU
视觉系统在现代工业生产自动化系统中应用非常广泛,主要集中于药品检测分装、印刷色彩检测、集成电路生产、精密电子产品装配、智能机器人识别导航等领域。随着Internet 的普及,现代社会已进入后PC 时代,嵌入式技术越来越与人们的生活紧密结合。
嵌入式视觉系统可通过USB 总线等将图像的获取、图像处理、显示设备集成于一体,成本相对较低,体积小巧,可以方便地安装在载体身上,故研究嵌入式的视觉系统具有一定的实际意义。
嵌入式视觉系统由嵌入式硬件平台、操作系统、图像采集和图像显示四大部分组成,原理框图如下图1 所示。
图1 视觉系统原理框图
S3C2410X 芯片是韩国三星电子公司推出的一款基于ARM920T 内核的16/32 位RISC 嵌入式微处理器。该芯片集成了支持 TFT 的 LCD 控制器 、3 个通道的UART 等控制器和丰富的外部接口,MPLL 产生主时钟,能够使处理器工作频率最高达到203MHz,此工作频率能够使处理器轻松运行WinCE、Linux等操作系统以及进行较为复杂的数据处理。该芯片可以满足低成本、高速度、低功耗的设计需求,非常适合作为嵌入式视觉系统的硬件平台。
Linux 操作系统同目前广泛应用的嵌入式操作系统如pSOS、VxWorks、winCE 相比,具有可移植性好、网络功能强、有优秀的GNU 编译工具支持等优点,更重要的是Linux 的开放源代码和免费的优点使得系统成本显著降低,因此选用Linux 操作系统作为软件开发平台。
3.1 图像采集
选购摄像头,优先考虑Linux 内核公开支持的摄像头芯片。由于目前Linux 操作系统使用的内核版本仅自带了ov511 芯片的摄像头驱动,因此,系统的图像采集模块由CMOS 图像传感器OV7620 和后端处理芯片OV511+组成。本系统在IIC 总线模式下通过设置OV7620 的功能寄存器,使OV7620 工作于连续扫描方式,RGB 原始数据16 位输出方式。OV7620 有4 个同步信号:VSYNC(垂直同步信号)、FODD(奇数场同步信号)、HSYNC(水平同步信号)和PCLK(像素同步信号)[3].当采用连续扫描方式时,只使用VSYNC 和HSYNC、PCLK 三个同步信号。通过设定内部寄存器,控制输出帧率在0.5 帧/s~30 帧/s 之间变化,窗口输出设置为:640×480,经过设定后的OV7620 输出时序如图2 所示:
图2 OV7620 输出时序图
3.2 图像传输
图像采集帧率与数据传输接口的数据传输速率之间的匹配是图像采集的一个重要问题。如果图像传感器的采集频率大于接口的最大可传输数据率,会引起缓冲区内的图像数据堵塞,造成数据混乱,出现无规律的乱码。因此,为了保证图像数据传输时的完整性和可靠性,接口数据的传输速率应满足图像传感器的采集速率。下面是对本采集系统的传输匹配计算。
已知:OV7620 的最大主时钟频率27MHz,最大数据率13.5MB/S.以OV7620 默认输出为例:输出格式VGA,分辨率640×480,帧率15 帧/秒,输出数据格式为16 位彩色数据。
一帧图像的数据量: (640 × 480 × 16)/8=614400B=0.586MB.
一秒钟的最大数据量:0.586×15=8.79MB/S.
因为图像采集中图像数据不是连接不断的采集,帧与帧之间有场消隐时间,行与行之间也有行消隐时间,所以13.5MB/S> 8.79MB/S.基于这个采集速率,要实现VGA 图像15 帧/秒的图像采集,嵌入式主机与USB 接口速度应与图像传感器的采集速度相匹配,至少不能小于9MB/S 的速度,否则会出现数据在传输通道中堵塞,致使数据出现混乱。系统采用USB1.0 作为传输接口,系统采集的图像数据为9MB/S,USB 传输速率大于9MB/S,故采集频率与传输频率匹配。
3.3 图像显示
液晶显示器LCD 以省电和显示大量信息等优点而成为现代仪器仪表用户界面的主要发展方向。本视觉系统采用三菱公司的8.4'彩色TFT-LCD 作为图像显示模块, 液晶屏大小为640 × 480 , 型号:AA084VC03.
系统需要两种电源供电,分别是5V 和12V.5V电源用于核心板供电,USB 图像采集模块由核心板供电,12V 电源给液晶屏供电,这些电压由单独的电源模块提供。整个视觉系统的硬件结构图如下图3 所示。
图3 视觉系统硬件结构图。
视觉系统软件组成主要包括操作系统、设备驱动程序,图像采集和图像显示程序。操作系统负责整个系统的管理,进程调度等,为用户使用开发板和外部设备提供最基本的接口程序,管理着开发板上的资源。
移植Linux2.6.14 内核作为嵌入式视觉系统的操作系统。设备驱动程序包括USB 摄像头驱动和LCD 液晶屏驱动,通过在Linux 系统中配置和加载完成。
4.1 图像采集程序
确定USB 摄像头被正常驱动后,下一步就是使用Video4Linux 提供的API 函数集来编写图像采集程序。
具体图像数据的捕获过程为:打开摄像头设备文件、查询和确认设备性能、设置图像的宽和高、设置色深、建立内存映射、读取图像数据、关闭设备。在上述过程中主要考虑如何读取图像数据,V4L 在内核include/linux/videodev.h 文件中定义了一些重要的数据结构,进行图像采集时,通过对这些数据结构的操作来获得图像数据。首先需要将显示设备的地址映射到系统地址上来,调用函数mmap()。该函数返回地址就是存放图像数据的地址, 每一帧图像都偏移固定的长度, 而摄像头取得图像会包含若干帧,这样通过周而复始的进行就可以将图像数据采集下来。具体过程和涉及到的函数如下:
打开设备文件: int devICe = open (/dev/v4l/video0,O_RDWR);
内存映射:char* memoryMap = (char*)mmap (0,memoryBuffer.size, PROT_READ PROT_WRITE,MAP_SHARED, device, 0);
图像数据: memoryMap + memory Buffer.offsets[bufferIndex]
4.2 图像显示程序
本系统采用直接将数据写入FrameBuffer 中来显示图像。FrameBuffer 设备是运行在Linux 控制台上的一个优秀的图形接口,几乎支持所有硬件,提供了统一的API 接口,很好地实现了硬件无关性。FrameBuffer的设备节点是/dev/fb* , 在编译内核时选中FrameBuffer.LCD 显示程序流程图如图4 所示:
图4 图像显示程序流程图
应用程序编写完之后,用交叉编译环境对这个文件进行编译,没有错误后可生成cam 可执行文件。然后把cam 拷贝到根目录下的bin 文件夹,在主机Windows 系统超级终端下输入命令:
#ln -s /dev/v4l/video0 /dev/video0
# cam 640 480 16 video0
就可以在屏幕上看到采集的图像了。设计的嵌入式视觉系统样机如图5 所示。
图5 嵌入式视觉系统样机。
S3C2410 控制板的I/O 口资源有限,因此,对图像采集的控制信号线采用普通I/O 口,而不是用中断I/O 口与其摄像头模块相连,因此只能用软件实时检测I/O 的电平状态,决定何时采集开始,何时读数据,何时结束。为了采集到图像数据并能分辨出来,必须能够跟踪控制信号的变化状态。
由于I/O 口的电平的变化频率远低于摄像头控制信号的变化频率,如果不对摄像头模块进行降频处理,这将导致I/O 口无法跟踪控制信号变化,即将无法判断帧、行、点何时开始与结束等状态信息。当摄像头的最高频率(点象素频率最高)降到1MHz 左右,系统就能跟踪并完整的采集到图像信息,进一步处理之后完好的显示出来。图6 是示波器对帧、行、点信号及Y0 信号的波形图。
图6 信号波形图。
从上图可以看出,系统的控制信号非常完整和稳定,没有出现毛刺、变形等情况,给检测读取带来了好处。Y0 的波形图有些段是低电平,出现的位置不一样,是因为摄像头移动时,环境光发生了变化,引起整个Y 数据变化。
表1 采集到的实验数据(示波器采用x10 档)。
把示波器调整到x10 档,在不同情况下,多次采集YSYN 信号、HREF 信号、PCLK 信号的峰-峰值、平均值、周期、频率等数据,从Y0~Y7 中选择Y0信号进行观察。从数据中可以看出各信号的峰-峰值变化幅度不大,尤其是信号的频率比较稳定。Y0 数据信号很规整,那么其他数据信号如Y1~Y7 也是如此。
多次实验数据如下表1 所示。
测试硬件性能稳定之后,在Linux 系统下把图像采集、图像显示和保存图像命令写成一个脚本,放在文件系统etc/init.d 目录下。重新把文件系统下载到开发板里,当开机启动后,系统会自动执行图像采集、显示和保存。
本文主要基于S3C2410 开发板和Linux 操作系统设计了嵌入式视觉系统。该视觉系统不仅可以较好地实现图像采集和显示,还可实现图像存储、网络获取图像等功能。
全部0条评论
快来发表一下你的评论吧 !