嵌入式摄像头抓图系统设计与实现毕业论文.doc

上传人:文库蛋蛋多 文档编号:3942384 上传时间:2023-03-28 格式:DOC 页数:57 大小:2.19MB
返回 下载 相关 举报
嵌入式摄像头抓图系统设计与实现毕业论文.doc_第1页
第1页 / 共57页
嵌入式摄像头抓图系统设计与实现毕业论文.doc_第2页
第2页 / 共57页
嵌入式摄像头抓图系统设计与实现毕业论文.doc_第3页
第3页 / 共57页
嵌入式摄像头抓图系统设计与实现毕业论文.doc_第4页
第4页 / 共57页
嵌入式摄像头抓图系统设计与实现毕业论文.doc_第5页
第5页 / 共57页
点击查看更多>>
资源描述

《嵌入式摄像头抓图系统设计与实现毕业论文.doc》由会员分享,可在线阅读,更多相关《嵌入式摄像头抓图系统设计与实现毕业论文.doc(57页珍藏版)》请在三一办公上搜索。

1、嵌入式摄像头抓图系统设计与实现摘 要随着现代科技的飞速发展,我们越来越重视实时通讯,时时刻刻的了解身边发生的一切,这样我们就需要摄像头和Linux来帮助我们实现这一切。本项目以实现嵌入式的摄像头抓图系统为核心,使用V4L2框架完成图像采集。Video4Linux2是基于Linux系统进行图像和影音开发的应用编程接口。本项目的实现过程:服务器端,需要使用C语言,并结合V4L2框架,遵守V4L2的流程,先获取视频设备支持的标准,后设置捕获的视频格式,然后为图像数据分配内存空间,使用mmap将内核空间映射出来,使得应用程序能够访问内核空间,保存捕获的数据,将数据发送到用户空间。使用socket建立网

2、络连接,创建socket,绑定,监听,接受用户请求。使用视频传输 http协议,程序运行时加入JPEG库,通过转换格式将yuv转换成JPEG,并使用huffman函数解码打印图片。客户端方面,使用Qt实现客户端的图形化界面,使用QTcpSocket,建立连接,连接到服务器,不停地发送和接受数据,完成视频显示,图像采集,暂停的功能。最后,本文给出了符合V4L2框架的本机摄像头图像数据采集功能,并转换为JPEG格式保存。最后,本系统可以将捕捉到的画面显示在屏幕上并且可以实现抓图的功能。关键词 Linux;V4L2;图像采集;摄像头;显示Embedded camera capture system

3、design and implementationAbstractWith the rapid development of modern technology, we are increasing emphasis on real-time communication, understanding everything happening around all the time, so we need a camera and Linux to help us achieve this.The project to implement an embedded camera capture s

4、ystem as the core, using V4L2 framework of image acquisition.Video4Linux2 is an application programming interface under Linux to develop video and image. Implementation process of the project:The program camera capture system based on the embedded,use c language to achieve the server side and use v4

5、l2 framework.First, get the standard of a video device support,Then set the format of the video capture,Then allocate memory for the image,Address translation mappings by using mmap,save data and then sends the data to the user space.Establish a network connection by using socket,create a socket,bin

6、ding, listening,and receiving a user request,using the http protocol for video transmission,adding JPEG library in the runing time ,converting yuv into JPEG format by the technology of converting and print pictures by using huffman decoding function.Using Qt creator graphical interface to achieve cl

7、ient,the client using QTcpSocket to get a connection, and link the server, constantly sending and receiving data,and then complete the fuction of video display, image capture and stop In this paper, it offer the gathering function of camera image that conforms the framework of V4L2 and convert to th

8、e JPEG to save.Finally, the system can capture the screen display on the screen and can capture functionality.Key words Linux;V4L2;capture picture;camera;display目录摘 要iAbstractii1 绪论11.1 课题背景11.2 图集系统的研像采究发展21.3 需求分析31.3.1 用户需求分析31.3.2 功能需求分析31.4 可行性研究32 开发环境及主要技术42.1 开发环境42.2 语言和开发平台的选定42.2.1 C语言简介4

9、2.2.2 Qt简介42.3 V4L2架构82.3.1 概述82.3.2 系统调用82.3.3 数据交换92.3.4 处理采集数据102.4 socket服务102.4.1 socket概述102.4.2 socket工作方式112.5 http协议112.5.1 http概述112.5.2 http特点122.5.3 本文所用到的http协议报文123 概要设计133.1 服务器端143.2 客户端144 详细设计164.1 V4L2框架图像采集164.2 socket套接字的创建194.2.1 服务端204.2.2 客户端与服务器的socket连接214.3 客户端读取http协议传输的图

10、片214.4 客户端使用的信号与槽函数234.4.1 start按钮234.4.2 photo按钮234.4.3 stop按钮244.4.4 quit按钮244.5 图片的输出244.5.1 huffman函数244.5.2 jpeg库254.6.1 QBitmap254.6.2 QPicture254.6.3 QImage254.6.4 QPixmap265 测试及运行结果285.1 软件测试目标285.2 软件测试及运行的结果28结 论33参考文献34致 谢35外文原文36中文翻译461 绪论1.1 课题背景在当今的世界中,各项技术都有了突飞猛进的发展,而嵌入式相关技术、相关多媒体的技术和

11、各种各样的网络技术有了快速稳步的发展,其中基于嵌入式的视频压缩编码技术和网络的传输控制已经得到了综合应用,已经在数字化网络视频采集监控领域有了立足之地,成为了这种技术的核心。由于系统的实时性,交互性,高速传输性,高质量传输的性能摄像头系统已经得到了广泛的使用,比如现在使用的网络视频聊天,安保监控,网络视频会议系统,视频电话等。由此可见,本课题的研究,对开发简单,简便的视频传输终端设备有一定的价值。这里Linux因为其开源、稳定性高、移植性较好、对网络的强大支持和其对文件系统的支持和操作简易等特点,受到了广大编程人员的青睐,频繁的出现在各种嵌入式设备的开发当中。到目前为止视频监控系统在电信、银行

12、、交通、电力、水利、石化、智能大厦等许多领域都有着广泛的应用。日前,基于PC的传统视频监控系统在上述的这些领域中使用的比较广泛,这种系统虽然功能较强,但是它的稳定性不好、视频前端较为复杂、可靠性较差、功耗高。然而,随着高性能嵌入式处理器和网络技术的快速发展,嵌入式网络视频监控系统将会得到广泛应用,这种系统把图像采集、视频压缩和网络功能集中在一起,可以直接连入以太网,具有体积小、功耗低、稳定性高、成本低等优点。相信在以后随着计算机技术、多媒体技术和网络技术的发展与提高,视频监控系统正向数字化、网络化、集成化和智能化方向发展。Linux是免费使用和开源的类Unix操作系统,是一个基于POSIX和U

13、NIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。然而,随着技术的发展,使用Linux开发程序的人们都知道在Linux下最方便的开发工具Qt,它既可以开发GUI程式,也可用于开发非GUI程式,比如控制台工具和服务器。Qt是一款面向对象的框架,使用特殊的代码生成扩展以及一些宏,易于扩展,允许组件编程。使用Linux和QT最大的优势就是在于,Linux操作系统平台是一款更加接近于底层的一款操作系统平台,Linux以它的高效性和灵活性

14、而著称。它能够在个人计算机上实现全部的Unix特性,具有多任务、多用户的能力。Linux可在GNU公共许可权限下免费获得,是一个符合POSIX标准的操作系统。Linux操作系统软件包不仅包括完整的Linux操作系统,而且还包括了文本编辑器、高级语言编译器等应用软件。它还包括带有多个窗口管理器的X-Windows图形用户界面,如同我们使用Windows NT一样,允许我们使用窗口、图标和菜单对系统进行操作。因为它属于自由软件,用户不用支付任何费用就可以获得它和它的源代码,并且可以根据自己的需要对它进行必要的修改和无约束地继续传播。并且它具有Unix的全部功能,而且它受到广大计算机爱好者的喜爱,而

15、广大的计算机爱好者也是娱乐休闲游戏的主力军,所以选用Linux操作系统作为软件支持平台。对于编程工具QT而言,本次使用的开发工具叫做QtCreator,QtCreator 这款工具不仅能帮助用户更快速入门并运行项目,还可提高开发人员的工作效率。而且它使用强大的C+ 代码编辑器可快速编写代码,语法标识和代码完成功能输入时进行静态代码检验以及提示样式上下文相关的帮助代码折叠括号匹配和括号选择模式高级编辑功能。另外,使用浏览工具管理源代码,集成了领先的版本控制软件,包括 Git、Perforce 和 Subversion开放式文件,无须知晓确切的名称或位置搜索类和文件跨不同位置或文件沿用符号在头文件

16、和源文件,或在声明和定义之间切换。最主要的是为 Qt跨平台开发人员的需求而量身定制,因为它集成了特定于 Qt 的功能,如信号与槽 ,对Qt类结构可一目了然集成Qt Designer 可视化布局和格式构建器只需单击一下就可生成和运行Qt项目等有点,使得我们对软件的开发变得简单,易行。因此,在有了图像采集功能的视频监系统,使得这个系统就更加的完善和丰富。这个系统不仅可以起到监控的效果,而且在有需要的时候,将某一画面进行图像采集,这样就可以将视频转化成为图片。在保存方面这个特点就更加的显著了,毕竟视频的所占的空间是比图片要大很多,而且,整个视频不可能全部要保存下来,那么就有你需要的部分和你不需要的部

17、分,也有可能,你需要的部分是不连贯的。那这个时候截图的功能就可以起到这样的效果,既可以节省空间,又可以得到自己需要的东西。 在当今各种各样的图像采集软件层出不穷,说明图像采集软件的功能作用已被大众认可,相信在未来,会有更多的更加实用简洁的图像采集软件面市,更好的服务与大众。本文主要研究基于Linux下的V4L2在惠普HP6450b上实现图像采集系统的开发与实现。1.2 图集系统的研像采究发展在图像采集系统的初始研究,因为大多数所使用的硬件是基于CMOS芯片的摄像头,但是由于CMOS芯片只能捕获模拟信号,所以为了完成使用模拟摄像机的图像采集系统的研究,它也需要额外的处理,以获得数字信号的模拟信号

18、。早在研究过程中需要使用的电路芯片的设计他们自己的图像采集系统,通常这样的一个图像采集系统需要使用图像传感器,信号处理器,以及一个液晶显示帧存储器等硬件,CMOS摄像图像是由图像传感器电路的环境信号得到的,使用用一个信号处理器处理数字信号,其中每个帧的图像信号被存储在帧存储器中,并且最后这些信号是通过LCD技术显示。 随着人们对计算机科学与技术的重视,导致其快速发展,而采集卡已经成为图像采集系统硬件的组成部分,并逐步应用到图像采集系统,采用图像采集卡可以很容易地模拟摄像机的图像信号,处理时,采集卡软件界面非常轻松的应用到图像采集系统中去,所以使用的采集卡和模拟摄像头很容易地融入了图像采集系统中

19、,虽然模拟摄像机的图像采集技术已经非常成熟,易于实现,但图像采集速度慢,抗干扰能力不强,声环境噪声可能会导致图像采集不清楚,而且这种技术不是很容易操作。由于这些技术缺点的致命性,这种技术逐渐被淘汰。后来,相机技术收到巨大动力,飞速发展,开发出了数码摄像机,它采用USB接口,千兆以太网接口可用于高速数字相机,将收集到的信息转换成数字图像信号,你可以去直接连接到电脑上,这种技术不仅简化了系统的运行,而且其强大的抗干扰能力也使得图像采集系统采集的图像清晰,适用性强。随着高度集成和模块化系统的快速发展,在图像采集系统在数码相机上稳步发展,数码相机本身就可以实现图像的采集,而且软件系统的界面清晰,人机交

20、互能力很强,但他们需要合适的数码相机的驱动程序,从而连接电脑和数码摄像机,但是这些技术大部分都是基于国外软件技术之间的通信和数据传输,不符合我们的独立、创新的软件开发的要求,而且不符合一些设计的保密性,可扩展,性特殊环境的软件系统的要求,所以我们需要开发一个基于Linux的平台,一个更强大的扩展,安全性好,保密性强的自我图像采集系统。1.3 需求分析1.3.1 用户需求分析在社会的高速发展过程中,在生命第一的影响下,安全便成为了当代人们最关心的问题,针对这一现象,人们不断地探索如何确保安全,使得现在的监控工程为这方面做着不断地努力,这能使得我们的财产得到更好的安全保障,例如,如果我们有了摄像头

21、的监控系统,我们可以随时随地查看我们身边发生的一切些事情等等。现在,可以说监控摄像头在城市里面是无处不在,公交车上有,高速公路上有,宾馆里面有,甚至现在所在的地方也都有,摄像头监控的作用非常大,能够防止各种意外的发生,在人们意识到这样的便捷及安全之后,它便布到了人们所在的各个角落,甚至城市之外的各种地方也都有摄像头的存在,可以防止一些不法分子的阴谋得逞,防止类似这些严重危害到我们的财产和生命安全的事情发生。因此用户最需要的当然是可以看到监控的画面以及对监控画面的捕捉,以帮助我们能够更快的了解事情的真相,帮助人民警察维护社会的治安,为人类的发展贡献出自己的力量。1.3.2 功能需求分析根据用户需

22、求,可确定以下功能:(1)摄像头采集的图像传输到服务器端,用户可以通过客户端来对摄像头采集到的内容进行查看。(2)用户的客户端可以对传输到的视频进行图像捕捉。(3)捕捉到的图像应该可以按照用户的要求自定义捕捉到的图像的名称,并保存到相应的位置,以便客户来进行查看。1.4 可行性研究针对本项目,经过仔细的思考,服务器端可以使用Linux4video2的框架,前文已经提到了,v4l为Linux里的视频驱动提供了统一的接口,这使得Linux的开发人员能够调用应用程序统一的API函数,来操作不同的视频设备,极大简化了开发人员对视频系统的开发和维护的过程。在Linux中使用c语言来编写服务器端实在是再好

23、不过了。而客户端可以采用提供强大图形库的Qt来编写。而客户端与服务器端的通信则可以采用套接字和http协议来进行通信,将捕捉到的信息进行压缩,发送到客户端之后再对捕捉到的信息进行解析和实现,由此可见本项目是完全可行的。2 开发环境及主要技术2.1 开发环境操作系统:Linux程序主要语言:C,C+图形化界面平台:QT图片格式:jpeg2.2 语言和开发平台的选定科技是第一生产力,在互联网技术的高速发展中,嵌入式技术已经越来越纯熟,这使得开发的代价越来越低,基于嵌入式技术的成熟性和Linux系统的开源,稳定,等优势,嵌入式的相关技术逐渐走向了世界前端,在这样的技术背景下,完成本次设计的主要语言选

24、定了Linux下广泛应用的语言C语言,图形界面选择了有强大图形库的QT。2.2.1 C语言简介1972年,美国贝尔实验室的Dennis M. Ritchie推出了对当今世界影响特别深刻的C语言,C语言既具有低级语言的特点,又包含着高级语言的特点,C语言是一种计算机程序设计语言。1978年后,C语言受到了广大编程人员的喜爱,由于它的移植性,已先后被应用到各种机器上,C语言可以直接编写应用程序,编写不依赖硬件的应用程序,又系统语言,编写系统的逻辑。C语言处理数据的能力很强,系统软件再合适不过了,因此开发人员在嵌入式的相关项目上,十分青睐C语言。这里选取C语言开发服务器是由于C语言可以直接访问物理地

25、址,能直接操作和控制硬件,因此它既具有低级语言的许多重要功能,又具有高级语言的功能,可以像汇编语言那样操作位、字节和地址操作,而位,字节和地址是计算机中最基本的工作单元,可以用来编写系统软件。C语言所生成目标代码质量很高,程序执行效率较高,所以本次的服务器段选用C语言为使用语言。2.2.2 Qt简介Tmlltech公司有一款影响了大部分C语言程序员的发展的一款软件-Qt,它是一个多平台的基于C+图形用户界面的应用程序框架。它为开发者们提供了实现应用程序可视化,并达到符合客户审美的图形化界面所需的主要功能。Qt的设计是完全面向对象的,很容易针对客户需求对其进行扩展,并且可以进行组件编程。1996

26、年早期,Qt正式商业化,而那时,它已经悄然成为了各种强大的应用程序的开发语言,成为了成功的开发程序的基础。当时,Linux发型的版本中有一个重要的标准组件-KDE,而Qt当时还是许多流行的Linux版本的桌面环境KDE的基础。Qt是由几百个C+类构成的一个C+工具包,我们平时编写程序的时候,如果充分能够调用这些类,就可以达到简捷,直击要害的效果。QT是基于C+构造,所以具有面向对象的特点。Qt是开源项目,小型公司在企业级开发的基础上不需要有太大的压力,没有大成本的投入,这使得许多开发技术人员获得了简便而友好的集成开发环境,其实,对编程人员吸引最大的是Qt那强大的图像界面库的提供。本项目选取Qt

27、最重要的一点,就是他的信号与槽的机制,正是信号槽的机制,首先是信号,当某个信号对其客户或所有者发生的内部状态发生改变,信号被一个对象发射。只有 定义过这个信号的类及其派生类能够发射这个信号。当一个信号被发射时,与其相关联的槽将被立刻执行,就象一个正常的函数调用一样。信号-槽机制完全独立于任何GUI事件循环。只有当所有的槽返回以后发射函数(emit)才返回。 如果存在多个槽与某个信号相关联,那么,当这个信号被发射时,这些槽将会一个接一个地 执行,但是它们执行的顺序将会是随机的、不确定的,我们不能人为地指定哪个先执行、哪 个后执行。槽是普通的C+成员函数,可以被正常调用,它们唯一的特殊性就是很多信

28、号可以与其相关联。当与其关联的信号被发射时,这个槽就会被调用。槽可以有参数,但槽的参数不能有缺省值。既然槽是普通的成员函数,因此与其它的函数一样,它们也有存取权限。槽的存取权限决定了谁能够与其相关联。同普通的C+成员函数一样,槽函数也分为三种类型,即public slots、private slots和protected slots。public slots:在这个区内声明的槽意味着任何对象都可将信号与之相连接。这对于组件编程非常有用,你可以创建彼此互不了解的对象,将它们的信号与槽进行连接以便信息能够正确的传递。protected slots:在这个区内声明的槽意味着当前类及其子类可以将信号与

29、之相连接。这适用于那些槽,它们是类实现的一部分,但是其界面接口却面向外部。private slots:在这个区内声明的槽意味着只有类自己可以将信号与之相连接。这适用于联系非常紧密的类。槽也能够声明为虚函数,这也是非常有用的。本项目实现人与机器的交互,就是靠的信号与槽的机制,这使得任何一类的对象可以和其它对象进行通讯。Qt的信号与槽均以函数形式出现,Qt的窗口部件有很多预定义的信号,但我们也可以通过继承来加入我们自己的信号。槽就是一个可以被调用处理特定信号的函数。Qt的窗口部件有很多预定义的槽,但是为了项目的明朗和个人的习惯一般都加入自己的槽函数,这样你就可以处理你所需要处理的信号。我们可以用c

30、onnect()函数对特定的信号和槽函数进行链接。当对象的内部状态发生改变,信号就被发射。从某种意义上讲,它们是对外面的世界发送着信号,影响着外面的情形。这就是所有的对象之间通讯的基本原理,信号的发送不依赖于任何机制,只要达到了自己的目的就会有信号发出,而不必担心这个信号是不是有对应的处理和接收者。而当一个信号被发射,只要他有链接的槽,则它所连接的槽会被立即执行,就像一个普通函数调用一样。信号槽机制完全不依赖于任何一种图形用户界面的事件回路。当所有的槽都返回后发射的信号也将返回。信号与槽机制并不要求类与类之间有互相的联系,这样就可以相对容易的开发出代码可高重用的类。信号和槽的机制是类型安全的:

31、一个信号的签名必须与它的接收槽的签名相匹配。实际上一个槽的签名可以比它接收的信号的签名少,因为它可以忽略额外的签名。因为签名是一致的,编译器就可以帮助我们检测类型不匹配。它以警告的方式报告类型错误,而不会使系统产生崩溃。信号和槽是宽松地联系在一起的:一个发射信号的类不用知道也不用注意哪个槽要接收这个信号。Qt的信号和槽的机制可以保证如果你把一个信号和一个槽连接起来,槽会在正确的时间使用信号的参数而被调用。信号和槽可以使用任何数量、任何类型的参数。它们是完全类型安全的:不会再有回调核心转储(coredump)。你可以把许多信号和你所希望的单一槽相连,并且一个信号也可以和你所期望的许多槽相连。把一

32、个信号和另一个信号直接相连也是可以的。信号与槽的工作机制如图2-1所示: 图2-1 信号与槽的工作机制如果一个类要使用信号与槽机制,它就必须是从QObject或QObject的子类继承,而且类的定义必须加上Q_OBJECT宏。signals、slots和emit是Qt特有的关键字,分别用来表示信号、槽、和发送信号,移除这些关键字和预处理程序,就可以使用标准的C+编译器。槽同其他函数一样也具有访问权限,只是槽的访问权限决定了谁可以和它相连,用通俗的话解释上述几个槽函数就是,publicslots:包含了任何信号都可以相连的槽 。protectedslots:包含了只有这个类和它的子类的信号才能连

33、接的槽。这就是说这些槽只是类的实现的一部分,而不是它和外界的接口。privateslots:包含了只有这个类本身的信号可以连接的槽,甚至它的子类都没有获得连接的权利。Qt中的元对象系统是用来处理对象间通讯的信号槽机制、运行时的类型信息和动态属性系统。它基于下列三类:QObject类、类声明中的私有段中的Q_OBJECT宏、元对象编译器(moc)。moc读取C+源文件。如果它发现其中包含一个或多个类的声明中含有Q_OBJECT宏,它就会给含有Q_OBJECT宏的类生成另一个含有元对象代码的C+源文件。这个生成的源文件可以被类的源文件包含(#include)到或者和这个类的实现一起编译和连接。由此

34、可见本项目在Linux中,选用QT做图形化界面是非常正确的。2.2.3 Linux简介Linux是一款免费的操作系统,用户可以通过网络或其他途径免费获得,并可以任意修改其源代码。这是其他的操作系统所做不到的。正是由于这一点,来自全世界的无数程序员参与了Linux的修改、编写工作,程序员可以根据自己的兴趣和灵感对其进行改变,这让Linux吸收了无数程序员的精华,不断壮大。经过学习,对Linux有了比较深入的了解,其中第一点,一切都是文件;第二点,每个软件都有确定的用途。其中第一条详细来讲就是系统中的所有都归结为一个文件,包括命令、硬件和软件设备、操作系统、进程等等对于操作系统内核而言,都被视为拥

35、有各自特性或类型的文件。其中主要的文件类型有:(1)纯文本文件(ASCII):这是Unix系统中最多的一种文件类型,之所以称为纯文本文件,是因为内容可以直接读到的数据,例如数字、字母等等。设 置文件几乎都属于这种文件类型。举例来说,使用命令“cat /.bashrc”就可以看到该文件的内容(cat是将文件内容读出来)。(2)二进制文件(binary):系统其实仅认识且可以执行二进制文件(binary file)。Linux中的可执行文件(脚本,文本方式的批处理文件不算)就是这种格式的。举例来说,命令cat就是一个二进制文件。(3)数据格式的文件(data):有些程序在运行过程中,会读取某些特定

36、格式的文件,那些特定格式的文件可以称为数据文件(data file)。举例来说,Linux在用户登入时,都会将登录数据记录在 /var/log/wtmp文件内,该文件是一个数据文件,它能通过last命令读出来。但使用cat时,会读出乱码。因为它是属于一种特殊格式的文件。目录文件(directory):就是目录,第一个属性为 d,例如 drwxrwxrwx。连接文件(link):类似Windows下面的快捷方式。第一个属性为 l,例如 lrwxrwxrwx。设备与设备文件(device):与系统外设及存储等相关的一些文件,通常都集中在 /dev目录。通常又分为两种:块设备文件:就是存储数据以供系

37、统存取的接口设备,简单而言就是硬盘。例如一号硬盘的代码是 /dev/hda1等文件。第一个属性为 b。字符设备文件:即串行端口的接口设备,例如键盘、鼠标等等。第一个属性为 c。套接字(sockets):这类文件通常用在网络数据连接。可以启动一个程序来监听客户端的要求,客户端就可以通过套接字来进行数据通信。第一个属性为 s,最常在 /var/run目录中看到这种文件类型。管道(FIFO,pipe):FIFO也是一种特殊的文件类型,它主要的目的是,解决多个程序同时存取一个文件所造成的错误。FIFO是first-in-first-out(先进先出)的缩写。第一个属性为 p。至于说Linux是基于Un

38、ix的,很大程度上也是因为这两者的基本思想十分相近。Linux支持多用户,各个用户对于自己的文件设备有自己特殊的权利,保证了各用户之间互不影响。多任务则是现在电脑最主要的一个特点,Linux可以使多个程序同时并独立地运行。 Linux可以运行在多种硬件平台上,如具有x86、680x0、SPARC、Alpha等处理器的平台。此外Linux还是一种嵌入式操作系统,可以运行在掌上电脑、机顶盒或游戏机上。2001年1月份发布的Linux 2.4版内核已经能够完全支持Intel 64位芯片架构。同时Linux也支持多处理器技术。多个处理器同时工作,使系统性能大大提高。2.3 V4L2架构2.3.1 概述

39、在v4l2出现之前,Linux内核为提供了视频设备的一个子系统即V4L,这里的V4L为Linux系统中的视频驱动提供了统一的接口,可以使得应用程序调用统一的API函数来操作不同的视频设备,极大简化了开发人员对视频系统的开发和维护的过程。但是要知道,V4L还是有很多不足的地方,终于在Bill Dirks等人在1998年对其进行重新设计和开发,并取名为V4L2,经过长时间的发展,于2002年11月,融入到了Linux内核的主干之中。Video4Linux2最早出现在Linux2.5.46版本。对比V4L2与V4L,v4l2支持的硬件设备更多,而且还具有更好的扩展性和灵活性,他们希望Linux能够支

40、持更多的设备开始着手设计V4l2,在这些所有支持的设备之中只有一小部分是真正意义上的视频设备。因为V4l2是针对v4l进行了彻底改造之后才出来的产物,这样造成的后果也是显而易见的,在兼容性方面v4l2与v4l是相对的,不兼容的。之前的应用程序需要从新开发,而且此框架只能运行在Linux操作系统之上。在Linux系统中,所有的外部设备都是文件的形式存在于系统中的,我们称外部设备为设备文件。应用程序可以通过直接访问这些文件来实现对相应设备的操作和控制。本文使用的V4L2视频设备的设备文件为/dev目录下的video0即是本机自带的摄像头。2.3.2 系统调用本文的Linux编程中,使用的是ioct

41、l()函数来对设备的I/O通道进行操作,v4l2的大部分功能都是通过调用ioctl()函数来完成的,ioctl()的基本语法为int ioctl (int fd, unsigned long int request, ) ;fd:设备描述符,即刚才使用open()函数打开视频通道后所返回的视频设备号;request:控制命令。接下来介绍本项目中用到的命令类型:(1)VIDIOC_ENUM_FMT:用来获取本机视频驱动支持的视频格式;VIDIOC_S_FMT:设置本机驱动捕获格式;VIDIOC_G_FMT:读取本机驱动捕获格式,主要是图像的宽,高、每像素所占比特和像素格式如yuv。本程序中设置的

42、数据类型:struct v4l2_format。(2)VIDIOC_CROPCAP:查询驱动的修剪能力;VIDIOC_S_CROP:设置视频信号的边框;VIDIOC_G_CROP:读取视频信号的边框,主要是设置采集视频的视角和位置。(3)VIDIOC_ REQBUFS,用于内存映射,这个命令可以在驱动层申请多个缓冲区,存放采集到的图像。但是用户需要使用mmap将其映射到用户空间才能访问。本项目中数据类型为struct v4l2_requestbuffers。(4)VIDIOC_QUERYBUF,用于内存映射,这个命令可以查询由VIDIOC_ REQBUFS申请到的缓冲区的大小和偏移地址,而申请

43、到的缓冲区的大小和偏移地址会作为参数传给mmap。即把VIDIOC_REQBUFS中分配的数据缓存转换成物理地址。本项目中数据类型为struct v4l2_buffer。(5)VIDIOC_QBUF,用于内存映射,该命令的作用是将VIDIOC_ REQBUFS申请的缓冲区放入采集队列,只有这样驱动才会将采集到的数据写入缓冲区。本项目中数据结构为struct v4l2_buffer。(6)VIDIOC_ DQBUF,用于内存映射,该命令的作用是将填充数据的一个缓冲区取出队列,这样驱动就不会再向这个缓冲区写数据,应用程序可以对该缓冲区的数据进行处理,需要注意的是,应用程序处理完数据后,需要使用VI

44、DIOC_QBUF重新将该缓冲区放入采集队列。(7) VIDIOC_STREAMON:开始显示采集到的视频函数; VIDIOC_STREAMOFF:结束显示视频的函数,这两个命令分别应用于启动采集视频数据和停止视频数据输出。(8)其他结构体还有:VIDIOC_QUERYSTD:检查当前视频设备支持的标准,例如PAL或NTSC。VIDIOC_G_STD 获取视频标准。VIDIOC_S_STD 设置视频标准。VIDIOC_REQBUFS:分配内存。VIDIOC_QUERYBUF:把VIDIOC_REQBUFS中分配的数据缓存转换成物理地址。VIDIOC_QUERYCAP:查询驱动功能。2.3.3

45、数据交换操作系统一般会把Linux系统使用的内存划分成两类:用户空间和内核空间,用户空间由应用程序管理,内核空间由操作系统管理。应用程序可以直接访问用户内存的地址,但是内核空间里存放的数据是供内核访问的代码和数据,用户是不能直接访问的。这里v4l2采集视频的数据存储到了内核空间中,也就是意味着用户不可以直接访问这段内存,必须通过某些方法来转换地址,达到应用程序可以访问到的目的。首先可以确定的是,V4L2支持三种数据交换的模式,这三种模式分别是直接读取设备文件方式、用户指针方式以及mmap映射方式。首先要知道这三种模式的工作原理:(1)直接读取设备文件方式直接调用read()和write()函数

46、进行采集到的数据的读入和输出,这种方法一般都配合select()使用。read()、write()函数需要在用户空间和内核空间不断的进行数据的拷贝,这样的后果就是会占用了大量用户内存空间,效率不高,浪费资源,故本项目不采用这样的方法。(2)用户指针方式这样的方法,首先应用程序需要申请缓冲区,然后把申请到的缓冲区传给驱动程序,驱动会把它当成缓冲区,这样就实现了内存的共享。内存的地址由应用程序自己分配。这点需要在结构体里将memory字段设置成V4L2_MEMORY_USERPTR。否则不能使用。(3)内存映射方式这种方式与用户指针方式类似。首先需要在内核空间申请多个缓冲区,然后将每个缓冲区通过m

47、map映射到用户空间,选择共享模式,这样驱动和应用程序就能共享这些缓冲区,即把设备里的内存映射到应用程序中的内存空间,直接处理设备内存,这样在进行数据处理时不需拷贝数据,大大提高执行效率。mmap工作方式,如图2-2所示: 图2-2 mmap工作方式经过对比可以发现,内存映射的方式明显提高了数据处理的效率,所以本程序选取的是内存映射的方式进行数据交换。2.3.4 处理采集数据V4L2有一个数据缓存区,存放req.count数量的缓存数据。数据缓存采用FIFO的方式,当应用程序调用缓存数据时,使用VIDIOC_DQBUF,使缓存队列将最先采集到的视频数据缓存送出,使用VIDIOC_QBUF,将已经发送出的缓冲区重新送进采集队列,并重新采集一张视频数据。2.4 socket服务2.4.1 socket概述套接字,是支持TCP/IP网络通信协议的基本操作单元,它可以看成是几个不同主机之间的进程进行双向通信的端点,简单的说socket就是通信的双方的一种约定方式,用套接字中的相关函数去完成通信的过程。套接字主要有3个参数来区分不同应用程序的网络通信和连接:通信的目的地IP地址、使用的传输层协议(TCP或UD

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 办公文档 > 其他范文


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号