嵌入式摄像头抓图系统设计与实现.docx
- 文档编号:16943232
- 上传时间:2023-07-20
- 格式:DOCX
- 页数:65
- 大小:2.05MB
嵌入式摄像头抓图系统设计与实现.docx
《嵌入式摄像头抓图系统设计与实现.docx》由会员分享,可在线阅读,更多相关《嵌入式摄像头抓图系统设计与实现.docx(65页珍藏版)》请在冰点文库上搜索。
嵌入式摄像头抓图系统设计与实现
嵌入式摄像头抓图系统设计与实现
摘要
随着现代科技的飞速发展,我们越来越重视实时通讯,时时刻刻的了解身边发生的一切,这样我们就需要摄像头和Linux来帮助我们实现这一切。
本项目以实现嵌入式的摄像头抓图系统为核心,使用V4L2框架完成图像采集。
Video4Linux2是基于Linux系统进行图像和影音开发的应用编程接口。
本项目的实现过程:
服务器端,需要使用C语言,并结合V4L2框架,遵守V4L2的流程,先获取视频设备支持的标准,后设置捕获的视频格式,然后为图像数据分配内存空间,使用mmap将内核空间映射出来,使得应用程序能够访问内核空间,保存捕获的数据,将数据发送到用户空间。
使用socket建立网络连接,创建socket,绑定,监听,接受用户请求。
使用视频传输http协议,程序运行时加入JPEG库,通过转换格式将yuv转换成JPEG,并使用huffman函数解码打印图片。
客户端方面,使用Qt实现客户端的图形化界面,使用QTcpSocket,建立连接,连接到服务器,不停地发送和接受数据,完成视频显示,图像采集,暂停的功能。
最后,本文给出了符合V4L2框架的本机摄像头图像数据采集功能,并转换为JPEG格式保存。
最后,本系统可以将捕捉到的画面显示在屏幕上并且可以实现抓图的功能。
关键词Linux;V4L2;图像采集;摄像头;显示
Embeddedcameracapturesystemdesignandimplementation
Abstract
Withtherapiddevelopmentofmoderntechnology,weareincreasingemphasisonreal-timecommunication,understandingeverythinghappeningaroundallthetime,soweneedacameraandLinuxtohelpusachievethis.
Theprojecttoimplementanembeddedcameracapturesystemasthecore,usingV4L2frameworkofimageacquisition.Video4Linux2isanapplicationprogramminginterfaceunderLinuxtodevelopvideoandimage.Implementationprocessoftheproject:
Theprogramcameracapturesystembasedontheembedded,useclanguagetoachievetheserversideandusev4l2framework.First,getthestandardofavideodevicesupport,Thensettheformatofthevideocapture,Thenallocatememoryfortheimage,Addresstranslationmappingsbyusingmmap,savedataandthensendsthedatatotheuserspace.Establishanetworkconnectionbyusingsocket,createasocket,binding,listening,andreceivingauserrequest,usingthehttpprotocolforvideotransmission,addingJPEGlibraryintheruningtime,convertingyuvintoJPEGformatbythetechnologyofconvertingandprintpicturesbyusinghuffmandecodingfunction.UsingQtcreatorgraphicalinterfacetoachieveclient,theclientusingQTcpSockettogetaconnection,andlinktheserver,constantlysendingandreceivingdata,andthencompletethefuctionofvideodisplay,imagecaptureandstopInthispaper,itofferthegatheringfunctionofcameraimagethatconformstheframeworkofV4L2andconverttotheJPEGtosave.
Finally,thesystemcancapturethescreendisplayonthescreenandcancapturefunctionality.
KeywordsLinux;V4L2;capturepicture;camera;display
目 录
1绪论
1.1课题背景
在当今的世界中,各项技术都有了突飞猛进的发展,而嵌入式相关技术、相关多媒体的技术和各种各样的网络技术有了快速稳步的发展,其中基于嵌入式的视频压缩编码技术和网络的传输控制已经得到了综合应用,已经在数字化网络视频采集监控领域有了立足之地,成为了这种技术的核心。
由于系统的实时性,交互性,高速传输性,高质量传输的性能摄像头系统已经得到了广泛的使用,比如现在使用的网络视频聊天,安保监控,网络视频会议系统,视频电话等。
由此可见,本课题的研究,对开发简单,简便的视频传输终端设备有一定的价值。
这里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操作系统,而且还包括了文本编辑器、高级语言编译器等应用软件。
它还包括带有多个窗口管理器的X-Windows图形用户界面,如同我们使用WindowsNT一样,允许我们使用窗口、图标和菜单对系统进行操作。
因为它属于自由软件,用户不用支付任何费用就可以获得它和它的源代码,并且可以根据自己的需要对它进行必要的修改和无约束地继续传播。
并且它具有Unix的全部功能,而且它受到广大计算机爱好者的喜爱,而广大的计算机爱好者也是娱乐休闲游戏的主力军,所以选用Linux操作系统作为软件支持平台。
对于编程工具QT而言,本次使用的开发工具叫做QtCreator,QtCreator这款工具不仅能帮助用户更快速入门并运行项目,还可提高开发人员的工作效率。
而且它使用强大的C++代码编辑器可快速编写代码,语法标识和代码完成功能输入时进行静态代码检验以及提示样式上下文相关的帮助代码折叠括号匹配和括号选择模式高级编辑功能。
另外,使用浏览工具管理源代码,集成了领先的版本控制软件,包括Git、Perforce和Subversion开放式文件,无须知晓确切的名称或位置搜索类和文件跨不同位置或文件沿用符号在头文件和源文件,或在声明和定义之间切换。
最主要的是为Qt跨平台开发人员的需求而量身定制,因为它集成了特定于Qt的功能,如信号与槽,对Qt类结构可一目了然集成QtDesigner可视化布局和格式构建器只需单击一下就可生成和运行Qt项目等有点,使得我们对软件的开发变得简单,易行。
因此,在有了图像采集功能的视频监系统,使得这个系统就更加的完善和丰富。
这个系统不仅可以起到监控的效果,而且在有需要的时候,将某一画面进行图像采集,这样就可以将视频转化成为图片。
在保存方面这个特点就更加的显著了,毕竟视频的所占的空间是比图片要大很多,而且,整个视频不可能全部要保存下来,那么就有你需要的部分和你不需要的部分,也有可能,你需要的部分是不连贯的。
那这个时候截图的功能就可以起到这样的效果,既可以节省空间,又可以得到自己需要的东西。
在当今各种各样的图像采集软件层出不穷,说明图像采集软件的功能作用已被大众认可,相信在未来,会有更多的更加实用简洁的图像采集软件面市,更好的服务与大众。
本文主要研究基于Linux下的V4L2在惠普HP6450b上实现图像采集系统的开发与实现。
1.2图集系统的研像采究发展
在图像采集系统的初始研究,因为大多数所使用的硬件是基于CMOS芯片的摄像头,但是由于CMOS芯片只能捕获模拟信号,所以为了完成使用模拟摄像机的图像采集系统的研究,它也需要额外的处理,以获得数字信号的模拟信号。
早在研究过程中需要使用的电路芯片的设计他们自己的图像采集系统,通常这样的一个图像采集系统需要使用图像传感器,信号处理器,以及一个液晶显示帧存储器等硬件,CMOS摄像图像是由图像传感器电路的环境信号得到的,使用用一个信号处理器处理数字信号,其中每个帧的图像信号被存储在帧存储器中,并且最后这些信号是通过LCD技术显示。
随着人们对计算机科学与技术的重视,导致其快速发展,而采集卡已经成为图像采集系统硬件的组成部分,并逐步应用到图像采集系统,采用图像采集卡可以很容易地模拟摄像机的图像信号,处理时,采集卡软件界面非常轻松的应用到图像采集系统中去,所以使用的采集卡和模拟摄像头很容易地融入了图像采集系统中,虽然模拟摄像机的图像采集技术已经非常成熟,易于实现,但图像采集速度慢,抗干扰能力不强,声环境噪声可能会导致图像采集不清楚,而且这种技术不是很容易操作。
由于这些技术缺点的致命性,这种技术逐渐被淘汰。
后来,相机技术收到巨大动力,飞速发展,开发出了数码摄像机,它采用USB接口,千兆以太网接口可用于高速数字相机,将收集到的信息转换成数字图像信号,你可以去直接连接到电脑上,这种技术不仅简化了系统的运行,而且其强大的抗干扰能力也使得图像采集系统采集的图像清晰,适用性强。
随着高度集成和模块化系统的快速发展,在图像采集系统在数码相机上稳步发展,数码相机本身就可以实现图像的采集,而且软件系统的界面清晰,人机交互能力很强,但他们需要合适的数码相机的驱动程序,从而连接电脑和数码摄像机,但是这些技术大部分都是基于国外软件技术之间的通信和数据传输,不符合我们的独立、创新的软件开发的要求,而且不符合一些设计的保密性,可扩展,性特殊环境的软件系统的要求,所以我们需要开发一个基于Linux的平台,一个更强大的扩展,安全性好,保密性强的自我图像采集系统。
1.3需求分析
1.3.1用户需求分析
在社会的高速发展过程中,在生命第一的影响下,安全便成为了当代人们最关心的问题,针对这一现象,人们不断地探索如何确保安全,使得现在的监控工程为这方面做着不断地努力,这能使得我们的财产得到更好的安全保障,例如,如果我们有了摄像头的监控系统,我们可以随时随地查看我们身边发生的一切些事情等等。
现在,可以说监控摄像头在城市里面是无处不在,公交车上有,高速公路上有,宾馆里面有,甚至现在所在的地方也都有,摄像头监控的作用非常大,能够防止各种意外的发生,在人们意识到这样的便捷及安全之后,它便布到了人们所在的各个角落,甚至城市之外的各种地方也都有摄像头的存在,可以防止一些不法分子的阴谋得逞,防止类似这些严重危害到我们的财产和生命安全的事情发生。
因此用户最需要的当然是可以看到监控的画面以及对监控画面的捕捉,以帮助我们能够更快的了解事情的真相,帮助人民警察维护社会的治安,为人类的发展贡献出自己的力量。
1.3.2功能需求分析
根据用户需求,可确定以下功能:
(1)摄像头采集的图像传输到服务器端,用户可以通过客户端来对摄像头采集到的内容进行查看。
(2)用户的客户端可以对传输到的视频进行图像捕捉。
(3)捕捉到的图像应该可以按照用户的要求自定义捕捉到的图像的名称,并保存到相应的位置,以便客户来进行查看。
1.4可行性研究
针对本项目,经过仔细的思考,服务器端可以使用Linux4video2的框架,前文已经提到了,v4l为Linux里的视频驱动提供了统一的接口,这使得Linux的开发人员能够调用应用程序统一的API函数,来操作不同的视频设备,极大简化了开发人员对视频系统的开发和维护的过程。
在Linux中使用c语言来编写服务器端实在是再好不过了。
而客户端可以采用提供强大图形库的Qt来编写。
而客户端与服务器端的通信则可以采用套接字和http协议来进行通信,将捕捉到的信息进行压缩,发送到客户端之后再对捕捉到的信息进行解析和实现,由此可见本项目是完全可行的。
2开发环境及主要技术
2.1开发环境
操作系统:
Linux
程序主要语言:
C,C++
图形化界面平台:
QT
图片格式:
jpeg
2.2语言和开发平台的选定
科技是第一生产力,在互联网技术的高速发展中,嵌入式技术已经越来越纯熟,这使得开发的代价越来越低,基于嵌入式技术的成熟性和Linux系统的开源,稳定,等优势,嵌入式的相关技术逐渐走向了世界前端,在这样的技术背景下,完成本次设计的主要语言选定了Linux下广泛应用的语言C语言,图形界面选择了有强大图形库的QT。
2.2.1C语言简介
1972年,美国贝尔实验室的DennisM.Ritchie推出了对当今世界影响特别深刻的C语言,C语言既具有低级语言的特点,又包含着高级语言的特点,C语言是一种计算机程序设计语言。
1978年后,C语言受到了广大编程人员的喜爱,由于它的移植性,已先后被应用到各种机器上,C语言可以直接编写应用程序,编写不依赖硬件的应用程序,又系统语言,编写系统的逻辑。
C语言处理数据的能力很强,系统软件再合适不过了,因此开发人员在嵌入式的相关项目上,十分青睐C语言。
这里选取C语言开发服务器是由于C语言可以直接访问物理地址,能直接操作和控制硬件,因此它既具有低级语言的许多重要功能,又具有高级语言的功能,可以像汇编语言那样操作位、字节和地址操作,而位,字节和地址是计算机中最基本的工作单元,可以用来编写系统软件。
C语言所生成目标代码质量很高,程序执行效率较高,所以本次的服务器段选用C语言为使用语言。
2.2.2Qt简介
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的信号和槽的机制可以保证如果你把一个信号和一个槽连接起来,槽会在正确的时间使用信号的参数而被调用。
信号和槽可以使用任何数量、任何类型的参数。
它们是完全类型安全的:
不会再有回调核心转储(core dump)。
你可以把许多信号和你所希望的单一槽相连,并且一个信号也可以和你所期望的许多槽相连。
把一个信号和另一个信号直接相连也是可以的。
信号与槽的工作机制如图2-1所示:
图2-1信号与槽的工作机制
如果一个类要使用信号与槽机制,它就必须是从QObject或QObject的子类继承,而且类的定义必须加上Q_OBJECT宏。
signals、slots和emit是Qt特有的关键字,分别用来表示信号、槽、和发送信号,移除这些关键字和预处理程序,就可以使用标准的C++编译器。
槽同其他函数一样也具有访问权限,只是槽的访问权限决定了谁可以和它相连,用通俗的话解释上述几个槽函数就是,public slots:
包含了任何信号都可以相连的槽。
protected slots:
包含了只有这个类和它的子类的信号才能连接的槽。
这就是说这些槽只是类的实现的一部分,而不是它和外界的接口。
private slots:
包含了只有这个类本身的信号可以连接的槽,甚至它的子类都没有获得连接的权利。
Qt中的元对象系统是用来处理对象间通讯的信号—槽机制、运行时的类型信息和动态属性系统。
它基于下列三类:
QObject类、类声明中的私有段中的Q_OBJECT宏、元对象编译器(moc)。
moc读取C++源文件。
如果它发现其中包含一个或多个类的声明中含有Q_OBJECT宏,它就会给含有Q_OBJECT宏的类生成另一个含有元对象代码的C++源文件。
这个生成的源文件可以被类的源文件包含(#include)到或者和这个类的实现一起编译和连接。
由此可见本项目在Linux中,选用QT做图形化界面是非常正确的。
2.2.3Linux简介
Linux是一款免费的操作系统,用户可以通过网络或其他途径免费获得,并可以任意修改其源代码。
这是其他的操作系统所做不到的。
正是由于这一点,来自全世界的无数程序员参与了Linux的修改、编写工作,程序员可以根据自己的兴趣和灵感对其进行改变,这让Linux吸收了无数程序员的精华,不断壮大。
经过学习,对Linux有了比较深入的了解,其中第一点,一切都是文件;第二点,每个软件都有确定的用途。
其中第一条详细来讲就是系统中的所有都归结为一个文件,包括命令、硬件和软件设备、操作系统、进程等等对于操作系统内核而言,都被视为拥有各自特性或类型的文件。
其中主要的文件类型有:
(1)纯文本文件(ASCII):
这是Unix系统中最多的一种文件类型,之所以称为纯文本文件,是因为内容可以直接读到的数据,例如数字、字母等等。
设置文件几乎都属于这种文件类型。
举例来说,使用命令“cat~/.bashrc”就可以看到该文件的内容(cat是将文件内容读出来)。
(2)二进制文件(binary):
系统其实仅认识且可以执行二进制文件(binaryfile)。
Linux中的可执行文件(脚本,文本方式的批处理文件不算)就是这种格式的。
举例来说,命令cat就是一个二进制文件。
(3)数据格式的文件(data):
有些程序在运行过程中,会读取
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 摄像头 系统 设计 实现