资讯详情

基于嵌入式Linux的视频采集编码系统实现

引言

嵌入式系统体积小,便携性强 PC机器有优势。随着计算机技术的发展,一些是基于计算机技术的PC嵌入式系统也可以实现机器的应用。由于 USB 接口摄像头价格低廉,性能好,即插即用。Linux下有Video4Linux标准支持其编程,易于集成到嵌入式系统中,因此通常使用嵌入式系统视频采集设备 USB 接口摄像头。

1 芯片介绍

S3C2440 处理器采用ARM920t内核,0.13um的CMOS 支持高速总线和异步总线模式的标准宏单元和存储单元; 1G字节搜索空间;支持外部等待信号延长总线周期;支持断电时间SDRAM 自刷新模式;支持从 NAND flash启动存储器;使用 4KB 启动引导内部缓冲器。采用写穿式(write-through)或写回式(write-back)cache 操作更新主存储器;写缓冲器可以保存 数据和16个字 4 地址1。

OV511 是高性能相机 USB 接口单片控制芯片,极大地简化了单片 CMOS 图像传感器和USB 在照片上添加256K DRAM 和一个 USB 收发器很容易形成USB 视频子系统。OV511 最大的视频传输设计使系统能够以更实时的方式获取大量的视频信息2。

OV7650集成度高,分辨率高 COMS 图像传感器集成了所有的摄像功能和矩阵处理功能。它就像矩阵位置 640*480 像素(30 支持万像素)VGA,QVGA ,CIF,QCIF编程控制3可以控制四种分辨率。

2 摄像头硬件

视频采集部分由 OV511 和OV7650组成。通过 SCCB 总线初始化OV7650和OV511 ,将OV7650设置为 CIF 采集,输出YUV422 数据流;将 OV511 配置为YUV422 格式输入,输出为YUV420 数据流。OV511 提供OV接受7650所需的控制信号 OV7650的同

步输出信号,通过内置输入图像数据 USB 控制器和外部 USB 收发器经USB 总线送入ARM,其硬件框图见图 1。

c7e1176228ad3fc925fb1709d5e2745a.png

3 USB 摄像头驱动

设备驱动程序可程序 Linux内核与外部设备的接口。设备驱动程序将硬件实现的细节屏蔽到应用程序中,使应用程序能够像操作普通文件一样操作外部设备,并使用与操作文件中相同的标准系统调用接口函数完成硬件设备的开启、关闭、读写和 I/O控制操作,驱动程序的主要任务是实现这些系统调用函数4。

Linux 视频采集设备的正常运行取决于 Video4Linux标准的支持。Video4Linux设备提供基本的设备驱动程序 I/O 操作接口函数 open ,read ,write实现中断处理、内存映射功能和对I/O 接口函数由通道控制 ioctl 实现等,并定义它们 struct video_device中。所以首先在驱动程序中声明一个 video_device 指定文件操作函数的结构指针fops 注册系统。当应用程序发出文件操作的相关命令时,Linux 根据这些指针调用相应的函数,并将该结构作为参数传递给它们,实现驱动与内核之间的通信。

Linux 内核按设备号操作设备文件,内核中相应的设备文件为/dev/video,主设备号为81,次设备号根据摄像头数量确定,系统中只使用一个摄像头。所以没有这个设备号,所以可以通过mknod /dev/video0 c 81 创建节点,驱动程序原理如图2所示。[page]

Linux 系统通过URB实现USB 传输。为了提高有效数据的传输速度,可以扩展 URB减少每一个缓冲USB 握手信息在事务中的比例。每次 USB 传输需要在操作系统中进行URB建立、发布、回收和数据整理阶段。可建立两个URB,当等待一个 URB当图像被传感器采集时,它被回收并初始化 URB,并在回收后立即发出。两个URB交替使用大大提高了系统处理的时间效率。

在编译器部分将 Linux 在下摄像头驱动程序中Makefile 相关行修改为文件CC=/opt/host/armv4l/bin/armv4l-unknown-gcc-linux,修改 Config.in 在配置内核时,可以看到驱动程序的名称。同时修改以下与处理器相关的部件,即可实现S3C2440 的USB 驱动的移植。

(1)PCI 接口处理

由于S3C2440 的USB 不包括主机控制器 PCI 因此需要删除接口 usb-ochi.c中与PCI与接口相关的代码。

(2)设置寄存器地址

在usb-ochi.c中,使S3C2440 的USB 主控制器寄存器的起始地址(0x49000000) 初始化ochi->regs。

(3)中断主机控制器

在usb-ochi.c中,使S3C2440 的USB 主机控制器寄存器的中断向量初始化 ochi->irq 。

(4)根HUB设置端口数量

在usb-ochi.c 中,定义根HUB下行端口数为 2(#define MAX_ROOT_PORTS

2),MAX_ ROOT_PORTS 默认值为150。

(5)修改 Makefile和Config.in 文件

修改完成后执行 make命令,即可生成所需要的带有.o 后缀驱动文件。

驱动程序设计和编译成功后,将动态加载添加到核心中。首先在宿主机上交叉编译驱动模块,然后通过串口下载到开发板上,然后使用 insmod 通过命令挂载驱动器,可以成功添加摄像头驱动器。 lsmod 命令可以查看当前的控动添加。

4 视频采集

基于系统软件VFL 开发,基本流程原理如图3所示。最关键的步骤之一是收集视频数据,通常有两种实现方法,一种是直接读取,另一种是内存映射。

1) 定义数据结构

例如:video_capability ,包括摄像头的基本信息;video_picture,包括设备采集图像的各种属性;video_mmap,用于内存映射;video_mbuf ,利用mmap 映射帧信息,实际上上是输入到相机存储器缓冲中的帧信息;video_Window,包括设备收集窗口的各种参数。[page]

Linux 将设备视为系统中的设备文件,可通过用户空间的标准 I/O 系统调用函数操作设备文件,达到与设备通信交互的目的。 ioctl 控制1/函数O 通道。

2) 实现采集程序的过程

1. 打开视频设备

在linux中视频设备对应的设备文件为/dev/video0 ,采用open 打开视频设备的函数。

2. 设置设备信息和视频信息

打开设备文件后,调用 camera_get_capability() 和camera_get_picture() 获取设备信息和图像信息的函数。这两个函数都通过调用来调用ioctl() 函数获取设备和图像的相关信息,并将获得的信息放入 video_capability 结构里。如果需要设置图像信息,首先给出video_picture 重新赋值数据结构对象中要修改的变量,然后通过 ioctl 函数的VIDIOCGPICT设置。通过调用 ioctl VIDIOCGPICT采集图像的属性可以设置。

3. 设置窗口的高度和宽度

编码器输入 CIF 格式的YUV420 因此,采集窗的高度设置为 288,宽度为352。

4. 获取视频帧

使用mmap()(内存映射) 截取视频的方法,mmap()系统调用使共享内存通过映射映射相同的普通文件实现。

主要部分介绍如下:

a. 初始化和设置

使用ioctl(camera_fd,VIDIOCGMBUF,&camera_mbuf) 函数初始video_mbuf,获取相机存储缓冲区的帧信息,然后修改 video_mmap设置帧状态。

b. 从摄像头设备文件到内存区的映射

调用buf=void *mmap(void *addr,size_t len,int prot,int flags,int fd,off_t offset) 将设备文件的内容映射到内存区的函数。

c. 数据采集

调用ioctl(fd,VIDIOCMCAPTURE,&camera_buf)截取图像,失败将返回-1 ,若函数成功调用,则开始截取一帧图像数据,并按缓冲区总帧数模加1,为下一帧截取做准备。然后调用 ioctl(fd,VIDIOCSYNC,&frame) 函数,成功返回意味着图像截取已经完成,可以开始采集下一帧图像。图像捕捉函数 v41_frame_grab()是mmap每次采集一帧内存映射捕捉视频数据的具体实现YUV420P原始图像数据的格式。在使用双缓冲区轮换采集时,通过外部循环控制采集摄像头帧缓冲区的次数,对每个缓冲区进行连续帧采集,以提高效率6。

连续帧采集也可以在此基础上实现,Video4Linux最多支持32帧采集,首先需要设置采集帧数 camera_buf.frame,并将data camera_mbuf.offsets[frame] 在内存中定义每帧数据的起始位置,并使用它 ioctl(fd,VIDIOCGMBUF,&camera_mbuf) 便可获得camera_mbuf 的信息。此外,还应设置数据缓冲区的大小,然后使用它 ioctl VIDIOCMCAPTURE 连续收集数据,直到缓冲区的剩余空间无法保存完整的数据帧。此外,还应设置数据缓冲区的大小,然后使用它 ioctl VIDIOCMCAPTURE 连续收集数据,直到缓冲区的剩余空间无法保存完整的数据帧。当缓冲区没有可用空间时,系统调用 ioctl VIDIOCSYNC 检查视频采集过程是否完成。如果完成,应用程序将地址分配到数据帧中,使缓冲区数据帧可被安全用于其他进程。

4. 关闭视频设备

在采集完成后,需要关闭设备,并收回系统资源。如果是采用内存映射方法进行视频采集,在系统任务完成后必须用munmap 函数关闭映射内存,close函数可关闭视频设备文件。

5 视频采集系统的多线程设计

在采集和处理模块的设计中创建图像采集和图像处理两个线程,并开辟两个缓冲区轮换采集图像帧,以便解决视频采集模块与编码模块的同步。在采集程序写满缓冲区1 后,改变线程等待条件,释放被阻塞的图像处理线程对该缓冲区数据进行编码输出。同时采集线程转到缓冲区2,若此时图像处理线程已完成对缓冲区 2 的处理,则将采集获得的帧图像覆盖,保存至缓冲区 2,否则阻塞。两个缓冲轮流使用,不丢弃任何帧,并且图像采集与处理同步进行,提高了效率。

6 结论

本文给出了远程监控系统中视频采集技术的分析和研究并得到实验结果。S3C2440 处理器USB Host控制器兼容USB1.1标准,支持低速 1.5Mbps 和全速12Mbps USB 设备。实验表明,视频采集程序对 CIF\\QVGA 格式的图像采集效率最高,采集速率分别达到 9fps ,12fps以上,接近全速模式下的极限速率。对 QCIF格式的图像采集效率较低,距离 USB1.1全速传输的理论值相差较远,这既与摄像头的硬件特性有关(包括图像传感器的特性以及 DSP 桥接芯片对图像格式的处理) ,也与驱动程序的实现有关。不过单从采集帧速率上看,9fps 的CIF 采集速度和24fps的QCIF采集速度己经可以满足一般嵌入式实时应用的要求。

标签: 0931s3pc接近传感器1545s3pc接近传感器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台