基于树莓派3的远程管理系统设计和实现 计算机科学与技术专业_第1页
基于树莓派3的远程管理系统设计和实现 计算机科学与技术专业_第2页
基于树莓派3的远程管理系统设计和实现 计算机科学与技术专业_第3页
基于树莓派3的远程管理系统设计和实现 计算机科学与技术专业_第4页
基于树莓派3的远程管理系统设计和实现 计算机科学与技术专业_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

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

文档简介

目录前言 3第一章 绪论 41.1 研究背景及意义 41.2 RaspberryPI3 41.2.1基本介绍 41.2.2功能 51.3 Flask 51.3.1特性 51.3.2配置与惯例 61.4 本文的组织结构 6第二章 树莓派3的数据采集处理 72.1 树莓派3 72.1.1规格说明 72.1.2利用noobs安装 72.2 利用motion软件获取图片 92.2.1 检查USB摄像头是否可用 92.2.2 视频摄像头软件的安装及使用 102.3 本章小结 12第三章 Flask框架数据接收以及交互 133.1 Flask的安装配置 133.1.1 开发工具PyCharm 133.1.2 开发准备 133.2Flask实现视频流传输 143.2.1流媒体 143.2.2使用Flask实现流式传输 143.2.3Multipart模式 153.2.4Jinja2前端模板的实现 153.2.5代码结构 163.3Flask与树莓派的交互 173.3.1视频帧 173.3.2交互 183.4 本章小结 21第四章 动态监测 224.1动态监测 224.1.1运动的阈值 234.1.2运动的输出 234.2并发访问 244.2.1摄像头事件类 24第五章总结与展望 265.1 本文总结 265.2 后续工作 27参考文献 28致谢 29

摘要论文主要介绍了本次毕业设计的主要内容,此次不仅涉及了传统的c/s模型网站设计模式,也涉及了对底层硬件的视频数据的收集,并对视频进行了动态监测的功能。即根据图像中像素点的移动、动作检测触发器的触发,对当前的视频图像采取截图、录像。并把图片文件保留下来。而承载这一切的,就是功能强大的微型计算机树莓派。树莓派作为一个功能强大的微型计算机,只需要接通显示器和键盘就可以实现大多数在传统电脑上能实现的功能,如文字处理、图像处理等。随着树莓派配置的增强以及开源社区对树莓派软件系统的维护,树莓派渐渐脱离了单片机的范畴,但又灵活的区分于笨重的传统电脑。网络摄像头简称WEBCAM,英文全称为WEBCAMERA,是一种结合传统摄像机与网络技术所产生的新一代摄像机,只要标准的网络浏览器(如"MicrosoftIE或Netscape),即可监视其影像。本次使用的摄像头就是树莓派3所适配的网络摄像头。本次毕业设计运用了树莓派3适配的USB摄像机,在网页端使用python的Flask轻量级框架为基础,对摄像头捕捉到的画面进行处理,控制。最终得到一个基于树莓派3的远程管理系统。主要实现了,对树莓派3连接摄像头视频数据的直播连接、当出现动态变化时的截图以及视频录制保留功能、视频截图功能以及一系列树莓派3的motion配置所支持的功能。当然,对于出现在网页端的视频图片,进行了自动的降噪处理等。关键词:树莓派;网络摄像头;视频监控;运动检测;图像处理;Flask

AbstractPapermainlyintroducedthemaincontentofthisgraduationdesign,thisnotonlyinvolvesthetraditionalc/smodelwebsitedesignpattern,alsocoveredontheunderlyinghardwarevideodatacollection,andthefunctionofthedynamicmonitoringofvideo.Thecurrentvideoimageisshotandrecordedaccordingtothemotionofthepixelpointintheimageandthetriggeroftheactiondetectiontrigger.Andsavethepicturefile.Andthat'sthepowerfulmicrocomputerRaspberryPIe.RaspberriesPIasapowerfulminiaturecomputer,onlyneedtoconnectadisplayandakeyboardcanbeachievedmostofthetraditionalcomputercanrealizethefunction,suchaswordprocessing,imageprocessing,etc.AstheRaspberryPIhasgrownandtheopensourcecommunityhasmaintaineditssoftwaresystem,theRaspberryPIhasgraduallymovedawayfromthecategoryofsingle-chipcomputers,butitisalsoflexibleenoughtodistinguishbetweenclunkytraditionalcomputers.WEBCAMERAorWEBCAM,calledtheEnglishWEBCAMERA,isproducedbyacombinationoftraditionalCAMERAandnetworktechnologyofanewgenerationofcameras,aslongasthestandardWEBbrowser(suchas"MicrosoftInternetexplorerandNetscape),canmonitortheimages.ThecamerausedinthiscaseisawebcamadaptedfromRaspberryPI3ThisgraduationprojectutilizesthecameramoduleoftheRaspberryPItoprocessandcontroltheimagescapturedbythewebcam,UsingthepythonFlasklightweightframeworkonthewebpageisthefoundation.Finally,aremotemanagementsystembasedonRaspberryPI3wasobtained.Mainrealization,RaspberryPI3livewebcamvideodataconnections,whenthereisadynamicchangekeptscreenshotsandvideorecordingfunction,videocapturefunctionandaseriesofraspberriesPI3motionconfigurationsupportfunctions.Ofcourse,thereisautomaticnoisereductionforvideoimagesthatappearonthewebpage.Keywords:raspberriesPI3;webcamera;videosurveillance;motiondetection;pictureprocessing;Flask前言随着科技的进步,软件和硬件都取得了长足进步,其中硬件资源的支持,如CPU能力的加强,存储器的内存的提升等,都为计算机行业的进步做出了巨大的推动作用。机器学习、人工智能、图像识别等进入了计算机从业人员甚至大众的视野。而此次的毕业设计,不仅涉及了传统的c/s模型网站设计模式,也对收集的视频数据进行了动态监测的功能。即根据图像中像素点的移动、动作检测触发器的触发,对当前的视频图像采取截图、录像,然后保存在树莓派的本地目录里面。而承载这一切的,就是功能强大的微型计算机树莓派。RaspberryPI3,是树莓派的第三代产品,英文简写为RPI3。RPI3是为以其便宜的价格、强大的功能而广泛的在国外的计算机编程教育中使用,它的本体是信用卡大小的卡片式电脑,内部装载的系统则大多基于Linux。而随着Windows10物联网的发布,我们也可以在树莓派上运行类Windows的系统,操作、界面、软件方面都很类似。自RPI发布、问世以来,就受到众多计算机发烧友和创客的追捧,在国外更是被一些高中当做编程的启发课程。本次使用Flask作为web的开发框架,它是用python语言开发的。Flask以轻量为特性。主要依赖两个外部库:模板引擎库Jinja2和工具集WerkzeugWSGI。在此基础上可以灵活的选用自己想要的数据库模块等。然后通过接收采集于树莓派的视频帧数据,加以修饰并带入Multipart模式,完成视频直播流的实现。此外,通过python的requests库,将截图以及录像等资源传递给Flask服务端,然后完成额外的功能展示。通过以上这些工具,加以几个交互脚本构成了我本次毕业设计的基础框架。基于树莓派3的远程管理系统就是在树莓派端的motion软件的后台运行下,配合交互脚本,在Falsk网页上完成对远程树莓派管理功能的一个系统。

第一章 绪论本章首先介绍了本次毕业设计的组成结构和大体框架。也简单介绍了主要使用的两个工具RaspberryPI和Flask的定义和内容,并大体解了本文所做的主要工作,在绪论的最后陈列了本次毕业设计论文的写作架构。1.1 研究背景及意义有时候我们会苦恼于人力监控成本和资源的浪费,在生活中、工作中视频监控以及视频动态检测的需求,一个方便便携的视频管理系统的需求就应运而生了。随着树莓派的更新换代,树莓派的功能更加强大。树莓派3的性能能够更好的满足一些发骚友的需求。各模块的全支持,能让我们可以更方便的应用底层硬件,从而获取一些我们所需要的数据来完成我们的项目。随着时代的发展,软件和硬件都取得了长足进步,其中硬件资源的支持,如CPU能力的加强,存储器的内存的提升等,都为计算机行业的进步做出了巨大的推动作用。机器学习、人工智能、图像识别等先进的知识也都进入了计算机从业人员甚至大众的视野。而此次的毕业设计,不仅涉及了传统的c/s模型网站设计模式,也对收集的视频数据进行了动态监测的功能。即根据图像中像素点的移动、动作检测触发器的触发,对当前的视频图像采取截图、录像。并把图片文件保留下来。而承载这一切的,就是功能强大的微型计算机树莓派。1.2 RaspberryPI31.2.1基本介绍树莓派[8](为学生计算机编程教育设计的一种卡片式电脑)RaspberryPI3,是树莓派的第三代产品,英文简写为RPI3。3代表这是第三代产品。RPI3是为以其便宜的价格、强大的功能而广泛的在国外的计算机编程教育中使用,它的本体是信用卡大小的卡片式电脑,内部装载的系统则大多基于Linux。而随着物联网概念的火热起来,也一定程度上推动了树莓派的发展,由此我们也可以在树莓派上运行类Windows的系统,操作、界面、软件方面都很类似。自RPI公布以来,树莓派就被众多计算机爱好者和硬件爱好者所称赞并使用,在国外更是被一些高中当做变成的启发课程。在其刚发布的时候,便呈现出了一机难求的场面。外观看起来只是一块板子的树莓派,却并不辜负其卡片电脑之名。各种模块,一应俱全。视频、音频、各种驱动接口,在3代还自带了无线模块GPIO引脚,功能非常强大。1.2.2功能利用树莓派我们可以完成很多有趣的事情,我们可以完全把它当成一台电脑使用,只是内存和操作系统不如PC机强大而已。在存储数据方面,RSP依靠SD卡来做依托,包括系统和文件以及驱动的装载。这也不同于普通的计算机主板依托于硬盘分区。在RSP上我们也可以观看视频,查看图片,浏览网页,编辑文档,利用简易IDE编写程序,还可以玩游戏,比如说《我的世界》。RaspberryPI虽然功能可人,但是它的价格也是相当低廉,这也就意味着使用人群、使用范围的扩大。因此,将其打造成一个多功能的媒体中心,然后供大家选择。利用支持RaspberryPI3的简单视频播放软件,我们可以在树莓派连接的显示器上观看视频。供电也不局限于电源,USB接口就可以,甚至可以电视机的USB接口也满足续电需求。在这次的设计中,树莓派则可以看做一个终端在使用。数据的采集、收集、处理以及发送基本都由树莓派来完成。凸显出了树莓派3的性能及计算能力。1.3 FlaskFlask[10]是由python语言开发的轻量级的web框架,所以必须在python环境下进行安装、编辑。1.3.1特性“轻量”(micro)并不是一整个web应用就在一个python文件中存储着,虽然这确实是可以的。但这不友好,对于开发者,对于web应用的维护者。也不会因为轻量而导致某些功能无法使用,只是用你可用。在提供基本的web应用的使用配置及外部拓展之外,Flask需要开发者根据自己的需求,自己去增加所需的模块、所需何种类型的模块。保证核心但又易于扩展。在开发的过程中,Flask也不会替开发者做出太多决策——比如使用何种数据库。而那些Flask自己的默认配置——比如哪种模板引擎——则很容易替换。除此之外的一切增加修改都由可由开发者自己去掌握。如此,开发者在使用Flask的才能达到如驱臂使的感觉。默认情况下,Flask并不包含表单验证在内的,或是其它任何已经被多种方式实现的的特定功能。然而,Flask支持开发者自己添加扩展来给自己开发的应用添加这些功能,最后显示的效果更如同Flask本身实现自带的一样。外部众多的扩展由开发者提供。当然包括了数据库集成、表单验证、上传处理、各种各样的开放认证技术等功能的支持与实现。Flask从一开始就是“微小”的,但它可以在开发者的运用过程中借开发者之手不断完善自己,最终变成一个应对复杂功能的web应用。1.3.2配置与惯例Flask因其强大的拓展性,导致其基本配置也是繁多,我们在刚开始使用的时候,选择其默认的配置就足够使用了。一般它的默认配置,都是相对来说的明智,并支持初学者的使用。当然,Flask也拥有着一些惯例,并积极遵循着。例如,按照Flask开发者的惯例,模板和静态文件,在PyCharm中也被默认绑定,分别存储在项目文件下的子目录

templates和

static

两个文件夹里。当然,根据前面所说的,这个配置也是可以修改,但是开发者们一般不会修改的,尤其是对于一些初学者来说。1.4 本文的组织结构本文按照内容的划分被分为五章,各章内容的详细介绍如下:第一章:绪论。本章首先介绍了本次毕业设计的组成结构和大体框架。也简单介绍了主要使用的两个工具RaspberryPI和Flask的定义和内容,并大体解了本文所做的主要工作,在绪论的最后陈列了本次毕业设计论文的写作架构。第二章:主要介绍了树莓派USB摄像头的数据处理功能。本章详细阐述了如何使用树莓派并对USB摄像头收集的数据进行采集、处理、发送等功能。第三章:主要介绍了如何使用Flask框架完成对树莓派的数据接收以及交互。第四章:主要介绍了在树莓派端对数据采集过程中涉及到的动态检测,图像处理等功能的使用。第五章:总结全文,提出未来工作的设想与展望。

第二章 树莓派3的数据采集处理本章详细阐述了树莓派的安装与使用,以及树莓派3摄像头视频软件motion的使用及收集。2.1 树莓派3本节主要介绍了树莓派3系统的安装以及视频数据采集前的准备工作2.1.1规格说明表2.1.1树莓派的规格型号

A型

A+型

B型

B+型

2代B型

3代B型SOC[11]

BroadcomBCM2835(CPU,GPU,DSP和SDRAM,USB)BroadcomBCM2836BroadcomBCM2837CPUARM1176JZF-S核心(ARM11系列)700MHzARMCortex-A7(ARMv7系列)900MHz(四核心)GPUBroadcomVideoCroreIV,OpenGLES2.0,1080p30h.264/MPEG-4AVC高清解码器内存256MB(与GPU共享,可以理解为集成显卡的显存与内存共享)512MB1GB(LPDDR2)USB2.0接口个数1(支持USBhub扩展)2

4

视频输入15-针头MIPI相机(CSI)界面,可被树莓派相机或树莓派相机(无红外线版)使用影像输出RCA视频接口输出,支持PAL和NTSC制式,支持HDMI(1.3和1.4),

他们的分辨率为640x350至1920x1200支持PAL和NTSC制式。网络接口无10/100以太网接口10/100以太网接口802.11nWirelessLANBluetooth4.1BluetoothLowEnergy(BLE)操作系统DebianGNU/Linux、Fedora、ArchLinux、RISCOS,

2代B型以上型号还将支持Windows10IoT2.1.2利用noobs安装Noobs是一款很方便的树莓派系统的安装工具,它帮助我们配置和启动树莓派3[1]。当然,我们也可以通过烧写软件将下载好的系统烧录到准备好的MircroSD卡里面。准备Noobs系统、MicroSD卡、树莓派3开发板、树莓派3电源、HDMI线、支持HDMI的显示器或电视机、一条网线(可选)、键盘、鼠标步骤格式MiscroSD卡解压NOOBS压缩包,将NOOBS文件夹的全部内容拷贝到SD卡的根目录SD卡插入树莓派,并插上相关配件NOOBS会自动分区,如图2.1.1所示图2.1.1树莓派系统自动分区弹出安装窗口,里面有几个主流的树莓派系统,这里推荐选择Raspbian,如图所示,点击Raspbian图2.1.2选择Raspbian系统点击“InstallOS”按钮,开始安装Raspbian树莓派系统,安装完成后重启。图2.1.3安装过程安装完成2.2 利用motion软件获取图片树莓派3除了通过GPIO引脚外接的摄像头模块,还支持树莓派3系统支持的USB摄像头。一般有官方的USB摄像头发售。另外,在内存和系统支持的情况下,可以支持多USB摄像头。也就是说需要使用多个线程去进行视频的读取。2.2.1 检查USB摄像头是否可用在树莓派3的命令行界面下,输入lsusb命令,根据命令行的输出,获得USB摄像头设备已被识别或未识别的信息。RaspberryPI3安装的Raspbian系统是一种类Unix/linux的系统,一切皆文件,所有的配置都可以被具有超级管理员权限的用户查看、修改。而USB摄像头的挂载文件在/dev设备文件夹下,按照个数取名。如只有一个USBcamera的话,就挂载在/dev/video0文件中。在树莓派3的命令行下输入ls/dev/video*,如果有输出,多个输出,就代表有多个USBcamera已经在被使用。2.2.2 视频摄像头软件的安装及使用在树莓派中有三款软件针对于USB摄像头和RaspberryPI3自带的GPIO摄像头的软件。包括fswebcam、mjpg-streamer、motion。这里主要介绍后面两款软件fswebcam一款小型摄像头程序,主要用于拍摄照片,可以在Raspbian的package仓库里直接下载。可以在树莓派3命令下面通过以下命令sudoapt-getinstallfswebcam使用帮助可以在命令行内使用fswebcam--helpmjpg-streamer[2]mjpg-streamer也是树莓派3上面用来采集图像的软件。最后将webcamera摄像头产生的视频流在本地的局域网上面。支持包括微软的IE浏览器在内的多种浏览器,在基于树莓派的基础上,我们采用chrome浏览器。然后用户可以在web端、移动设备端等多种能接触网络的设备上查看视频流。它也通过网络摄像头的硬件压缩工能来降低CPU的开销,这正是树莓派所需要的功能。它为以RPS为代表的嵌入式设备提供了可靠稳定的方案。其原因就是他将消耗大量时间的视频帧的压缩流程交给了底层的硬件去自主完成。比如说:在一个路由器上去编码一个像素为960*720的视频,假设路由器的主频为180Mhz,那么mjpg-streamer将会减少接近10%的CPU消耗。相当于使用硬件来减少CPU的工作量。motionmotion[3]是一个在GitHub上面开源的视频监控的软件,支持包括了几乎所有基于linux的多个平台以及其他系统。远程管理系统也是基于motion而制作的。Motion展现的功能,有效的减少了我的工作量,满足了此次设计的数据收集的需求。主要包括:支持USB摄像头和webcam(可通过HTTP查看实时视频直播的摄像头)支持多摄像头提供web访问实时视频功能(可以把USB摄像头变成webcam)重点是运动检测,可以在画面中出现活动物体时才开始拍摄并记录,实时记录而不清理,只会导致存储的库存越来越多可以配置在运动事件发生时拍照、录像,根据配置可以满足以下的要求,(连续拍照,可选保存全部照片或只保存一张,保存一张可选保存第一张,最好的一张,或是运动在画面中央的一张)可以配置各种事件触发(比如在运动检测发生时或者视频照片保存后发个邮件什么的)可以配置web远程管理(用处不大,建议关闭)可以配置使用数据库(支持MySQL和PostgreSQL)安装同上,可以在RaspberryPI3的package中可以下载:sudoapt-getinstallmotion。如果出现错误,可以先使用sudoapt-getinstallupgrade,对当前树莓派3系统raspbian系统的硬件依赖包的进行必要的更新,之后在进行安装。配置在使用中,更改motion的系统配置,在配置文件/etc/motion/motion.conf中进行以下默认配置的修改。打开motiondaemon守护进程,让他可以一直在后台运行sudonano/etc/default/motion#no修改成yes:start_motion_daemon=yes修改motion的配置文件:sudovim/etc/motion/motion.conf#deamonoff改成ondeamonon#设置分辨率width800height600#关闭localhost的限制webcam_localhostoff然后运行motion:sudomotion测试效果:现在我们的摄像头已经变成了一台网络摄像头,在浏览器上访问http://[your.domain]:8081,正是摄像头的直播画面。同时,在配置下,motion会把摄像头的图片数据按照日期为名称精确到秒,保存在树莓派的/var/lib/motion文件下,格式是JPEG。图片以motion配置的stream_maxrate为基础,将每秒的视频画面精确分帧,stream_maxrate的值越高,画面越清晰,但相对来说,保存的图片也就越多。有时候甚至一秒的图片分成27张来保存。当画面有变动时,还会把画面变动的视频保存在改文件夹下面,格式是avi。这就是数据的采集的初级过程。2.3 本章小结 本章详细阐述了树莓派的安装与使用,以及树莓派3摄像头视频软件motion的使用及数据的收集。树莓派3系统架构的搭建,包括系统、构件、以及软件的安装使用。还有的工作准备也是USB摄像头的适配,检测以及使用。最后是数据采集基础的视频软件motion的详细介绍,主要是视频流的展现,视频图片帧的保存,视频控制的配置等。

第三章 Flask框架数据接收以及交互由于对于网站性能、复杂度的要求不是很高,在综合考虑之后,选择了python开发的微型框架Flask。使用Flask,可以只选择一些必要的模块加入,不必在功能并不复杂的网站上使用很全面的框架。3.1 Flask的安装配置3.1.1 开发工具PyCharmPyCharm是由IDE开发公司Debian研发的一款PythonIDE。它除了基本的帮助开发者调试、语法高亮、代码补全等功能之外,它还帮助开发者管理项目结构,自带了环境的搭建,并且附带了单元测试。我们还可以通过各种快捷键,加快我们开发项目时的效率。文件内代码框架结构的展示,API的简单跳转。此外,它还支持许多大型项目的直接开发,Nodejs,Googleapp,当然也包括了Flask框架下的web网站开发。同时还满足对代码部署工具git和公共代码部署仓库GitHub的连接和支持。此外,由于PyCharm系列IDE对程序员的极度友好,被公认为IDE大法。本次毕业设计的网站部分就是由PyCharm为开发者工具,以python为开发语言,Flask为框架为基础进行开发的。好消息是,在校大学生可以凭借教育有效申请IDE的免费证书,从而使用免费、好用的IDE3.1.2打开PyCharm,可能需要注册,然后点击Newproject,选择Flask项目目录和对应的python版本,这里我选择python的最新稳定版本python3.6,然后为我们将要开发的框架取名字。在2017.3版以后的PyCharm中创建新的python项目时,PyCharm都会自动的为该项目创建一个新的venv[12]环境,并默认在该虚拟环境中安装其他依赖,在开发的过程中,可以在项目中添加一个requirements.txt文件,将项目中需要安装的package及其版本都记录在里面。当别人pull你的代码的时候,就可以根据requirements.txt,自动、轻松的把项目的环境搭建好。PyCharm有自动读取requirements.txt的功能。当然,作为开发者,我们既可以借助PyCharm的settings设置中projectstructure,去完成项目package管理,当然要选好对应的python环境。此外,作为开发人员,应该熟悉命令行控制,直接在PyCharm里面打开控制台,注意bash前面的(venv),这代表着现在处于当前项目的虚拟环境内。然后使用Python的下载工具Pip,进行所需package的下载、更新、卸载。3.2Flask实现视频流传输3.2.1流媒体流媒体[4]是一种技术,在这种技术得实施中,服务器会请求响应大块数据,然后得到对请求的响应。对此,我想出以下几个理由来解释为什么这可能有用:非常大的响应。必须在内存中组装响应,只返回给客户端,对于非常大的响应来说是低效的。另一种方法是把响应写到磁盘上,然后用Flask.send_file()返回文件,但这会增加混合的输入输出。假设数据可以用块生成,那么在小范围内提供响应是一个更好的解决方案。实时数据。对于某些应用程序来说,请求可能需要返回来自真实时间源的数据。一个很好的例子就是实时视频或音频。很多安全摄像头都使用这种技术将视频传输到网络浏览器上3.2.2使用Flask实现流式传输Python语言中的生成器generator[5],关键字yield,可以恢复和中断。详细介绍请见文献。一个生成器可以返回多个结果。Flask使用语言特性实现了我们所需要的流式传输defgen(camera):"""Videostreaminggeneratorfunction."""whileTrue:frame=camera.get_frame()yield(b'--frame\r\n'b'Content-Type:image/jpeg\r\n\r\n'+frame+b'\r\n')@app.route('/video_feed')defvideo_feed():"""Videostreamingroute.Putthisinthesrcattributeofanimgtag."""returnResponse(gen(Camera()),mimetype='multipart/x-mixed-replace;boundary=frame')video_feed是Flask下的路径函数,意味只要访问[http://yourip/video_feed]就可以在页面中看到函数的返回值,这里就是一个Response对象。当然,这里要实现数据流的展示,还需要前端Jinja2模板的配合。Response对象的数据为gen函数的返回值,而格式就是我们所需要的下面介绍的Multipart模式的数据格式。gen函数的参数是一个camera对象,每当从camera的流中获取到一个视频帧,就将它以Multipart数据模式存放在生成器中。即返回了程序意义上的视频直播流。3.2.3Multipart模式此次的视频流采用multipart模式.[6]。multipart模式本质上就是在response将请求的后一次图片将前一次请求的图片覆盖,从而达到动画效果。Multipartresponse主要由以下几个部分组成:header的类型是multipartcontent类型,各个部分由分界符号分隔,而每个part填充固定的content类型,这里就取image/jpeg。multipart视频流的结构如下:HTTP/1.1200OKContent-Type:multipart/x-mixed-replace;boundary=frame--frameContent-Type:image/jpeg<jpegdatahere>--frameContent-Type:image/jpeg<jpegdatahere>每次输出的content类型就是image/jpeg3.2.4Jinja2前端模板的实现Flask的前端页面是经过Jinja2模板[9]渲染生成,我们是通过图片覆盖的模式实现视频的播放,所以在前端页面需要渲染的就是img对象了,对应后端就是一个不断返回的generator对象啦。简单模板index.html:<html><head><title>VideoStreamingDemonstration</title></head><body><h1>VideoStreamingDemonstration</h1><imgsrc="{{url_for('video_feed')}}"></body></html其中url_for()渲染了video_feed函数的相对地址,即img指向video_feed返回的图片。video_feed这个地址又是返回视频流响应的generator对象,就相当于对图片不断更新,从而达到视频的过程。3.2.5代码结构之后剩下的工作就是实现Camera基础类,然后根据不同的需求完成不同的类代码的编写。为了封装考虑,我将视频流的获取单独封装成类使用,主要包括了图片库、opencv以及树莓派的camera。由于本次的目标是为了将视频流放置在服务器上,所以采取了延迟读取RaspberryPI3的视频帧,然后用falsk显示在网页上。另外两种方式也被实现了,但对于硬件设备的依赖,导致和motion的功能重叠,代码实现后,只做简单的介绍。区别在于数据的读取来源不同,Opencv直接通过本地的摄像头视频流,获取需要的帧数据。而树莓派3的camera类则是利用Picamera[7]对RaspberryPI3插入GPIO的摄像头获取视频数据帧。Picamera是一个pythonpackage,通过Picamera可以完成视频、图片的获取等。图3.2.1camera基础类的架构如图3.2.1所示,以上的三种视频流的读取方式都是由BaseCamera基础类继承而来。而在此封装之上,就只需要在单例中完成对frames()函数的继承复用,找出某种应用场景下的视频帧的获取。就可以完成对视频直播流的操作。比如对于树莓派来说,高级类的实现可以在下面的camera_pi.py中这样实现:classCamera(BaseCamera):@staticmethoddefframes():withpicamera.PiCamera()ascamera:#让摄像头预热time.sleep(2)stream=io.BytesIO()for_incamera.capture_continuous(stream,'jpeg',use_video_port=True):#返回当前帧stream.seek(0)yieldstream.read()#重置当前帧stream.seek(0)stream.truncate()其实也就是对frames()的继承使用,获取当前设备的流。3.3Flask与树莓派的交互由于树莓派只能在局域网内访问,没有固定的公网ip。所以服务器无法直接和树莓派进行通讯,所以数据及请求的传递也是一个急需解决的问题。3.3.1视频帧在树莓派3上运行一个帧传输文件,在后台执行,主要功能就是传输树莓派内的视频帧图片。设置延迟为3s,即Flask网站读取的视频流从3s前开始,防止实时数据的丢失、流传输的损失等问题。也就是做一个摄像头预热的功能。除了基本的视频流之外,还会把动态监测的结果,视频与图片也传输到服务器上,并由Flask显示在网页上。将动态检测的结果按时间显示。3.3.2交互在Flask网站上的视频页面有几个针对视频所要求获取的数据的功能按钮,比如snapshot、makemovie、stop等。这些请求由于我们不能直接访问局域网下的树莓派系统,所以我采用了Redis字典型数据库。树莓派轮询访问数据库内的关键字,当web网页发送请求时,所做的只是将Redis数据库内的key的开关改变状态。树莓派轮询到变化后,做出对本地服务的request,并回调开关。之后树莓派3方面该发数据的发送数据,该关闭摄像头的关闭。最后snapshot、makemovie分别在不同的页面展示效果。服务器端的处理程序@app.route('/',methods=['GET'])defindex():"""Videostreaminghomepage."""ifrequest.method=='GET':values=request.valuesifvalues.get('snapshot'):operate_snapshot()returnrender_template('/snapshot')ifvalues.get('makemovie'):operate_makemovie()returnrender_template('/makemovie')ifvalues.get('close'):operate_close()returnrender_template('index.html')每次网页接收到对/的GET请求时,后台都回去检查一下get的参数,如果有按钮的参数不为空的话,即request.values的相应对象不为None,就意味着对摄像头操作一次相应的操作。比方说,当我在前台点击snapshot按钮,这里的index会检查到有request请求,请求方式为get。接下来,根据代码逻辑就会去跑operate_snapshot()这个函数,之后返回的就是snapshot操作后相应的在Flask网页上显示的Flask页面。以日期为标记,分别对应不同的时间的截图。相应的录像也是,和截图的流程相差不多。但是录像的话,这里设置的时间为一分钟。默认设置为,当画面内不在产生动作时,结束录像。对于operate系列的函数,我举一个例子来说明他是如何完成与在局域网内的树莓派完成交互的。首先讲下原理,Flask服务器无法直接访问树莓派,这里设定是不在一个局域网里面。那样的话也就没办法对树莓派直接发送指令,也就不能完成通讯。对此,我们有两种解决的办法。http[14]请求Flask无法直接访问局域网下的树莓派,但树莓派却可以直接访问拥有公网ip的Flask服务器。只要在树莓派上轮询,发送http请求给Flask,请求中包括所需的开关参数。而相应的服务器端则在http请求的Response中给出相应开关参数的值。然后树莓派根据参数去决定是否进行对应操作。好处是,简单实用。缺点是:消耗资源,http连接不稳定。使用第三方库这里我选择了Redis数据库。它是一种key-value类型的nosql数据库。因其轻便、效率高而在缓存数据方面广泛使用。在这里,就是一个非常好的选择了。同时,对Redis数据库的增删查改操作也因为它的特性而非常方便。同时,它还对一些基础结构,包括列表、字典都提供了原子性操作,所以使用起来及节省时间又增加了效率。只要对数据库里的开关实行双向访问,类似于进程间通讯。两端的服务就是两个进程,这里两个进程却是两个在不同服务器上运行的服务。而Redis就充当了这两个进程之间通讯的管道,而开关则是他们之间共享的资源。但是由于对数据库的操作是非常快的,所以也就不需要利用加锁来解决问题。解释一下程序,所有的开关都放在operate_tunes.py文件中:以下是一个开关操作的函数:redis_config={"host":"myserver",#这里是服务器的公网域名或者公网ip"port":6379}#Redis连接对象redis_pool=redis.ConnectionPool(**redis_config)redis_conn=redis.redis(connection_pool=redis_pool)#举个例子,截图defoperate_snapshot():redis_conn.set("snapshot",1)首先是安装,我所使用的服务器是Ubuntu系统的,所以直接通过sudoapt-getinstallredis-server完成安装。然后再命令行下输入命令nohupredis-server&,在后台运行Redis服务,这样可以确保外来访问能一直作用在服务器端的Redis数据库上。然后我们使用python的外置库redis连接远程服务器上的Redis数据库。首先是配置,又是使用默认配置,没有启用密码,所以这里的配置字典中只有ip和port两个key值。然后使用Redis连接池,这样可以减少Redis连接和释放时的损耗。这样一来,我们每次使用的连接都会在连接池中进行存取。操作,当前端传来操作的信息,后台就将Redis数据库中的开关打开。这里默认1为打开,0为关闭。然后树莓派端轮询Redis数据库,检查并进行操作。树莓派端的脚本tunes.py的部分代码如下:redis_config={"host":"yourServer","port":6379}#redis连接对象redis_pool=redis.ConnectionPool(**redis_config)redis_conn=redis.Redis(connection_pool=redis_pool)whileTrue:snap=redis_conn.get("snapshot")ifsnap=='1':requests.get(SNAPSHOTURL)redis_conn.set("snapshot",0) #这里省略对数据库其他开关的轮询树莓派端保持着对远程Redis数据库的连接,当网页端发出请求时,会经过后台,Redis服务器,再传递到树莓派端。然后树莓派发起对本地的requests的get请求,也就是完成操作。同时将Redis数据库中的开关关闭。这是收尾工作。致此,我简单的将网页端对局域网内的树莓派进行操作的流程从理论到实现,大体的阐述了一遍。这里的数据和操作基本都依赖于树莓派的motion软件。3.4 本章小结本章主要阐述了Flask框架的使用准备。包括在python开发的一些注意点、工具和良好的习惯。同时详细展示了在web框架上通过multipartform数据播放实时视频流,包括视频帧的展现方式,前端html的嵌入。此外也介绍了在网页中设计的程序封装、逻辑的介绍。Web服务器程序是如何接受RaspberryPI视频帧,以及向它发送请求并获得回复的。同时也对如何从局域网外访问局域网内的树莓派这一难点进行了大致的解答。对于树莓派和Flask网页如何交互也以snapshot这一操作进行了全面的解释。致此,基于树莓派3的远程管理系统的大部分功能告一段落。

第四章 动态监测主要介绍了在树莓派端对数据采集过程中涉及到的动态检测,图像处理等功能的使用。4.1动态监测

4.1.1运动的阈值在motion的配置中,将运动的阈值设定合理的值来判定画面是否变化。这里的阈值以像素点的变化。默认设置为1500,如果前后两帧的图片中的像素点变化为1500,则被判定为运动了,然后输出图片,和连续变化的视频结果。对于图像中的噪声,也设定了一个阈值,被称为噪声阈值(Noisethreshold),主要用来对图片的中可能产生的噪声做一定的判断。默认阈值32。可以打开threshold_tune和noise_tune两个开关,设置为自动调整图像中的阈值条件。4.1.2运动的输出我们也可以在自己预先定义的区域(1-9)检测运动。区域被编号为:123456789 当运动被检测时,立即启动一个脚本(on_area检测),在一个给定的区域中检测到,但在一个事件中只有一次。可以用这个选项指定一个或多个区域。注意:此选项不限制对这些区域的检测。像素点的一次变化被认定为一次动作,一次照片的输出可以按照minimun_motion_frrames的值来决定,即一个运动照片的产生必须满足它的动作大于最小运动帧数。每次运动后就输出图片和录像。即像素点一运动时就拍照、录像。同时会给移动的物体划上小圈圈。图片,图像的右上角是像素点的变化个数。右下角是当前的时间。精确到秒。最后这些数据会通过交互脚本发送给服务器端,并在/motion_pic和/motion_video两个页面下展示。在这里,对Flask服务期端接收数据的源码也做简单解释。@app.route('/upload',methods=['GET','POST'])defupload():snapshots=list()videos=list()ifrequest.method=='POST':files=request.files.getlist('files')forfileinfiles:iffileandallowed_file(file.filename):filename=secure_filename(file.filename)else:continue#如果是截图则放到截图文件夹里面iffilename.split('.')[-1]isNone:file.save(os.path.join(app.config['UPLOAD_FOLDER']+'snapshot/',filename))eliffilename.rsplit('.',1)[1]=='avi':file.save(os.path.join(app.config['UPLOAD_FOLDER']+'video/',filename))else:file.save(os.path.join(app.config['UPLOAD_FOLDER']+'videoFrames/',filename))对于数据的传输,通过http请求中的post方式完成。post方式能绑定上传的数据。服务器端通过对urlpost请求的接收,来接收post请求附带的文件。这里要设定好文件的类型都为files。从此来保持文件上传和接受的一致。这里还做了对上传文件的文件名称的安全性检查。保证上传资源的安全。由于在树莓派端获取的资源是放在一处的,所以上传是可以一股脑的上传,但是接收就需要根据资源的类别分类了。其中截图会被放在我指定的Flask配置文件夹下的snapshot文件夹下面;录像则是在配置文件夹的makemovie文件夹下面;视频帧则会暂时保存在videoFrames文件夹下面。4.2并发访问 对于Flask的访问,当存在多客户端访问时,我们就需要对我们的直播流进行线程的控制。4.2.1摄像头事件类 在python中对于多线程的处理中运用到了Event[15],(事件)。在python的线程模块中,它作为一种信号标志存在,如果信号标志位为假,则该线程会一直等待,直到信号被其他线程设置成真。Event对象实现了简单的线程通信机制,它提供了设置信号,清除信号,等待等用于实现线程间的通信。因此在这里,我按照Event的思路,设计了专属的cameraEvent类。以下是该类的具体实现:classCameraEvent(object):"""AnEvent-likeclassthatsignalsallactiveclientswhenanewframeisavailable."""def__init__(self):self.events={}defwait(self):"""当每个客户端都等待下一帧时被调用."""ident=get_ident()ifidentnotinself.events:#thisisanewclient#addanentryforitintheself.eventsdict#eachentryhastwoelements,athreading.Event()andatimestampself.events[ident]=[threading.Event(),time.time()]returnself.events[ident][0].wait()defset(self):"""当新的一帧可用时被camera线程调用"""now=time.time()remove=Noneforident,eventinself.events.items():ifnotevent[0].isSet():#如果没有被设置就取设置它,否则更新event[0].set()event[1]=nowelse:#如果event没被设置,代表之前那一帧没有被展示#或者超时ifnow-event[1]>5:remove=identifremove:delself.events[remove]defclear(self):"""在一个图片帧被调用后clear."""self.events[get_ident()][0].clear()这就是我所设计的cameraEvent,在基础类中,它作为一个基础类的一个变量存在这。通过它,我们可以很好的控制线程间的通信。完成了包括wait、set、clear在内的事件的基本第五章总结与展望5.1 本文总结

温馨提示

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

评论

0/150

提交评论