基于樹莓派3的遠(yuǎn)程管理系統(tǒng)設(shè)計(jì)和實(shí)現(xiàn) 計(jì)算機(jī)科學(xué)與技術(shù)專業(yè)_第1頁
基于樹莓派3的遠(yuǎn)程管理系統(tǒng)設(shè)計(jì)和實(shí)現(xiàn) 計(jì)算機(jī)科學(xué)與技術(shù)專業(yè)_第2頁
基于樹莓派3的遠(yuǎn)程管理系統(tǒng)設(shè)計(jì)和實(shí)現(xiàn) 計(jì)算機(jī)科學(xué)與技術(shù)專業(yè)_第3頁
基于樹莓派3的遠(yuǎn)程管理系統(tǒng)設(shè)計(jì)和實(shí)現(xiàn) 計(jì)算機(jī)科學(xué)與技術(shù)專業(yè)_第4頁
基于樹莓派3的遠(yuǎn)程管理系統(tǒng)設(shè)計(jì)和實(shí)現(xiàn) 計(jì)算機(jī)科學(xué)與技術(shù)專業(yè)_第5頁
已閱讀5頁,還剩25頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

目錄前言 3第一章 緒論 41.1 研究背景及意義 41.2 RaspberryPI3 41.2.1基本介紹 41.2.2功能 51.3 Flask 51.3.1特性 51.3.2配置與慣例 61.4 本文的組織結(jié)構(gòu) 6第二章 樹莓派3的數(shù)據(jù)采集處理 72.1 樹莓派3 72.1.1規(guī)格說明 72.1.2利用noobs安裝 72.2 利用motion軟件獲取圖片 92.2.1 檢查USB攝像頭是否可用 92.2.2 視頻攝像頭軟件的安裝及使用 102.3 本章小結(jié) 12第三章 Flask框架數(shù)據(jù)接收以及交互 133.1 Flask的安裝配置 133.1.1 開發(fā)工具PyCharm 133.1.2 開發(fā)準(zhǔn)備 133.2Flask實(shí)現(xiàn)視頻流傳輸 143.2.1流媒體 143.2.2使用Flask實(shí)現(xiàn)流式傳輸 143.2.3Multipart模式 153.2.4Jinja2前端模板的實(shí)現(xiàn) 153.2.5代碼結(jié)構(gòu) 163.3Flask與樹莓派的交互 173.3.1視頻幀 173.3.2交互 183.4 本章小結(jié) 21第四章 動(dòng)態(tài)監(jiān)測(cè) 224.1動(dòng)態(tài)監(jiān)測(cè) 224.1.1運(yùn)動(dòng)的閾值 234.1.2運(yùn)動(dòng)的輸出 234.2并發(fā)訪問 244.2.1攝像頭事件類 24第五章總結(jié)與展望 265.1 本文總結(jié) 265.2 后續(xù)工作 27參考文獻(xiàn) 28致謝 29

摘要論文主要介紹了本次畢業(yè)設(shè)計(jì)的主要內(nèi)容,此次不僅涉及了傳統(tǒng)的c/s模型網(wǎng)站設(shè)計(jì)模式,也涉及了對(duì)底層硬件的視頻數(shù)據(jù)的收集,并對(duì)視頻進(jìn)行了動(dòng)態(tài)監(jiān)測(cè)的功能。即根據(jù)圖像中像素點(diǎn)的移動(dòng)、動(dòng)作檢測(cè)觸發(fā)器的觸發(fā),對(duì)當(dāng)前的視頻圖像采取截圖、錄像。并把圖片文件保留下來。而承載這一切的,就是功能強(qiáng)大的微型計(jì)算機(jī)樹莓派。樹莓派作為一個(gè)功能強(qiáng)大的微型計(jì)算機(jī),只需要接通顯示器和鍵盤就可以實(shí)現(xiàn)大多數(shù)在傳統(tǒng)電腦上能實(shí)現(xiàn)的功能,如文字處理、圖像處理等。隨著樹莓派配置的增強(qiáng)以及開源社區(qū)對(duì)樹莓派軟件系統(tǒng)的維護(hù),樹莓派漸漸脫離了單片機(jī)的范疇,但又靈活的區(qū)分于笨重的傳統(tǒng)電腦。網(wǎng)絡(luò)攝像頭簡(jiǎn)稱WEBCAM,英文全稱為WEBCAMERA,是一種結(jié)合傳統(tǒng)攝像機(jī)與網(wǎng)絡(luò)技術(shù)所產(chǎn)生的新一代攝像機(jī),只要標(biāo)準(zhǔn)的網(wǎng)絡(luò)瀏覽器(如"MicrosoftIE或Netscape),即可監(jiān)視其影像。本次使用的攝像頭就是樹莓派3所適配的網(wǎng)絡(luò)攝像頭。本次畢業(yè)設(shè)計(jì)運(yùn)用了樹莓派3適配的USB攝像機(jī),在網(wǎng)頁端使用python的Flask輕量級(jí)框架為基礎(chǔ),對(duì)攝像頭捕捉到的畫面進(jìn)行處理,控制。最終得到一個(gè)基于樹莓派3的遠(yuǎn)程管理系統(tǒng)。主要實(shí)現(xiàn)了,對(duì)樹莓派3連接攝像頭視頻數(shù)據(jù)的直播連接、當(dāng)出現(xiàn)動(dòng)態(tài)變化時(shí)的截圖以及視頻錄制保留功能、視頻截圖功能以及一系列樹莓派3的motion配置所支持的功能。當(dāng)然,對(duì)于出現(xiàn)在網(wǎng)頁端的視頻圖片,進(jìn)行了自動(dòng)的降噪處理等。關(guān)鍵詞:樹莓派;網(wǎng)絡(luò)攝像頭;視頻監(jiān)控;運(yùn)動(dòng)檢測(cè);圖像處理;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前言隨著科技的進(jìn)步,軟件和硬件都取得了長足進(jìn)步,其中硬件資源的支持,如CPU能力的加強(qiáng),存儲(chǔ)器的內(nèi)存的提升等,都為計(jì)算機(jī)行業(yè)的進(jìn)步做出了巨大的推動(dòng)作用。機(jī)器學(xué)習(xí)、人工智能、圖像識(shí)別等進(jìn)入了計(jì)算機(jī)從業(yè)人員甚至大眾的視野。而此次的畢業(yè)設(shè)計(jì),不僅涉及了傳統(tǒng)的c/s模型網(wǎng)站設(shè)計(jì)模式,也對(duì)收集的視頻數(shù)據(jù)進(jìn)行了動(dòng)態(tài)監(jiān)測(cè)的功能。即根據(jù)圖像中像素點(diǎn)的移動(dòng)、動(dòng)作檢測(cè)觸發(fā)器的觸發(fā),對(duì)當(dāng)前的視頻圖像采取截圖、錄像,然后保存在樹莓派的本地目錄里面。而承載這一切的,就是功能強(qiáng)大的微型計(jì)算機(jī)樹莓派。RaspberryPI3,是樹莓派的第三代產(chǎn)品,英文簡(jiǎn)寫為RPI3。RPI3是為以其便宜的價(jià)格、強(qiáng)大的功能而廣泛的在國外的計(jì)算機(jī)編程教育中使用,它的本體是信用卡大小的卡片式電腦,內(nèi)部裝載的系統(tǒng)則大多基于Linux。而隨著Windows10物聯(lián)網(wǎng)的發(fā)布,我們也可以在樹莓派上運(yùn)行類Windows的系統(tǒng),操作、界面、軟件方面都很類似。自RPI發(fā)布、問世以來,就受到眾多計(jì)算機(jī)發(fā)燒友和創(chuàng)客的追捧,在國外更是被一些高中當(dāng)做編程的啟發(fā)課程。本次使用Flask作為web的開發(fā)框架,它是用python語言開發(fā)的。Flask以輕量為特性。主要依賴兩個(gè)外部庫:模板引擎庫Jinja2和工具集WerkzeugWSGI。在此基礎(chǔ)上可以靈活的選用自己想要的數(shù)據(jù)庫模塊等。然后通過接收采集于樹莓派的視頻幀數(shù)據(jù),加以修飾并帶入Multipart模式,完成視頻直播流的實(shí)現(xiàn)。此外,通過python的requests庫,將截圖以及錄像等資源傳遞給Flask服務(wù)端,然后完成額外的功能展示。通過以上這些工具,加以幾個(gè)交互腳本構(gòu)成了我本次畢業(yè)設(shè)計(jì)的基礎(chǔ)框架。基于樹莓派3的遠(yuǎn)程管理系統(tǒng)就是在樹莓派端的motion軟件的后臺(tái)運(yùn)行下,配合交互腳本,在Falsk網(wǎng)頁上完成對(duì)遠(yuǎn)程樹莓派管理功能的一個(gè)系統(tǒng)。

第一章 緒論本章首先介紹了本次畢業(yè)設(shè)計(jì)的組成結(jié)構(gòu)和大體框架。也簡(jiǎn)單介紹了主要使用的兩個(gè)工具RaspberryPI和Flask的定義和內(nèi)容,并大體解了本文所做的主要工作,在緒論的最后陳列了本次畢業(yè)設(shè)計(jì)論文的寫作架構(gòu)。1.1 研究背景及意義有時(shí)候我們會(huì)苦惱于人力監(jiān)控成本和資源的浪費(fèi),在生活中、工作中視頻監(jiān)控以及視頻動(dòng)態(tài)檢測(cè)的需求,一個(gè)方便便攜的視頻管理系統(tǒng)的需求就應(yīng)運(yùn)而生了。隨著樹莓派的更新?lián)Q代,樹莓派的功能更加強(qiáng)大。樹莓派3的性能能夠更好的滿足一些發(fā)騷友的需求。各模塊的全支持,能讓我們可以更方便的應(yīng)用底層硬件,從而獲取一些我們所需要的數(shù)據(jù)來完成我們的項(xiàng)目。隨著時(shí)代的發(fā)展,軟件和硬件都取得了長足進(jìn)步,其中硬件資源的支持,如CPU能力的加強(qiáng),存儲(chǔ)器的內(nèi)存的提升等,都為計(jì)算機(jī)行業(yè)的進(jìn)步做出了巨大的推動(dòng)作用。機(jī)器學(xué)習(xí)、人工智能、圖像識(shí)別等先進(jìn)的知識(shí)也都進(jìn)入了計(jì)算機(jī)從業(yè)人員甚至大眾的視野。而此次的畢業(yè)設(shè)計(jì),不僅涉及了傳統(tǒng)的c/s模型網(wǎng)站設(shè)計(jì)模式,也對(duì)收集的視頻數(shù)據(jù)進(jìn)行了動(dòng)態(tài)監(jiān)測(cè)的功能。即根據(jù)圖像中像素點(diǎn)的移動(dòng)、動(dòng)作檢測(cè)觸發(fā)器的觸發(fā),對(duì)當(dāng)前的視頻圖像采取截圖、錄像。并把圖片文件保留下來。而承載這一切的,就是功能強(qiáng)大的微型計(jì)算機(jī)樹莓派。1.2 RaspberryPI31.2.1基本介紹樹莓派[8](為學(xué)生計(jì)算機(jī)編程教育設(shè)計(jì)的一種卡片式電腦)RaspberryPI3,是樹莓派的第三代產(chǎn)品,英文簡(jiǎn)寫為RPI3。3代表這是第三代產(chǎn)品。RPI3是為以其便宜的價(jià)格、強(qiáng)大的功能而廣泛的在國外的計(jì)算機(jī)編程教育中使用,它的本體是信用卡大小的卡片式電腦,內(nèi)部裝載的系統(tǒng)則大多基于Linux。而隨著物聯(lián)網(wǎng)概念的火熱起來,也一定程度上推動(dòng)了樹莓派的發(fā)展,由此我們也可以在樹莓派上運(yùn)行類Windows的系統(tǒng),操作、界面、軟件方面都很類似。自RPI公布以來,樹莓派就被眾多計(jì)算機(jī)愛好者和硬件愛好者所稱贊并使用,在國外更是被一些高中當(dāng)做變成的啟發(fā)課程。在其剛發(fā)布的時(shí)候,便呈現(xiàn)出了一機(jī)難求的場(chǎng)面。外觀看起來只是一塊板子的樹莓派,卻并不辜負(fù)其卡片電腦之名。各種模塊,一應(yīng)俱全。視頻、音頻、各種驅(qū)動(dòng)接口,在3代還自帶了無線模塊GPIO引腳,功能非常強(qiáng)大。1.2.2功能利用樹莓派我們可以完成很多有趣的事情,我們可以完全把它當(dāng)成一臺(tái)電腦使用,只是內(nèi)存和操作系統(tǒng)不如PC機(jī)強(qiáng)大而已。在存儲(chǔ)數(shù)據(jù)方面,RSP依靠SD卡來做依托,包括系統(tǒng)和文件以及驅(qū)動(dòng)的裝載。這也不同于普通的計(jì)算機(jī)主板依托于硬盤分區(qū)。在RSP上我們也可以觀看視頻,查看圖片,瀏覽網(wǎng)頁,編輯文檔,利用簡(jiǎn)易IDE編寫程序,還可以玩游戲,比如說《我的世界》。RaspberryPI雖然功能可人,但是它的價(jià)格也是相當(dāng)?shù)土?,這也就意味著使用人群、使用范圍的擴(kuò)大。因此,將其打造成一個(gè)多功能的媒體中心,然后供大家選擇。利用支持RaspberryPI3的簡(jiǎn)單視頻播放軟件,我們可以在樹莓派連接的顯示器上觀看視頻。供電也不局限于電源,USB接口就可以,甚至可以電視機(jī)的USB接口也滿足續(xù)電需求。在這次的設(shè)計(jì)中,樹莓派則可以看做一個(gè)終端在使用。數(shù)據(jù)的采集、收集、處理以及發(fā)送基本都由樹莓派來完成。凸顯出了樹莓派3的性能及計(jì)算能力。1.3 FlaskFlask[10]是由python語言開發(fā)的輕量級(jí)的web框架,所以必須在python環(huán)境下進(jìn)行安裝、編輯。1.3.1特性“輕量”(micro)并不是一整個(gè)web應(yīng)用就在一個(gè)python文件中存儲(chǔ)著,雖然這確實(shí)是可以的。但這不友好,對(duì)于開發(fā)者,對(duì)于web應(yīng)用的維護(hù)者。也不會(huì)因?yàn)檩p量而導(dǎo)致某些功能無法使用,只是用你可用。在提供基本的web應(yīng)用的使用配置及外部拓展之外,F(xiàn)lask需要開發(fā)者根據(jù)自己的需求,自己去增加所需的模塊、所需何種類型的模塊。保證核心但又易于擴(kuò)展。在開發(fā)的過程中,F(xiàn)lask也不會(huì)替開發(fā)者做出太多決策——比如使用何種數(shù)據(jù)庫。而那些Flask自己的默認(rèn)配置——比如哪種模板引擎——?jiǎng)t很容易替換。除此之外的一切增加修改都由可由開發(fā)者自己去掌握。如此,開發(fā)者在使用Flask的才能達(dá)到如驅(qū)臂使的感覺。默認(rèn)情況下,F(xiàn)lask并不包含表單驗(yàn)證在內(nèi)的,或是其它任何已經(jīng)被多種方式實(shí)現(xiàn)的的特定功能。然而,F(xiàn)lask支持開發(fā)者自己添加擴(kuò)展來給自己開發(fā)的應(yīng)用添加這些功能,最后顯示的效果更如同F(xiàn)lask本身實(shí)現(xiàn)自帶的一樣。外部眾多的擴(kuò)展由開發(fā)者提供。當(dāng)然包括了數(shù)據(jù)庫集成、表單驗(yàn)證、上傳處理、各種各樣的開放認(rèn)證技術(shù)等功能的支持與實(shí)現(xiàn)。Flask從一開始就是“微小”的,但它可以在開發(fā)者的運(yùn)用過程中借開發(fā)者之手不斷完善自己,最終變成一個(gè)應(yīng)對(duì)復(fù)雜功能的web應(yīng)用。1.3.2配置與慣例Flask因其強(qiáng)大的拓展性,導(dǎo)致其基本配置也是繁多,我們?cè)趧傞_始使用的時(shí)候,選擇其默認(rèn)的配置就足夠使用了。一般它的默認(rèn)配置,都是相對(duì)來說的明智,并支持初學(xué)者的使用。當(dāng)然,F(xiàn)lask也擁有著一些慣例,并積極遵循著。例如,按照Flask開發(fā)者的慣例,模板和靜態(tài)文件,在PyCharm中也被默認(rèn)綁定,分別存儲(chǔ)在項(xiàng)目文件下的子目錄

templates和

static

兩個(gè)文件夾里。當(dāng)然,根據(jù)前面所說的,這個(gè)配置也是可以修改,但是開發(fā)者們一般不會(huì)修改的,尤其是對(duì)于一些初學(xué)者來說。1.4 本文的組織結(jié)構(gòu)本文按照內(nèi)容的劃分被分為五章,各章內(nèi)容的詳細(xì)介紹如下:第一章:緒論。本章首先介紹了本次畢業(yè)設(shè)計(jì)的組成結(jié)構(gòu)和大體框架。也簡(jiǎn)單介紹了主要使用的兩個(gè)工具RaspberryPI和Flask的定義和內(nèi)容,并大體解了本文所做的主要工作,在緒論的最后陳列了本次畢業(yè)設(shè)計(jì)論文的寫作架構(gòu)。第二章:主要介紹了樹莓派USB攝像頭的數(shù)據(jù)處理功能。本章詳細(xì)闡述了如何使用樹莓派并對(duì)USB攝像頭收集的數(shù)據(jù)進(jìn)行采集、處理、發(fā)送等功能。第三章:主要介紹了如何使用Flask框架完成對(duì)樹莓派的數(shù)據(jù)接收以及交互。第四章:主要介紹了在樹莓派端對(duì)數(shù)據(jù)采集過程中涉及到的動(dòng)態(tài)檢測(cè),圖像處理等功能的使用。第五章:總結(jié)全文,提出未來工作的設(shè)想與展望。

第二章 樹莓派3的數(shù)據(jù)采集處理本章詳細(xì)闡述了樹莓派的安裝與使用,以及樹莓派3攝像頭視頻軟件motion的使用及收集。2.1 樹莓派3本節(jié)主要介紹了樹莓派3系統(tǒng)的安裝以及視頻數(shù)據(jù)采集前的準(zhǔn)備工作2.1.1規(guī)格說明表2.1.1樹莓派的規(guī)格型號(hào)

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高清解碼器內(nèi)存256MB(與GPU共享,可以理解為集成顯卡的顯存與內(nèi)存共享)512MB1GB(LPDDR2)USB2.0接口個(gè)數(shù)1(支持USBhub擴(kuò)展)2

4

視頻輸入15-針頭MIPI相機(jī)(CSI)界面,可被樹莓派相機(jī)或樹莓派相機(jī)(無紅外線版)使用影像輸出RCA視頻接口輸出,支持PAL和NTSC制式,支持HDMI(1.3和1.4),

他們的分辨率為640x350至1920x1200支持PAL和NTSC制式。網(wǎng)絡(luò)接口無10/100以太網(wǎng)接口10/100以太網(wǎng)接口802.11nWirelessLANBluetooth4.1BluetoothLowEnergy(BLE)操作系統(tǒng)DebianGNU/Linux、Fedora、ArchLinux、RISCOS,

2代B型以上型號(hào)還將支持Windows10IoT2.1.2利用noobs安裝Noobs是一款很方便的樹莓派系統(tǒng)的安裝工具,它幫助我們配置和啟動(dòng)樹莓派3[1]。當(dāng)然,我們也可以通過燒寫軟件將下載好的系統(tǒng)燒錄到準(zhǔn)備好的MircroSD卡里面。準(zhǔn)備Noobs系統(tǒng)、MicroSD卡、樹莓派3開發(fā)板、樹莓派3電源、HDMI線、支持HDMI的顯示器或電視機(jī)、一條網(wǎng)線(可選)、鍵盤、鼠標(biāo)步驟格式MiscroSD卡解壓NOOBS壓縮包,將NOOBS文件夾的全部?jī)?nèi)容拷貝到SD卡的根目錄SD卡插入樹莓派,并插上相關(guān)配件NOOBS會(huì)自動(dòng)分區(qū),如圖2.1.1所示圖2.1.1樹莓派系統(tǒng)自動(dòng)分區(qū)彈出安裝窗口,里面有幾個(gè)主流的樹莓派系統(tǒng),這里推薦選擇Raspbian,如圖所示,點(diǎn)擊Raspbian圖2.1.2選擇Raspbian系統(tǒng)點(diǎn)擊“InstallOS”按鈕,開始安裝Raspbian樹莓派系統(tǒng),安裝完成后重啟。圖2.1.3安裝過程安裝完成2.2 利用motion軟件獲取圖片樹莓派3除了通過GPIO引腳外接的攝像頭模塊,還支持樹莓派3系統(tǒng)支持的USB攝像頭。一般有官方的USB攝像頭發(fā)售。另外,在內(nèi)存和系統(tǒng)支持的情況下,可以支持多USB攝像頭。也就是說需要使用多個(gè)線程去進(jìn)行視頻的讀取。2.2.1 檢查USB攝像頭是否可用在樹莓派3的命令行界面下,輸入lsusb命令,根據(jù)命令行的輸出,獲得USB攝像頭設(shè)備已被識(shí)別或未識(shí)別的信息。RaspberryPI3安裝的Raspbian系統(tǒng)是一種類Unix/linux的系統(tǒng),一切皆文件,所有的配置都可以被具有超級(jí)管理員權(quán)限的用戶查看、修改。而USB攝像頭的掛載文件在/dev設(shè)備文件夾下,按照個(gè)數(shù)取名。如只有一個(gè)USBcamera的話,就掛載在/dev/video0文件中。在樹莓派3的命令行下輸入ls/dev/video*,如果有輸出,多個(gè)輸出,就代表有多個(gè)USBcamera已經(jīng)在被使用。2.2.2 視頻攝像頭軟件的安裝及使用在樹莓派中有三款軟件針對(duì)于USB攝像頭和RaspberryPI3自帶的GPIO攝像頭的軟件。包括fswebcam、mjpg-streamer、motion。這里主要介紹后面兩款軟件fswebcam一款小型攝像頭程序,主要用于拍攝照片,可以在Raspbian的package倉庫里直接下載。可以在樹莓派3命令下面通過以下命令sudoapt-getinstallfswebcam使用幫助可以在命令行內(nèi)使用fswebcam--helpmjpg-streamer[2]mjpg-streamer也是樹莓派3上面用來采集圖像的軟件。最后將webcamera攝像頭產(chǎn)生的視頻流在本地的局域網(wǎng)上面。支持包括微軟的IE瀏覽器在內(nèi)的多種瀏覽器,在基于樹莓派的基礎(chǔ)上,我們采用chrome瀏覽器。然后用戶可以在web端、移動(dòng)設(shè)備端等多種能接觸網(wǎng)絡(luò)的設(shè)備上查看視頻流。它也通過網(wǎng)絡(luò)攝像頭的硬件壓縮工能來降低CPU的開銷,這正是樹莓派所需要的功能。它為以RPS為代表的嵌入式設(shè)備提供了可靠穩(wěn)定的方案。其原因就是他將消耗大量時(shí)間的視頻幀的壓縮流程交給了底層的硬件去自主完成。比如說:在一個(gè)路由器上去編碼一個(gè)像素為960*720的視頻,假設(shè)路由器的主頻為180Mhz,那么mjpg-streamer將會(huì)減少接近10%的CPU消耗。相當(dāng)于使用硬件來減少CPU的工作量。motionmotion[3]是一個(gè)在GitHub上面開源的視頻監(jiān)控的軟件,支持包括了幾乎所有基于linux的多個(gè)平臺(tái)以及其他系統(tǒng)。遠(yuǎn)程管理系統(tǒng)也是基于motion而制作的。Motion展現(xiàn)的功能,有效的減少了我的工作量,滿足了此次設(shè)計(jì)的數(shù)據(jù)收集的需求。主要包括:支持USB攝像頭和webcam(可通過HTTP查看實(shí)時(shí)視頻直播的攝像頭)支持多攝像頭提供web訪問實(shí)時(shí)視頻功能(可以把USB攝像頭變成webcam)重點(diǎn)是運(yùn)動(dòng)檢測(cè),可以在畫面中出現(xiàn)活動(dòng)物體時(shí)才開始拍攝并記錄,實(shí)時(shí)記錄而不清理,只會(huì)導(dǎo)致存儲(chǔ)的庫存越來越多可以配置在運(yùn)動(dòng)事件發(fā)生時(shí)拍照、錄像,根據(jù)配置可以滿足以下的要求,(連續(xù)拍照,可選保存全部照片或只保存一張,保存一張可選保存第一張,最好的一張,或是運(yùn)動(dòng)在畫面中央的一張)可以配置各種事件觸發(fā)(比如在運(yùn)動(dòng)檢測(cè)發(fā)生時(shí)或者視頻照片保存后發(fā)個(gè)郵件什么的)可以配置web遠(yuǎn)程管理(用處不大,建議關(guān)閉)可以配置使用數(shù)據(jù)庫(支持MySQL和PostgreSQL)安裝同上,可以在RaspberryPI3的package中可以下載:sudoapt-getinstallmotion。如果出現(xiàn)錯(cuò)誤,可以先使用sudoapt-getinstallupgrade,對(duì)當(dāng)前樹莓派3系統(tǒng)raspbian系統(tǒng)的硬件依賴包的進(jìn)行必要的更新,之后在進(jìn)行安裝。配置在使用中,更改motion的系統(tǒng)配置,在配置文件/etc/motion/motion.conf中進(jìn)行以下默認(rèn)配置的修改。打開motiondaemon守護(hù)進(jìn)程,讓他可以一直在后臺(tái)運(yùn)行sudonano/etc/default/motion#no修改成yes:start_motion_daemon=yes修改motion的配置文件:sudovim/etc/motion/motion.conf#deamonoff改成ondeamonon#設(shè)置分辨率width800height600#關(guān)閉localhost的限制webcam_localhostoff然后運(yùn)行motion:sudomotion測(cè)試效果:現(xiàn)在我們的攝像頭已經(jīng)變成了一臺(tái)網(wǎng)絡(luò)攝像頭,在瀏覽器上訪問http://[your.domain]:8081,正是攝像頭的直播畫面。同時(shí),在配置下,motion會(huì)把攝像頭的圖片數(shù)據(jù)按照日期為名稱精確到秒,保存在樹莓派的/var/lib/motion文件下,格式是JPEG。圖片以motion配置的stream_maxrate為基礎(chǔ),將每秒的視頻畫面精確分幀,stream_maxrate的值越高,畫面越清晰,但相對(duì)來說,保存的圖片也就越多。有時(shí)候甚至一秒的圖片分成27張來保存。當(dāng)畫面有變動(dòng)時(shí),還會(huì)把畫面變動(dòng)的視頻保存在改文件夾下面,格式是avi。這就是數(shù)據(jù)的采集的初級(jí)過程。2.3 本章小結(jié) 本章詳細(xì)闡述了樹莓派的安裝與使用,以及樹莓派3攝像頭視頻軟件motion的使用及數(shù)據(jù)的收集。樹莓派3系統(tǒng)架構(gòu)的搭建,包括系統(tǒng)、構(gòu)件、以及軟件的安裝使用。還有的工作準(zhǔn)備也是USB攝像頭的適配,檢測(cè)以及使用。最后是數(shù)據(jù)采集基礎(chǔ)的視頻軟件motion的詳細(xì)介紹,主要是視頻流的展現(xiàn),視頻圖片幀的保存,視頻控制的配置等。

第三章 Flask框架數(shù)據(jù)接收以及交互由于對(duì)于網(wǎng)站性能、復(fù)雜度的要求不是很高,在綜合考慮之后,選擇了python開發(fā)的微型框架Flask。使用Flask,可以只選擇一些必要的模塊加入,不必在功能并不復(fù)雜的網(wǎng)站上使用很全面的框架。3.1 Flask的安裝配置3.1.1 開發(fā)工具PyCharmPyCharm是由IDE開發(fā)公司Debian研發(fā)的一款PythonIDE。它除了基本的幫助開發(fā)者調(diào)試、語法高亮、代碼補(bǔ)全等功能之外,它還幫助開發(fā)者管理項(xiàng)目結(jié)構(gòu),自帶了環(huán)境的搭建,并且附帶了單元測(cè)試。我們還可以通過各種快捷鍵,加快我們開發(fā)項(xiàng)目時(shí)的效率。文件內(nèi)代碼框架結(jié)構(gòu)的展示,API的簡(jiǎn)單跳轉(zhuǎn)。此外,它還支持許多大型項(xiàng)目的直接開發(fā),Nodejs,Googleapp,當(dāng)然也包括了Flask框架下的web網(wǎng)站開發(fā)。同時(shí)還滿足對(duì)代碼部署工具git和公共代碼部署倉庫GitHub的連接和支持。此外,由于PyCharm系列IDE對(duì)程序員的極度友好,被公認(rèn)為IDE大法。本次畢業(yè)設(shè)計(jì)的網(wǎng)站部分就是由PyCharm為開發(fā)者工具,以python為開發(fā)語言,F(xiàn)lask為框架為基礎(chǔ)進(jìn)行開發(fā)的。好消息是,在校大學(xué)生可以憑借教育有效申請(qǐng)IDE的免費(fèi)證書,從而使用免費(fèi)、好用的IDE3.1.2打開PyCharm,可能需要注冊(cè),然后點(diǎn)擊Newproject,選擇Flask項(xiàng)目目錄和對(duì)應(yīng)的python版本,這里我選擇python的最新穩(wěn)定版本python3.6,然后為我們將要開發(fā)的框架取名字。在2017.3版以后的PyCharm中創(chuàng)建新的python項(xiàng)目時(shí),PyCharm都會(huì)自動(dòng)的為該項(xiàng)目創(chuàng)建一個(gè)新的venv[12]環(huán)境,并默認(rèn)在該虛擬環(huán)境中安裝其他依賴,在開發(fā)的過程中,可以在項(xiàng)目中添加一個(gè)requirements.txt文件,將項(xiàng)目中需要安裝的package及其版本都記錄在里面。當(dāng)別人pull你的代碼的時(shí)候,就可以根據(jù)requirements.txt,自動(dòng)、輕松的把項(xiàng)目的環(huán)境搭建好。PyCharm有自動(dòng)讀取requirements.txt的功能。當(dāng)然,作為開發(fā)者,我們既可以借助PyCharm的settings設(shè)置中projectstructure,去完成項(xiàng)目package管理,當(dāng)然要選好對(duì)應(yīng)的python環(huán)境。此外,作為開發(fā)人員,應(yīng)該熟悉命令行控制,直接在PyCharm里面打開控制臺(tái),注意bash前面的(venv),這代表著現(xiàn)在處于當(dāng)前項(xiàng)目的虛擬環(huán)境內(nèi)。然后使用Python的下載工具Pip,進(jìn)行所需package的下載、更新、卸載。3.2Flask實(shí)現(xiàn)視頻流傳輸3.2.1流媒體流媒體[4]是一種技術(shù),在這種技術(shù)得實(shí)施中,服務(wù)器會(huì)請(qǐng)求響應(yīng)大塊數(shù)據(jù),然后得到對(duì)請(qǐng)求的響應(yīng)。對(duì)此,我想出以下幾個(gè)理由來解釋為什么這可能有用:非常大的響應(yīng)。必須在內(nèi)存中組裝響應(yīng),只返回給客戶端,對(duì)于非常大的響應(yīng)來說是低效的。另一種方法是把響應(yīng)寫到磁盤上,然后用Flask.send_file()返回文件,但這會(huì)增加混合的輸入輸出。假設(shè)數(shù)據(jù)可以用塊生成,那么在小范圍內(nèi)提供響應(yīng)是一個(gè)更好的解決方案。實(shí)時(shí)數(shù)據(jù)。對(duì)于某些應(yīng)用程序來說,請(qǐng)求可能需要返回來自真實(shí)時(shí)間源的數(shù)據(jù)。一個(gè)很好的例子就是實(shí)時(shí)視頻或音頻。很多安全攝像頭都使用這種技術(shù)將視頻傳輸?shù)骄W(wǎng)絡(luò)瀏覽器上3.2.2使用Flask實(shí)現(xiàn)流式傳輸Python語言中的生成器generator[5],關(guān)鍵字yield,可以恢復(fù)和中斷。詳細(xì)介紹請(qǐng)見文獻(xiàn)。一個(gè)生成器可以返回多個(gè)結(jié)果。Flask使用語言特性實(shí)現(xiàn)了我們所需要的流式傳輸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下的路徑函數(shù),意味只要訪問[http://yourip/video_feed]就可以在頁面中看到函數(shù)的返回值,這里就是一個(gè)Response對(duì)象。當(dāng)然,這里要實(shí)現(xiàn)數(shù)據(jù)流的展示,還需要前端Jinja2模板的配合。Response對(duì)象的數(shù)據(jù)為gen函數(shù)的返回值,而格式就是我們所需要的下面介紹的Multipart模式的數(shù)據(jù)格式。gen函數(shù)的參數(shù)是一個(gè)camera對(duì)象,每當(dāng)從camera的流中獲取到一個(gè)視頻幀,就將它以Multipart數(shù)據(jù)模式存放在生成器中。即返回了程序意義上的視頻直播流。3.2.3Multipart模式此次的視頻流采用multipart模式.[6]。multipart模式本質(zhì)上就是在response將請(qǐng)求的后一次圖片將前一次請(qǐng)求的圖片覆蓋,從而達(dá)到動(dòng)畫效果。Multipartresponse主要由以下幾個(gè)部分組成:header的類型是multipartcontent類型,各個(gè)部分由分界符號(hào)分隔,而每個(gè)part填充固定的content類型,這里就取image/jpeg。multipart視頻流的結(jié)構(gòu)如下: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前端模板的實(shí)現(xiàn)Flask的前端頁面是經(jīng)過Jinja2模板[9]渲染生成,我們是通過圖片覆蓋的模式實(shí)現(xiàn)視頻的播放,所以在前端頁面需要渲染的就是img對(duì)象了,對(duì)應(yīng)后端就是一個(gè)不斷返回的generator對(duì)象啦。簡(jiǎn)單模板index.html:<html><head><title>VideoStreamingDemonstration</title></head><body><h1>VideoStreamingDemonstration</h1><imgsrc="{{url_for('video_feed')}}"></body></html其中url_for()渲染了video_feed函數(shù)的相對(duì)地址,即img指向video_feed返回的圖片。video_feed這個(gè)地址又是返回視頻流響應(yīng)的generator對(duì)象,就相當(dāng)于對(duì)圖片不斷更新,從而達(dá)到視頻的過程。3.2.5代碼結(jié)構(gòu)之后剩下的工作就是實(shí)現(xiàn)Camera基礎(chǔ)類,然后根據(jù)不同的需求完成不同的類代碼的編寫。為了封裝考慮,我將視頻流的獲取單獨(dú)封裝成類使用,主要包括了圖片庫、opencv以及樹莓派的camera。由于本次的目標(biāo)是為了將視頻流放置在服務(wù)器上,所以采取了延遲讀取RaspberryPI3的視頻幀,然后用falsk顯示在網(wǎng)頁上。另外兩種方式也被實(shí)現(xiàn)了,但對(duì)于硬件設(shè)備的依賴,導(dǎo)致和motion的功能重疊,代碼實(shí)現(xiàn)后,只做簡(jiǎn)單的介紹。區(qū)別在于數(shù)據(jù)的讀取來源不同,Opencv直接通過本地的攝像頭視頻流,獲取需要的幀數(shù)據(jù)。而樹莓派3的camera類則是利用Picamera[7]對(duì)RaspberryPI3插入GPIO的攝像頭獲取視頻數(shù)據(jù)幀。Picamera是一個(gè)pythonpackage,通過Picamera可以完成視頻、圖片的獲取等。圖3.2.1camera基礎(chǔ)類的架構(gòu)如圖3.2.1所示,以上的三種視頻流的讀取方式都是由BaseCamera基礎(chǔ)類繼承而來。而在此封裝之上,就只需要在單例中完成對(duì)frames()函數(shù)的繼承復(fù)用,找出某種應(yīng)用場(chǎng)景下的視頻幀的獲取。就可以完成對(duì)視頻直播流的操作。比如對(duì)于樹莓派來說,高級(jí)類的實(shí)現(xiàn)可以在下面的camera_pi.py中這樣實(shí)現(xiàn):classCamera(BaseCamera):@staticmethoddefframes():withpicamera.PiCamera()ascamera:#讓攝像頭預(yù)熱t(yī)ime.sleep(2)stream=io.BytesIO()for_incamera.capture_continuous(stream,'jpeg',use_video_port=True):#返回當(dāng)前幀stream.seek(0)yieldstream.read()#重置當(dāng)前幀stream.seek(0)stream.truncate()其實(shí)也就是對(duì)frames()的繼承使用,獲取當(dāng)前設(shè)備的流。3.3Flask與樹莓派的交互由于樹莓派只能在局域網(wǎng)內(nèi)訪問,沒有固定的公網(wǎng)ip。所以服務(wù)器無法直接和樹莓派進(jìn)行通訊,所以數(shù)據(jù)及請(qǐng)求的傳遞也是一個(gè)急需解決的問題。3.3.1視頻幀在樹莓派3上運(yùn)行一個(gè)幀傳輸文件,在后臺(tái)執(zhí)行,主要功能就是傳輸樹莓派內(nèi)的視頻幀圖片。設(shè)置延遲為3s,即Flask網(wǎng)站讀取的視頻流從3s前開始,防止實(shí)時(shí)數(shù)據(jù)的丟失、流傳輸?shù)膿p失等問題。也就是做一個(gè)攝像頭預(yù)熱的功能。除了基本的視頻流之外,還會(huì)把動(dòng)態(tài)監(jiān)測(cè)的結(jié)果,視頻與圖片也傳輸?shù)椒?wù)器上,并由Flask顯示在網(wǎng)頁上。將動(dòng)態(tài)檢測(cè)的結(jié)果按時(shí)間顯示。3.3.2交互在Flask網(wǎng)站上的視頻頁面有幾個(gè)針對(duì)視頻所要求獲取的數(shù)據(jù)的功能按鈕,比如snapshot、makemovie、stop等。這些請(qǐng)求由于我們不能直接訪問局域網(wǎng)下的樹莓派系統(tǒng),所以我采用了Redis字典型數(shù)據(jù)庫。樹莓派輪詢?cè)L問數(shù)據(jù)庫內(nèi)的關(guān)鍵字,當(dāng)web網(wǎng)頁發(fā)送請(qǐng)求時(shí),所做的只是將Redis數(shù)據(jù)庫內(nèi)的key的開關(guān)改變狀態(tài)。樹莓派輪詢到變化后,做出對(duì)本地服務(wù)的request,并回調(diào)開關(guān)。之后樹莓派3方面該發(fā)數(shù)據(jù)的發(fā)送數(shù)據(jù),該關(guān)閉攝像頭的關(guān)閉。最后snapshot、makemovie分別在不同的頁面展示效果。服務(wù)器端的處理程序@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')每次網(wǎng)頁接收到對(duì)/的GET請(qǐng)求時(shí),后臺(tái)都回去檢查一下get的參數(shù),如果有按鈕的參數(shù)不為空的話,即request.values的相應(yīng)對(duì)象不為None,就意味著對(duì)攝像頭操作一次相應(yīng)的操作。比方說,當(dāng)我在前臺(tái)點(diǎn)擊snapshot按鈕,這里的index會(huì)檢查到有request請(qǐng)求,請(qǐng)求方式為get。接下來,根據(jù)代碼邏輯就會(huì)去跑operate_snapshot()這個(gè)函數(shù),之后返回的就是snapshot操作后相應(yīng)的在Flask網(wǎng)頁上顯示的Flask頁面。以日期為標(biāo)記,分別對(duì)應(yīng)不同的時(shí)間的截圖。相應(yīng)的錄像也是,和截圖的流程相差不多。但是錄像的話,這里設(shè)置的時(shí)間為一分鐘。默認(rèn)設(shè)置為,當(dāng)畫面內(nèi)不在產(chǎn)生動(dòng)作時(shí),結(jié)束錄像。對(duì)于operate系列的函數(shù),我舉一個(gè)例子來說明他是如何完成與在局域網(wǎng)內(nèi)的樹莓派完成交互的。首先講下原理,F(xiàn)lask服務(wù)器無法直接訪問樹莓派,這里設(shè)定是不在一個(gè)局域網(wǎng)里面。那樣的話也就沒辦法對(duì)樹莓派直接發(fā)送指令,也就不能完成通訊。對(duì)此,我們有兩種解決的辦法。http[14]請(qǐng)求Flask無法直接訪問局域網(wǎng)下的樹莓派,但樹莓派卻可以直接訪問擁有公網(wǎng)ip的Flask服務(wù)器。只要在樹莓派上輪詢,發(fā)送http請(qǐng)求給Flask,請(qǐng)求中包括所需的開關(guān)參數(shù)。而相應(yīng)的服務(wù)器端則在http請(qǐng)求的Response中給出相應(yīng)開關(guān)參數(shù)的值。然后樹莓派根據(jù)參數(shù)去決定是否進(jìn)行對(duì)應(yīng)操作。好處是,簡(jiǎn)單實(shí)用。缺點(diǎn)是:消耗資源,http連接不穩(wěn)定。使用第三方庫這里我選擇了Redis數(shù)據(jù)庫。它是一種key-value類型的nosql數(shù)據(jù)庫。因其輕便、效率高而在緩存數(shù)據(jù)方面廣泛使用。在這里,就是一個(gè)非常好的選擇了。同時(shí),對(duì)Redis數(shù)據(jù)庫的增刪查改操作也因?yàn)樗奶匦远浅7奖?。同時(shí),它還對(duì)一些基礎(chǔ)結(jié)構(gòu),包括列表、字典都提供了原子性操作,所以使用起來及節(jié)省時(shí)間又增加了效率。只要對(duì)數(shù)據(jù)庫里的開關(guān)實(shí)行雙向訪問,類似于進(jìn)程間通訊。兩端的服務(wù)就是兩個(gè)進(jìn)程,這里兩個(gè)進(jìn)程卻是兩個(gè)在不同服務(wù)器上運(yùn)行的服務(wù)。而Redis就充當(dāng)了這兩個(gè)進(jìn)程之間通訊的管道,而開關(guān)則是他們之間共享的資源。但是由于對(duì)數(shù)據(jù)庫的操作是非常快的,所以也就不需要利用加鎖來解決問題。解釋一下程序,所有的開關(guān)都放在operate_tunes.py文件中:以下是一個(gè)開關(guān)操作的函數(shù):redis_config={"host":"myserver",#這里是服務(wù)器的公網(wǎng)域名或者公網(wǎng)ip"port":6379}#Redis連接對(duì)象redis_pool=redis.ConnectionPool(**redis_config)redis_conn=redis.redis(connection_pool=redis_pool)#舉個(gè)例子,截圖defoperate_snapshot():redis_conn.set("snapshot",1)首先是安裝,我所使用的服務(wù)器是Ubuntu系統(tǒng)的,所以直接通過sudoapt-getinstallredis-server完成安裝。然后再命令行下輸入命令nohupredis-server&,在后臺(tái)運(yùn)行Redis服務(wù),這樣可以確保外來訪問能一直作用在服務(wù)器端的Redis數(shù)據(jù)庫上。然后我們使用python的外置庫redis連接遠(yuǎn)程服務(wù)器上的Redis數(shù)據(jù)庫。首先是配置,又是使用默認(rèn)配置,沒有啟用密碼,所以這里的配置字典中只有ip和port兩個(gè)key值。然后使用Redis連接池,這樣可以減少Redis連接和釋放時(shí)的損耗。這樣一來,我們每次使用的連接都會(huì)在連接池中進(jìn)行存取。操作,當(dāng)前端傳來操作的信息,后臺(tái)就將Redis數(shù)據(jù)庫中的開關(guān)打開。這里默認(rèn)1為打開,0為關(guān)閉。然后樹莓派端輪詢Redis數(shù)據(jù)庫,檢查并進(jìn)行操作。樹莓派端的腳本tunes.py的部分代碼如下:redis_config={"host":"yourServer","port":6379}#redis連接對(duì)象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) #這里省略對(duì)數(shù)據(jù)庫其他開關(guān)的輪詢樹莓派端保持著對(duì)遠(yuǎn)程Redis數(shù)據(jù)庫的連接,當(dāng)網(wǎng)頁端發(fā)出請(qǐng)求時(shí),會(huì)經(jīng)過后臺(tái),Redis服務(wù)器,再傳遞到樹莓派端。然后樹莓派發(fā)起對(duì)本地的requests的get請(qǐng)求,也就是完成操作。同時(shí)將Redis數(shù)據(jù)庫中的開關(guān)關(guān)閉。這是收尾工作。致此,我簡(jiǎn)單的將網(wǎng)頁端對(duì)局域網(wǎng)內(nèi)的樹莓派進(jìn)行操作的流程從理論到實(shí)現(xiàn),大體的闡述了一遍。這里的數(shù)據(jù)和操作基本都依賴于樹莓派的motion軟件。3.4 本章小結(jié)本章主要闡述了Flask框架的使用準(zhǔn)備。包括在python開發(fā)的一些注意點(diǎn)、工具和良好的習(xí)慣。同時(shí)詳細(xì)展示了在web框架上通過multipartform數(shù)據(jù)播放實(shí)時(shí)視頻流,包括視頻幀的展現(xiàn)方式,前端html的嵌入。此外也介紹了在網(wǎng)頁中設(shè)計(jì)的程序封裝、邏輯的介紹。Web服務(wù)器程序是如何接受RaspberryPI視頻幀,以及向它發(fā)送請(qǐng)求并獲得回復(fù)的。同時(shí)也對(duì)如何從局域網(wǎng)外訪問局域網(wǎng)內(nèi)的樹莓派這一難點(diǎn)進(jìn)行了大致的解答。對(duì)于樹莓派和Flask網(wǎng)頁如何交互也以snapshot這一操作進(jìn)行了全面的解釋。致此,基于樹莓派3的遠(yuǎn)程管理系統(tǒng)的大部分功能告一段落。

第四章 動(dòng)態(tài)監(jiān)測(cè)主要介紹了在樹莓派端對(duì)數(shù)據(jù)采集過程中涉及到的動(dòng)態(tài)檢測(cè),圖像處理等功能的使用。4.1動(dòng)態(tài)監(jiān)測(cè)

4.1.1運(yùn)動(dòng)的閾值在motion的配置中,將運(yùn)動(dòng)的閾值設(shè)定合理的值來判定畫面是否變化。這里的閾值以像素點(diǎn)的變化。默認(rèn)設(shè)置為1500,如果前后兩幀的圖片中的像素點(diǎn)變化為1500,則被判定為運(yùn)動(dòng)了,然后輸出圖片,和連續(xù)變化的視頻結(jié)果。對(duì)于圖像中的噪聲,也設(shè)定了一個(gè)閾值,被稱為噪聲閾值(Noisethreshold),主要用來對(duì)圖片的中可能產(chǎn)生的噪聲做一定的判斷。默認(rèn)閾值32??梢源蜷_threshold_tune和noise_tune兩個(gè)開關(guān),設(shè)置為自動(dòng)調(diào)整圖像中的閾值條件。4.1.2運(yùn)動(dòng)的輸出我們也可以在自己預(yù)先定義的區(qū)域(1-9)檢測(cè)運(yùn)動(dòng)。區(qū)域被編號(hào)為:123456789 當(dāng)運(yùn)動(dòng)被檢測(cè)時(shí),立即啟動(dòng)一個(gè)腳本(on_area檢測(cè)),在一個(gè)給定的區(qū)域中檢測(cè)到,但在一個(gè)事件中只有一次??梢杂眠@個(gè)選項(xiàng)指定一個(gè)或多個(gè)區(qū)域。注意:此選項(xiàng)不限制對(duì)這些區(qū)域的檢測(cè)。像素點(diǎn)的一次變化被認(rèn)定為一次動(dòng)作,一次照片的輸出可以按照minimun_motion_frrames的值來決定,即一個(gè)運(yùn)動(dòng)照片的產(chǎn)生必須滿足它的動(dòng)作大于最小運(yùn)動(dòng)幀數(shù)。每次運(yùn)動(dòng)后就輸出圖片和錄像。即像素點(diǎn)一運(yùn)動(dòng)時(shí)就拍照、錄像。同時(shí)會(huì)給移動(dòng)的物體劃上小圈圈。圖片,圖像的右上角是像素點(diǎn)的變化個(gè)數(shù)。右下角是當(dāng)前的時(shí)間。精確到秒。最后這些數(shù)據(jù)會(huì)通過交互腳本發(fā)送給服務(wù)器端,并在/motion_pic和/motion_video兩個(gè)頁面下展示。在這里,對(duì)Flask服務(wù)期端接收數(shù)據(jù)的源碼也做簡(jiǎn)單解釋。@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))對(duì)于數(shù)據(jù)的傳輸,通過http請(qǐng)求中的post方式完成。post方式能綁定上傳的數(shù)據(jù)。服務(wù)器端通過對(duì)urlpost請(qǐng)求的接收,來接收post請(qǐng)求附帶的文件。這里要設(shè)定好文件的類型都為files。從此來保持文件上傳和接受的一致。這里還做了對(duì)上傳文件的文件名稱的安全性檢查。保證上傳資源的安全。由于在樹莓派端獲取的資源是放在一處的,所以上傳是可以一股腦的上傳,但是接收就需要根據(jù)資源的類別分類了。其中截圖會(huì)被放在我指定的Flask配置文件夾下的snapshot文件夾下面;錄像則是在配置文件夾的makemovie文件夾下面;視頻幀則會(huì)暫時(shí)保存在videoFrames文件夾下面。4.2并發(fā)訪問 對(duì)于Flask的訪問,當(dāng)存在多客戶端訪問時(shí),我們就需要對(duì)我們的直播流進(jìn)行線程的控制。4.2.1攝像頭事件類 在python中對(duì)于多線程的處理中運(yùn)用到了Event[15],(事件)。在python的線程模塊中,它作為一種信號(hào)標(biāo)志存在,如果信號(hào)標(biāo)志位為假,則該線程會(huì)一直等待,直到信號(hào)被其他線程設(shè)置成真。Event對(duì)象實(shí)現(xiàn)了簡(jiǎn)單的線程通信機(jī)制,它提供了設(shè)置信號(hào),清除信號(hào),等待等用于實(shí)現(xiàn)線程間的通信。因此在這里,我按照Event的思路,設(shè)計(jì)了專屬的cameraEvent類。以下是該類的具體實(shí)現(xiàn):classCameraEvent(object):"""AnEvent-likeclassthatsignalsallactiveclientswhenanewframeisavailable."""def__init__(self):self.events={}defwait(self):"""當(dāng)每個(gè)客戶端都等待下一幀時(shí)被調(diào)用."""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):"""當(dāng)新的一幀可用時(shí)被camera線程調(diào)用"""now=time.time()remove=Noneforident,eventinself.events.items():ifnotevent[0].isSet():#如果沒有被設(shè)置就取設(shè)置它,否則更新event[0].set()event[1]=nowelse:#如果event沒被設(shè)置,代表之前那一幀沒有被展示#或者超時(shí)ifnow-event[1]>5:remove=identifremove:delself.events[remove]defclear(self):"""在一個(gè)圖片幀被調(diào)用后clear."""self.events[get_ident()][0].clear()這就是我所設(shè)計(jì)的cameraEvent,在基礎(chǔ)類中,它作為一個(gè)基礎(chǔ)類的一個(gè)變量存在這。通過它,我們可以很好的控制線程間的通信。完成了包括wait、set、clear在內(nèi)的事件的基本第五章總結(jié)與展望5.1 本文總結(jié)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論