嵌入式摄像头抓图系统设计与实现_第1页
嵌入式摄像头抓图系统设计与实现_第2页
嵌入式摄像头抓图系统设计与实现_第3页
嵌入式摄像头抓图系统设计与实现_第4页
嵌入式摄像头抓图系统设计与实现_第5页
已阅读5页,还剩52页未读 继续免费阅读

下载本文档

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

文档简介

嵌入式摄像头抓图系统设计与实现摘要随着现代科技的飞速发展,我们越来越重视实时通讯,时时刻刻的了解身边发生的一切,这样我们就需要摄像头和LINUX来帮助我们实现这一切。本项目以实现嵌入式的摄像头抓图系统为核心,使用V4L2框架完成图像采集。VIDEO4LINUX2是基于LINUX系统进行图像和影音开发的应用编程接口。本项目的实现过程服务器端,需要使用C语言,并结合V4L2框架,遵守V4L2的流程,先获取视频设备支持的标准,后设置捕获的视频格式,然后为图像数据分配内存空间,使用MMAP将内核空间映射出来,使得应用程序能够访问内核空间,保存捕获的数据,将数据发送到用户空间。使用SOCKET建立网络连接,创建SOCKET,绑定,监听,接受用户请求。使用视频传输HTTP协议,程序运行时加入JPEG库,通过转换格式将YUV转换成JPEG,并使用HUFFMAN函数解码打印图片。客户端方面,使用QT实现客户端的图形化界面,使用QTCPSOCKET,建立连接,连接到服务器,不停地发送和接受数据,完成视频显示,图像采集,暂停的功能。最后,本文给出了符合V4L2框架的本机摄像头图像数据采集功能,并转换为JPEG格式保存。最后,本系统可以将捕捉到的画面显示在屏幕上并且可以实现抓图的功能。关键词LINUX;V4L2;图像采集;摄像头;显示EMBEDDEDCAMERACAPTURESYSTEMDESIGNANDIMPLEMENTATIONABSTRACTWITHTHERAPIDDEVELOPMENTOFMODERNTECHNOLOGY,WEAREINCREASINGEMPHASISONREALTIMECOMMUNICATION,UNDERSTANDINGEVERYTHINGHAPPENINGAROUNDALLTHETIME,SOWENEEDACAMERAANDLINUXTOHELPUSACHIEVETHISTHEPROJECTTOIMPLEMENTANEMBEDDEDCAMERACAPTURESYSTEMASTHECORE,USINGV4L2FRAMEWORKOFIMAGEACQUISITIONVIDEO4LINUX2ISANAPPLICATIONPROGRAMMINGINTERFACEUNDERLINUXTODEVELOPVIDEOANDIMAGEIMPLEMENTATIONPROCESSOFTHEPROJECTTHEPROGRAMCAMERACAPTURESYSTEMBASEDONTHEEMBEDDED,USECLANGUAGETOACHIEVETHESERVERSIDEANDUSEV4L2FRAMEWORKFIRST,GETTHESTANDARDOFAVIDEODEVICESUPPORT,THENSETTHEFORMATOFTHEVIDEOCAPTURE,THENALLOCATEMEMORYFORTHEIMAGE,ADDRESSTRANSLATIONMAPPINGSBYUSINGMMAP,SAVEDATAANDTHENSENDSTHEDATATOTHEUSERSPACEESTABLISHANETWORKCONNECTIONBYUSINGSOCKET,CREATEASOCKET,BINDING,LISTENING,ANDRECEIVINGAUSERREQUEST,USINGTHEHTTPPROTOCOLFORVIDEOTRANSMISSION,ADDINGJPEGLIBRARYINTHERUNINGTIME,CONVERTINGYUVINTOJPEGFORMATBYTHETECHNOLOGYOFCONVERTINGANDPRINTPICTURESBYUSINGHUFFMANDECODINGFUNCTIONUSINGQTCREATORGRAPHICALINTERFACETOACHIEVECLIENT,THECLIENTUSINGQTCPSOCKETTOGETACONNECTION,ANDLINKTHESERVER,CONSTANTLYSENDINGANDRECEIVINGDATA,ANDTHENCOMPLETETHEFUCTIONOFVIDEODISPLAY,IMAGECAPTUREANDSTOPINTHISPAPER,ITOFFERTHEGATHERINGFUNCTIONOFCAMERAIMAGETHATCONFORMSTHEFRAMEWORKOFV4L2ANDCONVERTTOTHEJPEGTOSAVEFINALLY,THESYSTEMCANCAPTURETHESCREENDISPLAYONTHESCREENANDCANCAPTUREFUNCTIONALITYKEYWORDSLINUXV4L2CAPTUREPICTURECAMERADISPLAY目录摘要IABSTRACTII1绪论111课题背景112图集系统的研像采究发展213需求分析3131用户需求分析3132功能需求分析314可行性研究32开发环境及主要技术421开发环境422语言和开发平台的选定4221C语言简介4222QT简介423V4L2架构8231概述8232系统调用8233数据交换9234处理采集数据1024SOCKET服务10241SOCKET概述10242SOCKET工作方式1125HTTP协议11251HTTP概述11252HTTP特点12253本文所用到的HTTP协议报文123概要设计1331服务器端1432客户端144详细设计1641V4L2框架图像采集1642SOCKET套接字的创建19421服务端20422客户端与服务器的SOCKET连接2143客户端读取HTTP协议传输的图片2144客户端使用的信号与槽函数23441START按钮23442PHOTO按钮23443STOP按钮24444QUIT按钮2445图片的输出24451HUFFMAN函数24452JPEG库25461QBITMAP25462QPICTURE25463QIMAGE25464QPIXMAP265测试及运行结果2851软件测试目标2852软件测试及运行的结果28结论33参考文献34致谢35外文原文36中文翻译461绪论11课题背景在当今的世界中,各项技术都有了突飞猛进的发展,而嵌入式相关技术、相关多媒体的技术和各种各样的网络技术有了快速稳步的发展,其中基于嵌入式的视频压缩编码技术和网络的传输控制已经得到了综合应用,已经在数字化网络视频采集监控领域有了立足之地,成为了这种技术的核心。由于系统的实时性,交互性,高速传输性,高质量传输的性能摄像头系统已经得到了广泛的使用,比如现在使用的网络视频聊天,安保监控,网络视频会议系统,视频电话等。由此可见,本课题的研究,对开发简单,简便的视频传输终端设备有一定的价值。这里LINUX因为其开源、稳定性高、移植性较好、对网络的强大支持和其对文件系统的支持和操作简易等特点,受到了广大编程人员的青睐,频繁的出现在各种嵌入式设备的开发当中。到目前为止视频监控系统在电信、银行、交通、电力、水利、石化、智能大厦等许多领域都有着广泛的应用。日前,基于PC的传统视频监控系统在上述的这些领域中使用的比较广泛,这种系统虽然功能较强,但是它的稳定性不好、视频前端较为复杂、可靠性较差、功耗高。然而,随着高性能嵌入式处理器和网络技术的快速发展,嵌入式网络视频监控系统将会得到广泛应用,这种系统把图像采集、视频压缩和网络功能集中在一起,可以直接连入以太网,具有体积小、功耗低、稳定性高、成本低等优点。相信在以后随着计算机技术、多媒体技术和网络技术的发展与提高,视频监控系统正向数字化、网络化、集成化和智能化方向发展。LINUX是免费使用和开源的类UNIX操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和64位硬件。LINUX继承了UNIX以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。然而,随着技术的发展,使用LINUX开发程序的人们都知道在LINUX下最方便的开发工具QT,它既可以开发GUI程式,也可用于开发非GUI程式,比如控制台工具和服务器。QT是一款面向对象的框架,使用特殊的代码生成扩展以及一些宏,易于扩展,允许组件编程。使用LINUX和QT最大的优势就是在于,LINUX操作系统平台是一款更加接近于底层的一款操作系统平台,LINUX以它的高效性和灵活性而著称。它能够在个人计算机上实现全部的UNIX特性,具有多任务、多用户的能力。LINUX可在GNU公共许可权限下免费获得,是一个符合POSIX标准的操作系统。LINUX操作系统软件包不仅包括完整的LINUX操作系统,而且还包括了文本编辑器、高级语言编译器等应用软件。它还包括带有多个窗口管理器的XWINDOWS图形用户界面,如同我们使用WINDOWSNT一样,允许我们使用窗口、图标和菜单对系统进行操作。因为它属于自由软件,用户不用支付任何费用就可以获得它和它的源代码,并且可以根据自己的需要对它进行必要的修改和无约束地继续传播。并且它具有UNIX的全部功能,而且它受到广大计算机爱好者的喜爱,而广大的计算机爱好者也是娱乐休闲游戏的主力军,所以选用LINUX操作系统作为软件支持平台。对于编程工具QT而言,本次使用的开发工具叫做QTCREATOR,QTCREATOR这款工具不仅能帮助用户更快速入门并运行项目,还可提高开发人员的工作效率。而且它使用强大的C代码编辑器可快速编写代码,语法标识和代码完成功能输入时进行静态代码检验以及提示样式上下文相关的帮助代码折叠括号匹配和括号选择模式高级编辑功能。另外,使用浏览工具管理源代码,集成了领先的版本控制软件,包括GIT、PERFORCE和SUBVERSION开放式文件,无须知晓确切的名称或位置搜索类和文件跨不同位置或文件沿用符号在头文件和源文件,或在声明和定义之间切换。最主要的是为QT跨平台开发人员的需求而量身定制,因为它集成了特定于QT的功能,如信号与槽,对QT类结构可一目了然集成QTDESIGNER可视化布局和格式构建器只需单击一下就可生成和运行QT项目等有点,使得我们对软件的开发变得简单,易行。因此,在有了图像采集功能的视频监系统,使得这个系统就更加的完善和丰富。这个系统不仅可以起到监控的效果,而且在有需要的时候,将某一画面进行图像采集,这样就可以将视频转化成为图片。在保存方面这个特点就更加的显著了,毕竟视频的所占的空间是比图片要大很多,而且,整个视频不可能全部要保存下来,那么就有你需要的部分和你不需要的部分,也有可能,你需要的部分是不连贯的。那这个时候截图的功能就可以起到这样的效果,既可以节省空间,又可以得到自己需要的东西。在当今各种各样的图像采集软件层出不穷,说明图像采集软件的功能作用已被大众认可,相信在未来,会有更多的更加实用简洁的图像采集软件面市,更好的服务与大众。本文主要研究基于LINUX下的V4L2在惠普HP6450B上实现图像采集系统的开发与实现。12图集系统的研像采究发展在图像采集系统的初始研究,因为大多数所使用的硬件是基于CMOS芯片的摄像头,但是由于CMOS芯片只能捕获模拟信号,所以为了完成使用模拟摄像机的图像采集系统的研究,它也需要额外的处理,以获得数字信号的模拟信号。早在研究过程中需要使用的电路芯片的设计他们自己的图像采集系统,通常这样的一个图像采集系统需要使用图像传感器,信号处理器,以及一个液晶显示帧存储器等硬件,CMOS摄像图像是由图像传感器电路的环境信号得到的,使用用一个信号处理器处理数字信号,其中每个帧的图像信号被存储在帧存储器中,并且最后这些信号是通过LCD技术显示。随着人们对计算机科学与技术的重视,导致其快速发展,而采集卡已经成为图像采集系统硬件的组成部分,并逐步应用到图像采集系统,采用图像采集卡可以很容易地模拟摄像机的图像信号,处理时,采集卡软件界面非常轻松的应用到图像采集系统中去,所以使用的采集卡和模拟摄像头很容易地融入了图像采集系统中,虽然模拟摄像机的图像采集技术已经非常成熟,易于实现,但图像采集速度慢,抗干扰能力不强,声环境噪声可能会导致图像采集不清楚,而且这种技术不是很容易操作。由于这些技术缺点的致命性,这种技术逐渐被淘汰。后来,相机技术收到巨大动力,飞速发展,开发出了数码摄像机,它采用USB接口,千兆以太网接口可用于高速数字相机,将收集到的信息转换成数字图像信号,你可以去直接连接到电脑上,这种技术不仅简化了系统的运行,而且其强大的抗干扰能力也使得图像采集系统采集的图像清晰,适用性强。随着高度集成和模块化系统的快速发展,在图像采集系统在数码相机上稳步发展,数码相机本身就可以实现图像的采集,而且软件系统的界面清晰,人机交互能力很强,但他们需要合适的数码相机的驱动程序,从而连接电脑和数码摄像机,但是这些技术大部分都是基于国外软件技术之间的通信和数据传输,不符合我们的独立、创新的软件开发的要求,而且不符合一些设计的保密性,可扩展,性特殊环境的软件系统的要求,所以我们需要开发一个基于LINUX的平台,一个更强大的扩展,安全性好,保密性强的自我图像采集系统。13需求分析131用户需求分析在社会的高速发展过程中,在生命第一的影响下,安全便成为了当代人们最关心的问题,针对这一现象,人们不断地探索如何确保安全,使得现在的监控工程为这方面做着不断地努力,这能使得我们的财产得到更好的安全保障,例如,如果我们有了摄像头的监控系统,我们可以随时随地查看我们身边发生的一切些事情等等。现在,可以说监控摄像头在城市里面是无处不在,公交车上有,高速公路上有,宾馆里面有,甚至现在所在的地方也都有,摄像头监控的作用非常大,能够防止各种意外的发生,在人们意识到这样的便捷及安全之后,它便布到了人们所在的各个角落,甚至城市之外的各种地方也都有摄像头的存在,可以防止一些不法分子的阴谋得逞,防止类似这些严重危害到我们的财产和生命安全的事情发生。因此用户最需要的当然是可以看到监控的画面以及对监控画面的捕捉,以帮助我们能够更快的了解事情的真相,帮助人民警察维护社会的治安,为人类的发展贡献出自己的力量。132功能需求分析根据用户需求,可确定以下功能(1)摄像头采集的图像传输到服务器端,用户可以通过客户端来对摄像头采集到的内容进行查看。(2)用户的客户端可以对传输到的视频进行图像捕捉。(3)捕捉到的图像应该可以按照用户的要求自定义捕捉到的图像的名称,并保存到相应的位置,以便客户来进行查看。14可行性研究针对本项目,经过仔细的思考,服务器端可以使用LINUX4VIDEO2的框架,前文已经提到了,V4L为LINUX里的视频驱动提供了统一的接口,这使得LINUX的开发人员能够调用应用程序统一的API函数,来操作不同的视频设备,极大简化了开发人员对视频系统的开发和维护的过程。在LINUX中使用C语言来编写服务器端实在是再好不过了。而客户端可以采用提供强大图形库的QT来编写。而客户端与服务器端的通信则可以采用套接字和HTTP协议来进行通信,将捕捉到的信息进行压缩,发送到客户端之后再对捕捉到的信息进行解析和实现,由此可见本项目是完全可行的。2开发环境及主要技术21开发环境操作系统LINUX程序主要语言C,C图形化界面平台QT图片格式JPEG22语言和开发平台的选定科技是第一生产力,在互联网技术的高速发展中,嵌入式技术已经越来越纯熟,这使得开发的代价越来越低,基于嵌入式技术的成熟性和LINUX系统的开源,稳定,等优势,嵌入式的相关技术逐渐走向了世界前端,在这样的技术背景下,完成本次设计的主要语言选定了LINUX下广泛应用的语言C语言,图形界面选择了有强大图形库的QT。221C语言简介1972年,美国贝尔实验室的DENNISMRITCHIE推出了对当今世界影响特别深刻的C语言,C语言既具有低级语言的特点,又包含着高级语言的特点,C语言是一种计算机程序设计语言。1978年后,C语言受到了广大编程人员的喜爱,由于它的移植性,已先后被应用到各种机器上,C语言可以直接编写应用程序,编写不依赖硬件的应用程序,又系统语言,编写系统的逻辑。C语言处理数据的能力很强,系统软件再合适不过了,因此开发人员在嵌入式的相关项目上,十分青睐C语言。这里选取C语言开发服务器是由于C语言可以直接访问物理地址,能直接操作和控制硬件,因此它既具有低级语言的许多重要功能,又具有高级语言的功能,可以像汇编语言那样操作位、字节和地址操作,而位,字节和地址是计算机中最基本的工作单元,可以用来编写系统软件。C语言所生成目标代码质量很高,程序执行效率较高,所以本次的服务器段选用C语言为使用语言。222QT简介TMLLTECH公司有一款影响了大部分C语言程序员的发展的一款软件QT,它是一个多平台的基于C图形用户界面的应用程序框架。它为开发者们提供了实现应用程序可视化,并达到符合客户审美的图形化界面所需的主要功能。QT的设计是完全面向对象的,很容易针对客户需求对其进行扩展,并且可以进行组件编程。1996年早期,QT正式商业化,而那时,它已经悄然成为了各种强大的应用程序的开发语言,成为了成功的开发程序的基础。当时,LINUX发型的版本中有一个重要的标准组件KDE,而QT当时还是许多流行的LINUX版本的桌面环境KDE的基础。QT是由几百个C类构成的一个C工具包,我们平时编写程序的时候,如果充分能够调用这些类,就可以达到简捷,直击要害的效果。QT是基于C构造,所以具有面向对象的特点。QT是开源项目,小型公司在企业级开发的基础上不需要有太大的压力,没有大成本的投入,这使得许多开发技术人员获得了简便而友好的集成开发环境,其实,对编程人员吸引最大的是QT那强大的图像界面库的提供。本项目选取QT最重要的一点,就是他的信号与槽的机制,正是信号槽的机制,首先是信号,当某个信号对其客户或所有者发生的内部状态发生改变,信号被一个对象发射。只有定义过这个信号的类及其派生类能够发射这个信号。当一个信号被发射时,与其相关联的槽将被立刻执行,就象一个正常的函数调用一样。信号槽机制完全独立于任何GUI事件循环。只有当所有的槽返回以后发射函数(EMIT)才返回。如果存在多个槽与某个信号相关联,那么,当这个信号被发射时,这些槽将会一个接一个地执行,但是它们执行的顺序将会是随机的、不确定的,我们不能人为地指定哪个先执行、哪个后执行。槽是普通的C成员函数,可以被正常调用,它们唯一的特殊性就是很多信号可以与其相关联。当与其关联的信号被发射时,这个槽就会被调用。槽可以有参数,但槽的参数不能有缺省值。既然槽是普通的成员函数,因此与其它的函数一样,它们也有存取权限。槽的存取权限决定了谁能够与其相关联。同普通的C成员函数一样,槽函数也分为三种类型,即PUBLICSLOTS、PRIVATESLOTS和PROTECTEDSLOTS。PUBLICSLOTS在这个区内声明的槽意味着任何对象都可将信号与之相连接。这对于组件编程非常有用,你可以创建彼此互不了解的对象,将它们的信号与槽进行连接以便信息能够正确的传递。PROTECTEDSLOTS在这个区内声明的槽意味着当前类及其子类可以将信号与之相连接。这适用于那些槽,它们是类实现的一部分,但是其界面接口却面向外部。PRIVATESLOTS在这个区内声明的槽意味着只有类自己可以将信号与之相连接。这适用于联系非常紧密的类。槽也能够声明为虚函数,这也是非常有用的。本项目实现人与机器的交互,就是靠的信号与槽的机制,这使得任何一类的对象可以和其它对象进行通讯。QT的信号与槽均以函数形式出现,QT的窗口部件有很多预定义的信号,但我们也可以通过继承来加入我们自己的信号。槽就是一个可以被调用处理特定信号的函数。QT的窗口部件有很多预定义的槽,但是为了项目的明朗和个人的习惯一般都加入自己的槽函数,这样你就可以处理你所需要处理的信号。我们可以用CONNECT函数对特定的信号和槽函数进行链接。当对象的内部状态发生改变,信号就被发射。从某种意义上讲,它们是对外面的世界发送着信号,影响着外面的情形。这就是所有的对象之间通讯的基本原理,信号的发送不依赖于任何机制,只要达到了自己的目的就会有信号发出,而不必担心这个信号是不是有对应的处理和接收者。而当一个信号被发射,只要他有链接的槽,则它所连接的槽会被立即执行,就像一个普通函数调用一样。信号槽机制完全不依赖于任何一种图形用户界面的事件回路。当所有的槽都返回后发射的信号也将返回。信号与槽机制并不要求类与类之间有互相的联系,这样就可以相对容易的开发出代码可高重用的类。信号和槽的机制是类型安全的一个信号的签名必须与它的接收槽的签名相匹配。实际上一个槽的签名可以比它接收的信号的签名少,因为它可以忽略额外的签名。因为签名是一致的,编译器就可以帮助我们检测类型不匹配。它以警告的方式报告类型错误,而不会使系统产生崩溃。信号和槽是宽松地联系在一起的一个发射信号的类不用知道也不用注意哪个槽要接收这个信号。QT的信号和槽的机制可以保证如果你把一个信号和一个槽连接起来,槽会在正确的时间使用信号的参数而被调用。信号和槽可以使用任何数量、任何类型的参数。它们是完全类型安全的不会再有回调核心转储COREDUMP。你可以把许多信号和你所希望的单一槽相连,并且一个信号也可以和你所期望的许多槽相连。把一个信号和另一个信号直接相连也是可以的。信号与槽的工作机制如图21所示OBJECT1SIGNAL1SIGNAL2OBJECT2SIGNAL1SLOT1SLOT2OBJECT3SIGNAL1SLOT1OBJECT4SLOT1SLOT2SLOT3CONNECT(OBJECT1,SIGNAL1,OBJECT2,SLOT1)CONNECT(OBJECT1,SIGNAL1,OBJECT2,SLOT2)CONNECT(OBJECT1,SIGNAL2,OBJECT4,SLOT1)CONNECT(OBJECT3,SIGNAL1,OBJECT4,SLOT3)图21信号与槽的工作机制如果一个类要使用信号与槽机制,它就必须是从QOBJECT或QOBJECT的子类继承,而且类的定义必须加上Q_OBJECT宏。SIGNALS、SLOTS和EMIT是QT特有的关键字,分别用来表示信号、槽、和发送信号,移除这些关键字和预处理程序,就可以使用标准的C编译器。槽同其他函数一样也具有访问权限,只是槽的访问权限决定了谁可以和它相连,用通俗的话解释上述几个槽函数就是,PUBLICSLOTS包含了任何信号都可以相连的槽。PROTECTEDSLOTS包含了只有这个类和它的子类的信号才能连接的槽。这就是说这些槽只是类的实现的一部分,而不是它和外界的接口。PRIVATESLOTS包含了只有这个类本身的信号可以连接的槽,甚至它的子类都没有获得连接的权利。QT中的元对象系统是用来处理对象间通讯的信号槽机制、运行时的类型信息和动态属性系统。它基于下列三类QOBJECT类、类声明中的私有段中的Q_OBJECT宏、元对象编译器(MOC)。MOC读取C源文件。如果它发现其中包含一个或多个类的声明中含有Q_OBJECT宏,它就会给含有Q_OBJECT宏的类生成另一个含有元对象代码的C源文件。这个生成的源文件可以被类的源文件包含(INCLUDE)到或者和这个类的实现一起编译和连接。由此可见本项目在LINUX中,选用QT做图形化界面是非常正确的。223LINUX简介LINUX是一款免费的操作系统,用户可以通过网络或其他途径免费获得,并可以任意修改其源代码。这是其他的操作系统所做不到的。正是由于这一点,来自全世界的无数程序员参与了LINUX的修改、编写工作,程序员可以根据自己的兴趣和灵感对其进行改变,这让LINUX吸收了无数程序员的精华,不断壮大。经过学习,对LINUX有了比较深入的了解,其中第一点,一切都是文件;第二点,每个软件都有确定的用途。其中第一条详细来讲就是系统中的所有都归结为一个文件,包括命令、硬件和软件设备、操作系统、进程等等对于操作系统内核而言,都被视为拥有各自特性或类型的文件。其中主要的文件类型有(1)纯文本文件(ASCII)这是UNIX系统中最多的一种文件类型,之所以称为纯文本文件,是因为内容可以直接读到的数据,例如数字、字母等等。设置文件几乎都属于这种文件类型。举例来说,使用命令“CAT/BASHRC”就可以看到该文件的内容(CAT是将文件内容读出来)。(2)二进制文件(BINARY)系统其实仅认识且可以执行二进制文件(BINARYFILE)。LINUX中的可执行文件(脚本,文本方式的批处理文件不算)就是这种格式的。举例来说,命令CAT就是一个二进制文件。(3)数据格式的文件(DATA)有些程序在运行过程中,会读取某些特定格式的文件,那些特定格式的文件可以称为数据文件(DATAFILE)。举例来说,LINUX在用户登入时,都会将登录数据记录在/VAR/LOG/WTMP文件内,该文件是一个数据文件,它能通过LAST命令读出来。但使用CAT时,会读出乱码。因为它是属于一种特殊格式的文件。目录文件(DIRECTORY)就是目录,第一个属性为D,例如DRWXRWXRWX。连接文件(LINK)类似WINDOWS下面的快捷方式。第一个属性为L,例如LRWXRWXRWX。设备与设备文件(DEVICE)与系统外设及存储等相关的一些文件,通常都集中在/DEV目录。通常又分为两种块设备文件就是存储数据以供系统存取的接口设备,简单而言就是硬盘。例如一号硬盘的代码是/DEV/HDA1等文件。第一个属性为B。字符设备文件即串行端口的接口设备,例如键盘、鼠标等等。第一个属性为C。套接字(SOCKETS)这类文件通常用在网络数据连接。可以启动一个程序来监听客户端的要求,客户端就可以通过套接字来进行数据通信。第一个属性为S,最常在/VAR/RUN目录中看到这种文件类型。管道(FIFO,PIPE)FIFO也是一种特殊的文件类型,它主要的目的是,解决多个程序同时存取一个文件所造成的错误。FIFO是FIRSTINFIRSTOUT(先进先出)的缩写。第一个属性为P。至于说LINUX是基于UNIX的,很大程度上也是因为这两者的基本思想十分相近。LINUX支持多用户,各个用户对于自己的文件设备有自己特殊的权利,保证了各用户之间互不影响。多任务则是现在电脑最主要的一个特点,LINUX可以使多个程序同时并独立地运行。LINUX可以运行在多种硬件平台上,如具有X86、680X0、SPARC、ALPHA等处理器的平台。此外LINUX还是一种嵌入式操作系统,可以运行在掌上电脑、机顶盒或游戏机上。2001年1月份发布的LINUX24版内核已经能够完全支持INTEL64位芯片架构。同时LINUX也支持多处理器技术。多个处理器同时工作,使系统性能大大提高。23V4L2架构231概述在V4L2出现之前,LINUX内核为提供了视频设备的一个子系统即V4L,这里的V4L为LINUX系统中的视频驱动提供了统一的接口,可以使得应用程序调用统一的API函数来操作不同的视频设备,极大简化了开发人员对视频系统的开发和维护的过程。但是要知道,V4L还是有很多不足的地方,终于在BILLDIRKS等人在1998年对其进行重新设计和开发,并取名为V4L2,经过长时间的发展,于2002年11月,融入到了LINUX内核的主干之中。VIDEO4LINUX2最早出现在LINUX2546版本。对比V4L2与V4L,V4L2支持的硬件设备更多,而且还具有更好的扩展性和灵活性,他们希望LINUX能够支持更多的设备开始着手设计V4L2,在这些所有支持的设备之中只有一小部分是真正意义上的视频设备。因为V4L2是针对V4L进行了彻底改造之后才出来的产物,这样造成的后果也是显而易见的,在兼容性方面V4L2与V4L是相对的,不兼容的。之前的应用程序需要从新开发,而且此框架只能运行在LINUX操作系统之上。在LINUX系统中,所有的外部设备都是文件的形式存在于系统中的,我们称外部设备为设备文件。应用程序可以通过直接访问这些文件来实现对相应设备的操作和控制。本文使用的V4L2视频设备的设备文件为/DEV目录下的VIDEO0即是本机自带的摄像头。232系统调用本文的LINUX编程中,使用的是IOCTL函数来对设备的I/O通道进行操作,V4L2的大部分功能都是通过调用IOCTL函数来完成的,IOCTL的基本语法为INTIOCTLINTFD,UNSIGNEDLONGINTREQUEST,;FD设备描述符,即刚才使用OPEN函数打开视频通道后所返回的视频设备号;REQUEST控制命令。接下来介绍本项目中用到的命令类型(1)VIDIOC_ENUM_FMT用来获取本机视频驱动支持的视频格式;VIDIOC_S_FMT设置本机驱动捕获格式;VIDIOC_G_FMT读取本机驱动捕获格式,主要是图像的宽,高、每像素所占比特和像素格式如YUV。本程序中设置的数据类型STRUCTV4L2_FORMAT。(2)VIDIOC_CROPCAP查询驱动的修剪能力;VIDIOC_S_CROP设置视频信号的边框;VIDIOC_G_CROP读取视频信号的边框,主要是设置采集视频的视角和位置。(3)VIDIOC_REQBUFS,用于内存映射,这个命令可以在驱动层申请多个缓冲区,存放采集到的图像。但是用户需要使用MMAP将其映射到用户空间才能访问。本项目中数据类型为STRUCTV4L2_REQUESTBUFFERS。(4)VIDIOC_QUERYBUF,用于内存映射,这个命令可以查询由VIDIOC_REQBUFS申请到的缓冲区的大小和偏移地址,而申请到的缓冲区的大小和偏移地址会作为参数传给MMAP。即把VIDIOC_REQBUFS中分配的数据缓存转换成物理地址。本项目中数据类型为STRUCTV4L2_BUFFER。(5)VIDIOC_QBUF,用于内存映射,该命令的作用是将VIDIOC_REQBUFS申请的缓冲区放入采集队列,只有这样驱动才会将采集到的数据写入缓冲区。本项目中数据结构为STRUCTV4L2_BUFFER。(6)VIDIOC_DQBUF,用于内存映射,该命令的作用是将填充数据的一个缓冲区取出队列,这样驱动就不会再向这个缓冲区写数据,应用程序可以对该缓冲区的数据进行处理,需要注意的是,应用程序处理完数据后,需要使用VIDIOC_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查询驱动功能。233数据交换操作系统一般会把LINUX系统使用的内存划分成两类用户空间和内核空间,用户空间由应用程序管理,内核空间由操作系统管理。应用程序可以直接访问用户内存的地址,但是内核空间里存放的数据是供内核访问的代码和数据,用户是不能直接访问的。这里V4L2采集视频的数据存储到了内核空间中,也就是意味着用户不可以直接访问这段内存,必须通过某些方法来转换地址,达到应用程序可以访问到的目的。首先可以确定的是,V4L2支持三种数据交换的模式,这三种模式分别是直接读取设备文件方式、用户指针方式以及MMAP映射方式。首先要知道这三种模式的工作原理(1)直接读取设备文件方式直接调用READ和WRITE函数进行采集到的数据的读入和输出,这种方法一般都配合SELECT使用。READ、WRITE函数需要在用户空间和内核空间不断的进行数据的拷贝,这样的后果就是会占用了大量用户内存空间,效率不高,浪费资源,故本项目不采用这样的方法。(2)用户指针方式这样的方法,首先应用程序需要申请缓冲区,然后把申请到的缓冲区传给驱动程序,驱动会把它当成缓冲区,这样就实现了内存的共享。内存的地址由应用程序自己分配。这点需要在结构体里将MEMORY字段设置成V4L2_MEMORY_USERPTR。否则不能使用。(3)内存映射方式这种方式与用户指针方式类似。首先需要在内核空间申请多个缓冲区,然后将每个缓冲区通过MMAP映射到用户空间,选择共享模式,这样驱动和应用程序就能共享这些缓冲区,即把设备里的内存映射到应用程序中的内存空间,直接处理设备内存,这样在进行数据处理时不需拷贝数据,大大提高执行效率。MMAP工作方式,如图22所示图22MMAP工作方式经过对比可以发现,内存映射的方式明显提高了数据处理的效率,所以本程序选取的是内存映射的方式进行数据交换。234处理采集数据V4L2有一个数据缓存区,存放REQCOUNT数量的缓存数据。数据缓存采用FIFO的方式,当应用程序调用缓存数据时,使用VIDIOC_DQBUF,使缓存队列将最先采集到的视频数据缓存送出,使用VIDIOC_QBUF,将已经发送出的缓冲区重新送进采集队列,并重新采集一张视频数据。24SOCKET服务241SOCKET概述套接字,是支持TCP/IP网络通信协议的基本操作单元,它可以看成是几个不同主机之间的进程进行双向通信的端点,简单的说SOCKET就是通信的双方的一种约定方式,用套接字中的相关函数去完成通信的过程。套接字主要有3个参数来区分不同应用程序的网络通信和连接通信的目的地IP地址、使用的传输层协议TCP或UDP和使用的端口号。通常会把这三个参数结合起来,并与套接字绑定,经过这样的操作,应用层便可以和传输层通过套接字接口,区分不同的应用程序的进程和网络连接的通信,实现数据传输服务。套接字其实是两个程序进行通信连接中的端点,连接了应用程序和网络驱动程序,套接字可以在应用程序中创建,通过与网络驱动绑定来建立关联的关系。这样,应用程序将数据发送给给套接字,并由套接字发送给网络驱动程序,然后向网络传输出去。应用程序在网络上收到与这个套接字绑定的IP地址和端口号相关的数据后,网络驱动程序将数据交给套接字,之后应用程序便可从该套接字中提取接收到的数据。经过这样的过程,网络应用程序就将采集到的数据发送给应用程序,应用程序通过解析便能提取出接受到的相关消息。242SOCKET工作方式建立套接字描述符SOCKFDSOCKETAF_INET,SOCK_STREAM,0;绑定BINDSOCKFD,STRUCTSOCKADDRBOUNDARYWWWBRIUPCOMRNRN“响应实体“WWWBRIUPCOMNCONTENTTYPEIMAGE/JPEGNCONTENTLENGTHDNN“3概要设计在进行具体的设计之前,首先要现有一个整体的框架,并根据这个框架不断的实现功能和要求。系统的总体结构如图31所示图31系统总体结构设计首先是服务器方面,服务器方面选用的编码语言是C语言,然后就要对服务器进行详细设计。首先是使用V4L2架构的视频采集,就需要一下几个步骤设置参数,初始化设备,然后就可以建立SOCKET连接并使用HTTP协议,进行数据采集和数据传输的功能。之后是客户端方面,客户端选取的开发工具是QTCREATOR是基于C的图形化界面开发,在客户端首先要实现与服务器创建连接的功能,然后可以向服务器端发送请求,服务器接受到请求之后会发出响应,当客户端接收到相应之后就会解析响应,解析之后将得到的图片数据显示在客户端,那么要有连贯的视频显示的话就只能不断的刷新数据,使接收到的一张张图片连贯起来,就能实现连续的视频显示。使用LINUX的VIDEO4LINUX2架构完成图像捕捉的功能,并使用HUFFMAN函数打印图像,使用SOCKET连接服务器与客户端,使用HTTP协议完成图像传输,客户端中,连接服务器的端口和IP接受服务器传来的图像并进行解析,使用SCREEN类完成图像的显示,使用QIMAGE的SAVE方法实现图像的保存。首先在LINUX终端里打开服务器,打开笔记本的摄像头,使服务器开始图像的采集。采集过程开始后会将数据写入分配的缓冲区内,当一个缓冲区数据准备就绪后会被放入输出队列,等待应用程序处理,当所有的缓冲区都进入输出队列后,采集过程停止,并等待缓冲区重新放入采集队列。这时,服务器已经开启SOCKET服务,等待客户端发出的请求。然后打开QT,打开已经写好的客户端,客户端有四个按钮START,STOP,PHOTO,QUIT,分别实现开始,停止,抓图和退出的功能,首先点START按钮,这时出现对话框,连接服务器端已经设置好的端口和本地IP地址,点击OK之后便已经连接好服务器,之后SCREEN上已经可以显示采集的图像了,之后要想保存屏幕上显示的图片,就得点击PHOTO按钮了,这个按钮调用的是QIMAGE的SAVE方法,QIMAGE类主要是用于I/O和直接逐像素访问和操作。而SAVE方法可以用来保存QIMAGE对象。最后就可以在制定的文件夹里看到保存的图片了,这时的图片的名字是提前设置好的,PHOTOJPEG,在之后的更改中可以设定使用户来指定保存的名字。最后点击QUIT便可以退出客户端了。然后在终端中关闭服务器即可。31服务器端使用C语言编写服务器端,图像捕捉方面采用LINUX的VIDEO4LINUX2架构,依次实现了打开摄像头,设置图像格式,分配缓冲区,启动采集过程,读取数据,停止采集的功能。信息传输方面,采用SOCKET建立连接,依次实现创建套接字,创建IP和PORT,绑定,开始监听,来接受客户端的请求。使用HTTP协议传输图片。图像打印方面,使用HUFFMAN函数进行图片的输出,在格式方面添加JPEG库进行相应的格式转换。在选择数据交换的技术时,选择了MMAP,这种方式在内核空间申请多个缓冲区,然后将每个缓冲区通过MMAP映射到用户空间,这样驱动和应用程序共享这些缓冲区,即把设备里的内存映射到应用程序中的内存控件,直接处理设备内存,这样在进行数据处理时不需拷贝数据,大大提高效率。服务器流程图,如图32所示开始创建SOCKET打开设备获取信息设置采集方式设置帧缓存数据处理发送数据结束图32服务器端流程图32客户端客户端选取的开发工具是QTCREATOR是基于C的图形化界面开发,在客户端首先要实现与服务器创建连接的功能,然后可以向服务器端发送请求,服务器接受到请求之后会发出响应,当客户端接收到相应之后就会解析响应,解析之后将得到的图片数据显示在客户端,那么要有连贯的视频显示的话就只能不断的刷新数据,使接收到的一张张图片连贯起来,就能实现连续的视频显示。客户端界面上有四个按钮START,STOP,PHOTO,QUIT,分别实现开始,停止,抓图和退出的功能,客户端收到服务器传输过来的数据后,要想得到完整的图片需要对接受的数据进行解析,删除没有用的,留下图片数据,就可以得到完整的图片。并进行以下步骤接受连贯信息,删除报头,删除帧头,提取图片信息来显示图片。服务器端捕捉的图像显示在SCREEN上,PHOTO调用的是QIMAGE里面的SAVE方法,使得屏幕上的图片保存到电脑中,来完成抓图的功能,流程图如图33所示开始建立连接接受数据处理数据图像显示图像暂停图像保存结束是否图33客户端流程图4详细设计41V4L2框架图像采集V4L2图像采集的过程分为启动视频设备、设置图像格式、分配缓冲区、读取数据、关闭设备等步骤。(1)启动视频设备CAMERAFDOPEN“/DEV/VIDEO0“,O_RDWRIFCAMERAFDSHOW执行槽函数之后,点击OK连接到服务器,开始视频显示执行槽函数STARTCAPTUREVOIDIMAGEWIDGETSTARTCAPTURE/设置IP地址和端口,开启线程THREADSETHOSTPORTCONNDIALOGGETHOST,CONNDIALOGGETPORTTHREADSTART这时,线程开始执行,当开始获取信息时,发送信号CONNECTTOHOSTSUCCESS,这时开始执行CHANGEWIDGETBTNSTATE,将客户端的“PHOTO”按钮和“STOP”按钮置为可用。即VOIDIMAGEWIDGETCHANGEWIDGETBTNSTATEEMITCHANGEBTNSTATE这个槽函数发出信号CHANGEBTNSTATE,之后执行SETBTNENABLE槽函数。即VOIDWIDGETSETBTNENABLEPHOTOBTNSETENABLEDTRUESTOPBTNSETENABLEDTRUE这样剩下的两个按钮也变得可用了。在把图片经由43那样处理完之后,发送信号SENDCURRENTIMAGEIMAGE之后开始执行槽函数CHANGECAPTURE,不断地更行图片,即VOIDIMAGEWIDGETCHANGECAPTUREQIMAGENEWIMAGETHISIMAGENEWIMAGETHISUPDATE442PHOTO按钮之后便是第二个按钮“PHOTO”按钮,当点击“PHOTO”按钮时,发送点击信号,执行的是槽函数SETPHOTONAME,即VOIDIMAGEWIDGETSETPHOTONAME/保存当前图片SAVEIMAGEIMAGESCALEDQSIZE640,480THREADSETCAPTURESTATEFALSEDNEWDIALOGTHIS/点击对话框上OK按钮,保存文件CONNECTD,SIGNALACCEPTED,THIS,SLOTSAVEPICTURECONNECTD,SIGNALREJECTED,THIS,SLOTREJECTSAVEPICTUREDSETMODALTRUEDSHOW点击OK后执行槽函数SAVEPICTURE,即VOIDIMAGEWIDGETSAVEPICTUREQSTRINGFILENAMEDGOTFILENAMEBOOLNSAVEIMAGESAVEFILENAME;THREADSETCAPTURESTATETRUE这样图片就会被保存为相应的名字,存储在DEBUG中。点击CANCEL按钮执行REJECTSAVEPICTURE,即VOIDIMAGEWIDGETREJECTSAVEPICTURETHREADSETCAPTURESTATETRUE不做任何处理。443STOP按钮点击“STOP”按钮,发送点击信号,执行槽函数STOPBTNCLICKED,如果按钮上的文本信息是“STOP”,首先将文本信息变为“CONTINUE”然后线程停止采集服务器端的图像,使得画面停止,达到暂停的效果,如果按钮上的文本信息是“CONTINUE”,将文本信息变为“STOP”之后,让线程继续采集信息,使得视频继续显示,即VOIDWIDGETSTOPBTNCLICKEDIFSTOPBTNTEXTCOMPARE“STOP“0SCREENCHANGECAPTURESTATEFALSESTOPBTNSETTEXT“CONTINUE“ELSESCREENCHANGECAPTURESTATETRUESTOPBTNSETTEXT“STOP“444QUIT按钮当点击,QUIT按钮之后,应用程序会全部退出。45图片的输出451HUFFMAN函数在这个信息高速发展的时代,每一秒钟人与人之间都传递这大量的信息,现在,什么地方都离不开信息,

温馨提示

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

评论

0/150

提交评论