微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 基于Linux的嵌入式视觉系统设计方案

基于Linux的嵌入式视觉系统设计方案

时间:10-18 来源:互联网 点击:

常驱动后,下一步就是使用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 嵌入式视觉系统样机。

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 目录下。重新把文件系统下载到开发板里,当开机启动后,系统会自动执行图像采集、显示和保存。

6 结论

本文主要基于S3C2410 开发板和Linux 操作系统设计了嵌入式视觉系统。该视觉系统不仅可以较好地实现图像采集和显示,还可实现图像存储、网络获取图像等功能,并且可以在该基础上研究图像处理等算法。与基于PC 组合的视觉系统相比,结构简单,体积和重量减小,功耗低,可移植性强、功能扩展方便,成本显著降低,所以对这种嵌入式视觉系统研究具有相当重要的实用价值。

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

网站地图

Top