基于linux系统下的视频信号实时采集系统_第1页
基于linux系统下的视频信号实时采集系统_第2页
基于linux系统下的视频信号实时采集系统_第3页
基于linux系统下的视频信号实时采集系统_第4页
基于linux系统下的视频信号实时采集系统_第5页
已阅读5页,还剩54页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、摘 要摘 要随着现代电力电子技术和微电子技术的迅猛发展,自动化,智能化程度的不断的提高,家居安防技术正在不断发展。基于ARM的嵌入式Linux系统以其强大的功能而倍受关注,目前在消费电子、工业控制等众多领域得到了广泛的应用。传统的个人计算机的视频监控系统已经越来越不能满足现代人的需求。消费者希望自己可以实时“看见”现场的情况,并且可以远程控制现场的一些自动化设备来处理紧急情况。 本文分析了前人的研究成果并在通过自己对个人计算机的视频监控系统的理解,研究了一种通过ARM的嵌入式Linux系统的视频监控系统设计与实现的方案,且实现了实时监控监控的目的。这个项目的方案在硬件上采用的是三星上成熟的AR

2、M体系Exynos 4412型号的Cortex-A9架构处理器平台,以USB摄像头作为视频采集设备;在软件上采用了嵌入式Linux开发环境以及应用程序的开发,包括交叉编译工具环境的建立,TFTP和NFS的配置,BootLoader配置,Linux内核移植以及根文件系统的创建,并重点分析了在嵌入式Linux平台上进行USB摄像头驱动的开发流程,介绍了基于Video4linux2(简称V4L2)的视频采集编程接口API以及基于RGB格式转化为JPEG格式的图像压缩理论实现的方法,实现了摄像头的图像采集。此系统不但具有易维护性、可扩展性和安全性等这些嵌入式基本特点,而且充分融合了嵌入式和通信技术。使

3、得本系统的功能扩展性非常好,可以稍做定制就可以应用于很多其它场合。关键字:微电子,嵌入式Linux,ARM(Cortex-A9),Exynos 4412,USB摄像头,Video4linux2,API IABSTRACTABSTRACTWith the rapid development of modern power electronic technology and microelectronics technology, automation, intelligent degree of continuous improvement, home security and technolo

4、gy are developing continuously. Based on ARM embedded Linux system with its powerful function and attention, in the consumer electronics, industrial control, and many other fields has been widely used. The traditional video monitoring system has been more and more of the personal computer cannot mee

5、t the needs of modern people. Consumers hope oneself can "see" the scene real-time, and can remote control the scene of some of the automation equipment to deal with an emergency.This paper analyzes the research achievements of predecessors and through his understanding of video monitoring

6、 system of the personal computer, study a through the ARM embedded Linux system, video monitoring system design and implementation scheme, and achieve the goal of the real-time monitoring.Scheme on the hardware used in this project is mature on samsung ARM system Exynos 4412 model A9 architecture pr

7、ocessor architecture platform,with USB camera as the video acquisition device; Embedded Linux development environment has been used in the software and application development, including the establishment of the cross compile tools environment, TFTP configuration and NFS, BootLoader configuration, t

8、he Linux kernel transplantation and the creation of the root file system, And analyzed on the embedded Linux platform for USB camera driver development process, introduction based Video4linux2 (referred V4L2) video capture programming interface (API) and RGB format into JPEG format image compression

9、 method based on the theory of implementation, to achieve a camera image acquisition.This system not only has easy maintainability, scalability, and security such as embedded basic characteristics, and to fully mix the embedded and communication technology. Make the function expansibility of this sy

10、stem is very good, we could do a little customization can be applied in many other occasions.Keywords:Microelectronics, Embedded Linux, ARM (Cortex-A9), Exynos 4412, USB camera, Video4linux2, API II目录目录第1章课题整体框架11.1 课题任务11.2 课题要求11.3 研究意义1第2章设计方案32.1 嵌入式系统简介32.2 硬件部分32.2.1 硬件开发平台32.2.1 ARM微处理器52.2.3

11、 摄像头选择62.3软件部分72.3.1linux操作系统72.3.2软件开发环境的创建7第3章实现功能123.1 实现功能描述123.2 软件设计133.2.1 软件设计思路描述133.2.2 linux平台上进行USB摄像头驱动开发流程143.2.3 基于RGB格式转化为JPEG格式的图像压缩理论实现203.2.4 建立linux环境下的服务器21第4章调试与实现234.1 调试中遇到的重点与难点234.2 解决方案234.3 实现展示(附上仿真图或实物照片)24第5章总结275.1 论文总结275.2 未来展望27参考文献29致谢30附录31附录一: 主函数main.c31附录二: ca

12、mera下实现的接口功能函数321) camera_progress.c 负责采集图片322) camera.c 自己定义的接口描述383) convert.c RGB格式转化为JPEG格式的图像压缩理论实现46附录三: linux环境下的服务器 socket.c53 III第1章 课题整天框架第1章 课题整体框架1.1 课题任务本文是在电子科技大学成都学院课程设计的基础上自己实际进行实验开发实现了“基于linux的视频监控系统设计与实现”的方案,在深入研究了嵌入式Linux操作系统、视频数据采集与流媒体实时传输技术的基础上将上述三者结合起来设计了一套网络视频监控系统,并且成功的进行了视频的采

13、集。1.2 课题要求根据课题的要求,采用了以成熟的ARM体系架构的Cortex-A9处理器平台系统架构,设计出了一种基于linux系统下的视频信号实时采集系统。论文的设计工作主要集中在下面的几个方面:1) 软件开发环境的创建,比如linux环境下交叉编译工具环境的建立,TFTP和NFS的配置,BootLoader配置,Linux内核移植以及根文件系统的创建;2) 分析了在嵌入式linux平台上进行USB摄像头驱动的开发流程;3) 基于Video4linux2(简称V4L2)的视频采集编程接口API; 4) 基于RGB格式转化为JPEG格式的图像压缩理论实现;5) 建立linux环境下的服务器,

14、并完成Linux下视频采集的程序的设计,提供源代码。1.3 研究意义随着嵌入式、物联网技术快速发展,视频监控系统技术在现代各个领域内应用越来越广泛,其中包括可以用于智能家居系统,智能农业系统上的视频处理收集、监控模块中,可以用于智能医疗系统和安防监控系统中实时监控功能,比如用于现场的数据采集、数据处理、安全防范、信息获取、实时监控等功能,从而大大提高管理效率,使人们的工作水平得到显著的提高。在监控领域中,实时传送视频、音频、多媒体动画等数字媒体文件的技术越来越成为研究热点,而这种技术就称为流媒体传输技术。基于这样的流媒体传输技术就可以适用于更大的视频数据处理、监控,从而保证了为远程视频监控提供

15、高效可行且价格低廉的解决方案。为了确保系统整体性能的稳定和高效,同时满足未来物联网系统的需求,实现资源的共享,从而使人们有能力解决以往在有限的资源下很难解决的问题,本文提出了基于linux系统下以成熟的ARM体系架构的Cortex-A9处理器平台,以USB摄像头作为视频采集设备的设计与实现方案。所以基于这样的研究,对未来物联网系统的数据处理、信息安全和安防监控有着重要的意义1第2章 设计方案第2章 设计方案2.1 嵌入式系统简介嵌入式系统(Embedded system),是一种“完全嵌入受控器件内部,为特定应用而设计的专用计算机系统”,根据英国电气工程师协会( U.K. Institutio

16、n of Electrical Engineer)的定义,嵌入式系统为控制、监视或辅助设备、机器或用于工厂运作的设备。与个人计算机这样的通用计算机系统不同,嵌入式系统通常执行的是带有特定要求的预先定义的任务。由于嵌入式系统只针对一项特殊的任务,设计人员能够对它进行优化,减小尺寸降低成本。嵌入式系统通常进行大量生产,所以单个的成本节约,能够随着产量进行成百上千的放大。良好的总体方案设计是设计开发的关键,本系统设计方案包括硬件和软件两大部分,硬件部分包括摄像头模块和硬件开发平台;软件部分包括linux操作系统、驱动程序、linux环境下交叉编译工具环境的建立,TFTP和NFS的配置,BootLoa

17、der配置,linux内核移植以及根文件系统的创建,以及基于Video4linux2(简称V4L2)的视频采集编程接口API以及图像压缩理论的使用方法。2.2 硬件部分2.2.1 硬件开发平台这个项目的硬件开发平台采用的是基于三星上成熟的ARM体系Cortex-A9架构处理器的Exynos 4412型号的开发板FS4412平台,USB摄像头作为视频采集设备。Exynos4412采用了32nm HKMG工艺,是三星的第一款四核芯片,Exynos 4412有两种封装SCP和POP;Exynos 4412处理器当前三星推出了两个封装版本(PoP和SCP),其中PoP封装主要是针对智能手机等产品体积要

18、求严格的项目中使用。由于采用了 DDR和处理器叠层的焊接工艺,使得设计者对于DDR部分的LAYOUT节省了大量的工程周期,且解决了EMI等复杂电气问题,但同时也导致其他有一些问 题呈现出来。1) Exynos 4412的PoP版本当前最大DDR为1GB, 如果客户有内存扩容的可能,将后悔莫及;2) Exynos 4412的BGA间距为0.4mm,这是当前国内焊接工厂的极限能力,客户在生产工厂的选择上增加了难度,且成品的报废率明显上升;3) 由于BGA间距太小,PCB布线方面通常需要二阶盲埋孔的HDI板才能完成,使得PCB的成本和周期大大增加;4) Exynos 4412的PoP版本官方不再对大

19、众用户做进一步的技术支持和文档的开放。2.2.1 ARM微处理器ARM(Advanced RISC Machines),既可以认为是一个公司的名字,也可以认为是对微处理器的通称,还可以认为是一种技术的名字。其体系结构具有以下特点:1) 体积小、低功耗、低成本、高性能;2) 支持Thumb(16位)/ARM(32位)双指令集,能很好的兼容8位/16位器件;3) 大量使用寄存器,指令执行速度更快;4) 大多数数据操作都在寄存器中完成;5) 寻址方式灵活简单,执行效率高;6) 指令长度固定。本文的开发平台是基于三星上成熟的ARM体系Exynos 4412型号的Cortex-A9架构处理器,Corte

20、x-A9处理器能与其他Cortex系列处理器以及广受欢迎的ARM MPCore技术兼容,因此能够很好延用包括操作系统/实时操作系统(OS/RTOS)、中间件及应用在内的丰富生态系统,从而减少采用全新处理器所需的成本。通过首次利用关键微体系架构方面的改进,Cortex-A9 处理器提供了具有高扩展性和高功耗效率的解决方案。利用动态长度、八级超标量结构、多事件管道及推断性乱序执行( Speculative out-of-order execution),它能在频率超过1GHz的设备中,在每个循环中执行多达四条指令,同时还能减少目前主流八级处理器的成本并提高效率。同时使用相当少的功耗比的高性能计算机

21、平台的ARM Cortex-A9处理器提供了卓越的能力。它被证明在广泛的设备,是ARM的较为成熟的应用处理器之一。在Cortex-A9实现了广泛的支持的ARMv7-A架构的全部丰富性。高效率,双超标量和乱序,动态长度管道周围设计(8 - 11级),在Cortex-A9提供的性能和功率效率卓越的水平所需的尖端产品的功能就广泛的消费,网络,企业和移动应用。该处理器微架构支持16,32或64 KB四路关联的L1高速缓存的配置,具有可选的L2缓存提供的缓存内存高达8MB。可伸缩的多核及单处理器解决方案提供最广泛的灵活性,并且各自适合于各种应用和市场。与ARM MPCore的,多达四个连贯芯可以一起使用

22、,以实现性能更高的水平。在一个单一的芯实现中,处理器是针对需要有竞争力的功率效率低功耗,成本敏感的设备。2.2.3 摄像头选择摄像头又称为电脑相机、电脑眼等,它作为一种视频输入设备,在过去被广泛的运用于视频会议、远程医疗及实时监控等方面。近年以来,随着互联网技术的发展,网络速度的不断提高,再加上感光成像器件技术的成熟并大量用于摄像头的制造上,这使得它的价格降到普通人可以承受的水平。普通的人也可以彼此通过摄像头在网络进行有影像、有声音的交谈和沟通,另外,人们还可以将其用于当前各种流行的数码影像、影音处理。摄像头分为数字摄像头和模拟摄像头两大类。模拟摄像头可以将视频采集设备产生的模拟视频信号转换成

23、数字信号,进而将其储存在计算机里。模拟摄像头捕捉到的视频信号必须经过特定的视频捕捉卡将模拟信号转换成数字模式,并加以压缩后才可以转换到计算机上运用。数字摄像头可以直接捕捉影像,然后通过串、并口或者USB接口传到计算机里。现在电脑市场上的摄像头基本以数字摄像头为主,而数字摄像头中又以使用新型数据传输接口的USB数字摄像头为主,目前市场上可见的大部分都是这种产品。由于个人电脑的迅速普及,模拟摄像头的整体成本较高等原因,USB接口的传输速度远远高于串口、并口的速度,因此现在市场热点主要是USB接口的数字摄像头。以下主要是指USB接口的数字摄像头。FS_9650是一款130万像素的摄像头,图像清晰。目

24、前在Exynos 4412型号的Cortex-A9架构处理器上以FS_4412 Cortex-A9开发板为平台的基础上已经实现图像预览和拍照功能。2.3 软件部分2.3.1linux操作系统linux是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和64位硬件。linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。其主要特性如下:1) 基本思想:linux的基本思想有两点:第一,一切都是文件;第二,每个软件都有确定的用途。其中第一条详细来讲就是系统中的所有都归结为一个文

25、件,包括命令、硬件和软件设备、操作系统、进程等等对于操作系统内核而言,都被视为拥有各自特性或类型的文件。2) 完全免费:linux是一款免费的操作系统,用户可以通过网络或其他途径免费获得,并可以任意修改其源代码。这是其他的操作系统所做不到的。3) 完全兼容POSIX1.0标准:这使得可以在linux下通过相应的模拟器运行常见的DOS、Windows的程序。这为用户从Windows转到linux奠定了基础。许多用户在考虑使用linux时,就想到以前在Windows下常见的程序是否能正常运行,这一点就消除了他们的疑虑。4) 多用户、多任务:linux支持多用户,各个用户对于自己的文件设备有自己特殊

26、的权利,保证了各用户之间互不影响。多任务则是现在电脑最主要的一个特点,linux可以使多个程序同时并独立地运行。5) 支持多种平台:linux可以运行在多种硬件平台上,如具有x86、680x0、SPARC、Alpha等处理器的平台。2.3.2软件开发环境的创建1) linux环境下交叉编译工具环境的建立交叉编译工具环境是在linux环境下进行视频监控的重要步骤,是在某个主机平台上(比如PC上)用交叉编译器编译出可在其他平台上(比如ARM上)运行的代码的过程。通过网络下载交叉编译器机型,其重要的步骤如下所示:$ tar xvf gcc-4.6.4.tar.xz $ sudo vim /etc/b

27、ash.bashrc /* 添加交叉编译工具链的路径到系统脚本在末尾添加export PATH=/home/linux/store/gcc-4.6.4/bin:$PATH 注意路径要根据gcc-4.6.4的实际路径修改 */$ source /etc/bash.bashrc /使配置文件生效$ arm-n 然后按Tab键补全 /如果能补全为arm-none-linux-gnueabi- 表示安装交叉编译工具成功了2) TFTP和NFS的配置为了开发过程中挂载文件系统和下载文件的顺利,还需要配置TFTP和NFS服务。其步骤如下所示:(1)对于TFTP服务安装(虚拟机上安装tftp服务):$ dp

28、kg -s tftp /* 检查是否安装tftp server$ sudo mkdir /tftpboot /创建工作目录(要传输的文件,放在该位置)$ sudo chmod 777 tftpboot $ sudo vi /etc/inetd.conf /修改tftp服务器配置文件把该行 tftp dgram udp wait nobody /usr/sbin/tcpd /usr/sbin/in.tftpd /srv/tftp 改为 tftp dgram udp wait nobody /usr/sbin/tcpd /usr/sbin/in.tftpd /tftpboot$ sudo /etc

29、/init.d/xinetd restart /如果有更改配置,需要重启一下 tftp-server$ sudo in.tftpd -l /tftpboot$ cd /tftpboot$ touch test (2)对于NFS服务安装:$ service nfs-kernel-server /*检查nfs服务是否安装$ sudo vi /etc/exports /*修改配置文件,指定共享目录位置在末尾追加/nfs/rootfs *(rw,sync,no_root_squash) 或 /opt/nfs *(rw,sync,no_root_squash,no_subtree_check) 注意:路

30、径不一样,因为我把 nfs 服务 的路径放在了 /opt/nfs 中 或 /source/ *(rw,sync,no_subtree_check) */ $ sudo mkdir /nfs / sudo mkdir /home/nfs/rootfs nfs的路径$ sudo chmod 777 /nfs改权限$ cd /nfs$ cp /e/fs4412/环境搭建/rootfs.tar.xz . /rootfs.tar.xz是已制作好的根文件系统$ tar -xvf rootfs.tar.xz $ sudo chmod 777 rootfs$ sudo /etc/init.d/nfs-kern

31、el-server restart /重启nfs服务(使得前面修改生效)3) BootLoader配置引导加载程序是系统加电后运行的第一段软件代码。 BootLoader就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。Boot- Loader 的主要运行任务就是将内核映象从硬盘上读到 RAM 中,然后跳转到内核的入口点去运行,也即开始启动操作系统。4) linux内核移植以及根文件系统的创建 (1)对于linux内核移植的配置:下载源码:linux-3

32、.14.tar.xz配置编译源码:$ vim Makefile /* 指定交叉编译工具链修改:ARCH?= $(SUBARCH)ROSS_COMPILE?= $(CONFIG_CROSS_COMPILE:"%"=%)为:ARCH?= arm CROSS_COMPILE?= arm-none-linux-gnueabi- */$ make exynos_defconfig /*导入配置$ make menuconfig /*配置内核命令如图2-3和图2-4所示:图2-3 配置内核命令图2-4 图形化的内核配置$ make uImage /*编译内核$ make dtbs /*

33、编译设备树(2)对于根文件系统的创建:根文件系统就是内核启动后挂载的第一个文件系统。 它的目录可做为挂载点,挂载别的文件系统。其重要步骤如下所示:首先下载一个BusyBox,BusyBox 是一个遵循GPL协议、以自由软件形式发布的应用程序。BusyBox在单一的可执行文件中提供了精简的Unix工具集。其一般步骤为:用BusyBox创建基本命令;创建基本目录 /lib/etc/var/tmp/dev/sys/proc等;添加glibc基本动态库;创建基本的设备节点;添加启动配置和脚本程序;测试根文件系统;制作根文件系统镜像。55第3章 实现功能第3章 实现功能3.1 实现功能描述Video f

34、or Linux two(Video4Linux2)简称V4L2,是V4L的改进版。V4L2是linux操作系统下用于采集图片、视频和音频数据的API接口,配合适当的视频采集设备和相应的驱动程序,可以实现图片、视频、音频等的采集。在远程会议、可视电话、视频监控系统和嵌入式多媒体终端中都有广泛的应用。V4L2规范中不仅定义了通用API元素(Common API Elements),图像的格式(Image Formats),输入/输出方法(Input/Output),还定义了linux内核驱动处理视频信息的一系列接口(Interfaces),这些接口主要有:视频采集接口Video Capture

35、Interface;视频输出接口 Video Output Interface;视频覆盖/预览接口Video Overlay Interface;视频输出覆盖接口Video Output Overlay Interface;编解码接口Codec Interface。以及我自己定义的接口描述:A、实现了设备初始化函数int camera_init(char *devpath, unsigned int *width, unsigned int *height, unsigned int flag);B、实现了采样函数int camera_start_capture(void);int camer

36、a_dequeue_buf(void *buf, unsigned int *size, unsigned int *index);/把采集的数据放回缓存队列int camera_enqueue_buf(unsigned int index);/把采集的数据从缓存中读取出来C、实现格式转换函数int convert_yuyv_to_rgb(void *yuyv, void *rgb, unsigned int width, unsigned int height, unsigned int bpp); /yuyv转换为rgb格式int convert_rgb_to_bmp(void *rgb,

37、 void *bmp, unsigned int width, unsigned int height, unsigned int bpp); / rgb转换为bmp格式3.2 软件设计3.2.1 软件设计思路描述流程图框架如图3-1所示:图3-1 流程图框架一般操作流程如下:1) 打开视频设备。 int fd=open(”/dev/video0,O_RDWR);2) 设定属性及采集方式;(1) 检查当前视频设备支持的标准;(2) 设置视频捕获格式;(3) 分配内存接下来可以为视频捕获分配内存;(4) 获取并记录缓存的物理空间使用VIDIOC_REQBUFS;(5) 视频采集方式;(6) 处理

38、采集数据;3) 关闭视频设备。3.2.2 linux平台上进行USB摄像头驱动开发流程在linux下,所有外设都被看成一种特殊的文件,成为“设备文件”,可以象访问普通文件一样对其进行读写。一般来说,采用V4L2驱动的摄像头设备文件是/dev/v4l/video0。为了通用,可以建立一个到/dev/video0的链接。V4L2支持两种方式来采集图像:内存映射方式(mmap)和直接读取方式(read)。V4L2在include/linux/videodev.h文件中定义了一些重要的数据结构,在采集图像的过程中,就是通过对这些数据的操作来获得最终的图像数据。linux系统V4L2的能力可在linux

39、内核编译阶段配置,默认情况下都有此开发接口。V4L2从linux 2.5.x版本的内核中开始出现。常用的结构体(参见/usr/include/linux/videodev2.h):struct v4l2_requestbuffers reqbufs; /向驱动申请帧缓冲的请求,里面包含申请的个数struct v4l2_capability cap; /这个设备的功能,比如是否是视频输入设备struct v4l2_input input; /视频输入struct v4l2_standard std; /视频的制式,比如PAL,NTSCstruct v4l2_format fmt; /帧的格式,比

40、如宽度,高度等 struct v4l2_buffer buf; /代表驱动中的一帧struct v4l2_queryctrl query; /查询的控制struct v4l2_control control; /具体控制的值V4L2采用流水线的方式,操作更简单直观,基本遵循打开视频设备、设置格式、处理数据、关闭设备,更多的具体操作通过ioctl函数来实现。1) 打开视频设备在V4L2中,视频设备被看做一个文件。使用open函数打开这个设备:int cameraFd; / 用非阻塞模式打开摄像头设备cameraFd = open("/dev/video0", O_RDWR |

41、 O_NONBLOCK, 0);2) 设定属性及采集方式打开视频设备后,可以设置该视频设备的属性,例如裁剪、缩放等。这一步是可选的。在linux编程中,一般使用ioctl函数来对设备的I/O通道进行管理:int ioctl (int _fd, unsigned long int _request, ./*args*/);常用的命令标志符如下:VIDIOC_REQBUFS:分配内存VIDIOC_QUERYBUF:把VIDIOC_REQBUFS中分配的数据缓存转换成物理地址 VIDIOC_QUERYCAP:查询驱动功能 VIDIOC_ENUM_FMT:获取当前驱动支持的视频格式 VIDIOC_TR

42、Y_FMT:验证当前驱动的显示格式 VIDIOC_QBUF:把数据从缓存中读取出来 VIDIOC_DQBUF:把数据放回缓存队列 VIDIOC_STREAMON:开始视频显示函数 VIDIOC_STREAMOFF:结束视频显示函数 VIDIOC_QUERYSTD:检查当前视频设备支持的标准,例如PAL或NTSC。(1) 检查当前视频设备支持的标准v4l2_std_id std;do ret = ioctl(fd, VIDIOC_QUERYSTD, &std); while (ret = -1 && errno = EAGAIN); switch (std) case V

43、4L2_STD_NTSC: / case V4L2_STD_PAL: /(2) 设置视频捕获格式当检测完视频设备支持的标准后,还需要设定视频捕获格式,结构如下: struct v4l2_format fmt; memset ( &fmt, 0, sizeof(fmt) );fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;fmt.fmt.pix.width = 720;fmt.fmt.pix.height = 576;fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV;fmt.fmt.pix.field = V4L2_FI

44、ELD_INTERLACED;if (ioctl(fd, VIDIOC_S_FMT, &fmt) = -1) return -1;v4l2_format结构如下:struct v4l2_format enum v4l2_buf_type type; / 数据流类型,必须永远是V4L2_BUF_TYPE_VIDEO_CAPTUREunion struct v4l2_pix_format pix;struct v4l2_window win;struct v4l2_vbi_format vbi;_u8 raw_data200; fmt;struct v4l2_pix_format _u32

45、 width;/ 宽,必须是16的倍数 _u32 height; / 高,必须是16的倍数 _u32 pixelformat;/ 视频数据存储类型,例如是YUV4:2:2 enum v4l2_field field; _u32 bytesperline; _u32 sizeimage;enum v4l2_colorspace colorspace; _u32 priv;(3) 分配内存接下来可以为视频捕获分配内存:struct v4l2_requestbuffers req;if (ioctl(fd, VIDIOC_REQBUFS, &req) = -1) return -1; v4l

46、2_requestbuffers结构如下:struct v4l2_requestbuffers_u32 count; / 缓存数量,也就是说在缓存队列里保持多少张照片enum v4l2_buf_type type; / 数据流类型,必须永远是V4L2_BUF_TYPE_VIDEO_CAPTUREenum v4l2_memory memory; / V4L2_MEMORY_MMAP 或 V4L2_MEMORY_USERPTR_u32 reserved2;(4) 获取并记录缓存的物理空间使用VIDIOC_REQBUFS我获取了req.count个缓存,下一步我通过调用VIDIOC_QUERYBUF

47、命令来获取这些缓存的地址,然后使用mmap函数转换成应用程序中的绝对地址,最后把这段缓存放入缓存队列:typedef struct VideoBuffer void *start;size_t length; VideoBuffer;VideoBuffer* buffers = calloc( req.count, sizeof(*buffers) );struct v4l2_buffer buf;for (numBufs = 0; numBufs < req.count; numBufs+) memset( &buf, 0, sizeof(buf) );buf.type = V

48、4L2_BUF_TYPE_VIDEO_CAPTURE;buf.memory = V4L2_MEMORY_MMAP;buf.index = numBufs; / 读取缓存if (ioctl(fd, VIDIOC_QUERYBUF, &buf) = -1) return -1;buffersnumBufs.length = buf.length; / 转换成相对地址 buffersnumBufs.start = mmap(NULL, buf.length, PROT_READ | PROT_WRITE, MAP_SHARED,fd, buf.m.offset); if (buffersnu

49、mBufs.start = MAP_FAILED) return -1; / 放入缓存队列if (ioctl(fd, VIDIOC_QBUF, &buf) = -1) perror(CAMERA_DBG_TAG);munmap(camera.bufsi.start, camera.bufsi.length);num = i-;ret = -ECAMERABUF;goto enq_err; 缓冲区的状态转化如图3-2所示:图3-2 缓冲区的状态转化图(5) 视频采集方式V4L2捕获的数据,最初是存放在内核空间的,这意味着用户不能直接访问该段内存,必须通过某些手段来转换地址。一共有三种视频

50、采集方式:使用read/write方式;内存映射方式和用户指针模式。read、write方式,在用户空间和内核空间不断拷贝数据,占用了大量用户内存空间,效率不高。内存映射方式:把设备里的内存 映射到 应用程序中的内存控件,直接处理设备内存,这是一种有效的方式。上面的mmap函数就是使用这种方式。用户指针模式:内存片段由应用程序自己分配。这点需要在v4l2_requestbuffers里将memory字段设置成V4L2_MEMORY_USERPTR。(6) 处理采集数据V4L2有一个数据缓存,存放req.count数量的缓存数据。数据缓存采用FIFO的方式,当应用程序调用缓存数据时,缓存队列将最

51、先采集到的视频数据缓存送出,并重新采集一张视频数据。这个过程需要用到两个ioctl命令,VIDIOC_DQBUF和VIDIOC_QBUF:struct v4l2_buffer buf; memset(&buf,0,sizeof(buf);buf.type=V4L2_BUF_TYPE_VIDEO_CAPTURE;buf.memory=V4L2_MEMORY_MMAP;buf.index=0;/读取缓存if (ioctl(cameraFd, VIDIOC_DQBUF, &buf) = -1) return -1;if (ioctl(cameraFd, VIDIOC_QBUF, &a

52、mp;buf) = -1) return -1;3) 关闭视频设备使用close函数关闭一个视频设备。 close(cameraFd)/ 如果使用mmap,最后还需要使用munmap方法。3.2.3 基于RGB格式转化为JPEG格式的图像压缩理论实现1) yuyv转换为rgb格式,函数模块如下:int convert_yuyv_to_rgb(void *yuyv, void *rgb, unsigned int width, unsigned int height, unsigned int bpp);2) yuyv转换为rgb格式时的初始化模块:void convert_rgb_to_jpe

53、g_init(void);3) yuyv转换为rgb格式时进行初始化模块:int convert_rgb_to_jpeg_work(void *rgb, void *jpeg, unsigned int width, unsigned int height, unsigned int bpp, int quality);4) yuyv转换为rgb格式时退出函数模块:void convert_rgb_to_jpeg_exit(void);5) rgb转换为bmp格式,函数模块如下:int convert_rgb_to_bmp(void *rgb, void *bmp, unsigned int

54、width, unsigned int height, unsigned int bpp);其具体实现代码在附录二的convert.c中。3.2.4 建立linux环境下的服务器在linux环境下的服务器模块,用的是TCP/IP协议。其负责的功能就是通过Socket编程模块建立其与远程客服端的连接和取消,从而接受客服端的各种请求,比如视频的监控、信息采集等功能。TCP/IP协议是Internet事实上的工业标准,一共有四层:应用层、传输层、网络层、网络接口和物理层,其参考模型如图3-3所示:应用层传输层 网络层网络接口和物理层图3-3 TCP/IP参考模型TCP(即传输控制协议):是一种面向连

55、接的传输层协议,它能提供高可靠性通信(即数据无误、数据无丢失、数据无失序、数据无重复到达的通信)。Socket编程起源于Unix,是应用层与TCP/IP协议族通信的中间软件抽象层,是独立于具体协议的网络编程接口,也是一种特殊的文件描述符。而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open > 读写write/read > 关闭close”模式来操作。Socket就是该模式的一个实现,Socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO、打开、关闭)。Socket类型有三种不同的类型:流式套接字、数据包套接字和原始套接字。1)

56、流式套接字基于TCP协议,提供了一个面向连接、可靠的数据传输服务,数据无差错、无重复的发送且按发送顺序接收。内设置流量控制,避免数据流淹没慢的接受方。数据是被看作字节流,无长度限制。2) 数据包套接字基于UDP协议,提供无连接服务。数据包以独立数据包形式被发送,不提供无差错保证,数据可能丢失或重复,顺序发送,可能乱序接收。3) 原始套接字可以对较低层次协议如IP、ICMP直接访问。本文采用的Socket编程模块是基于流式套接字实现视频的监控、信息采集的。第4章 调试与实现第4章 调试与实现4.1 调试中遇到的重点与难点总的来说,对于此论文中成功采集到视频流,是离不开我的朋友和老师的帮助。尤其是在调试过程中,BUG多的不是一点点。所以在调试这方面除了软件方面,硬件方面的难点也是重中之重。下面我就讲述我所遇到的对我来说很重要的难点及重点的一些调试问题。1) 硬件方面来讲:(1) 就是在开始的时候,开发板和PC版上串口连接后进行u-boot移植

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论