Python實現(xiàn)樹莓派攝像頭持續(xù)錄像并傳送到主機的步驟

      網(wǎng)友投稿 919 2022-05-29

      關于樹莓派,想必從事嵌入式開發(fā)的開發(fā)者都有聽過,樹莓派原名為Raspberry Pi,也就是它的英文讀法,樹莓派誕生于英國,由“Raspberry Pi 基金會”這個慈善組織注冊開發(fā)。埃?厄普頓就是該項目的頭目。在2012年的3月,英國劍橋大學埃本?阿普頓(Eben Epton)正式發(fā)售世界上最小的臺式機,又稱卡片式電腦,外形只有信用卡大小,卻具有電腦的所有基本功能,這就是Raspberry Pi電腦板,中文譯名”樹莓派”!

      樹莓派作為一個輕便迷你的小終端很受大眾的喜愛!!!

      樹莓派的特點

      與常見的51單片機和STM32等這類的嵌入式微控制器相比,不僅可以完成相同的IO引腳控制之外,還能運行有相應的操作系統(tǒng),可以完成更復雜的任務管理與調(diào)度,能夠支持更上層應用的開發(fā),為了開發(fā)者提供了更廣闊的應用空間。比如開發(fā)語言的選擇不僅僅只限于C語言,連接底層硬件與上層應用,可以實現(xiàn)物聯(lián)網(wǎng)的云控制和云管理,也可以忽略樹莓派的IO控制,使用樹莓派搭建小型的網(wǎng)絡服務器,做一些小型的測試開發(fā)和服務。

      與一般的PC計算機平臺相比,樹莓派可以提供的IO引腳,能夠直接控制其他底層硬件的功能,這是一般PC計算機做不到的,當然,樹莓派體積小,成本低,照常可以完成一些PC任務與應用。

      樹莓派自帶的攝像頭拍攝夜空是有先例的,起碼可以做到延時攝影。對于實時拍攝沒有研究,但是仍然有必要測試。

      樹莓派自帶的攝像頭是500萬像素,價格在26-29歐元(人民幣200+左右)

      實時還是事后采集記錄結果?

      樹莓派上的攝像機,是使用一個 raspivid 命令操作的。 拋開這個命令的其他參數(shù),其輸出數(shù)據(jù)有2種方式:

      將數(shù)據(jù)保存成文件,儲存在SD卡上,以便事后讀取;

      將數(shù)據(jù)按照字節(jié)流的形式,直接輸出到STDOUT標準輸出中,可以實時獲取。

      選擇哪種方式,首先要考慮我們能否具有足夠的采集數(shù)據(jù)的能力。

      raspivid 命令可以調(diào)節(jié)相機模塊的輸出比特率。輸出是以 H264 編碼輸出的,比特率一般默認是17Mbps,但是這個數(shù)字可以調(diào)小。 如果按照17Mbps算,就是一秒鐘2.12兆字節(jié)。 我們記錄數(shù)據(jù)或者獲取數(shù)據(jù)的速度不能低于這個值,否則長時間錄像可能造成樹莓派的緩存充滿,導致樹莓派崩潰。

      樹莓派的網(wǎng)卡是使用了其USB總線,傳送速度是100Mb/s或者12.5MB/s。 實際上后文的實驗表明,目前能達到的傳送速度只有 3MB/s(TCP) 或者 6MB/s(UDP) 。

      如果使用SD卡存儲,這個記錄速度也是可以達到的,但是,SD卡有寫入壽命,這是要考慮的。 例如,對于32GB的卡,即使我們能利用全部存儲空間,以2MB/s的速度錄像,也只能記錄4.55小時。

      如何通過網(wǎng)絡實時傳送數(shù)據(jù)?

      raspivid 命令的 -o 選項,就是用來指定輸出文件的。 在Linux系統(tǒng)中,輸出到文件并不等于寫入到磁盤(這里是SD卡)。 我們?nèi)匀豢赡苁褂?RAMDisk 這種技術,讓輸出只是暫時存儲在內(nèi)存中,并稍后讀取,然后刪除之。 但是,樹莓派的可用內(nèi)存可能只有 280MB ,這最多只能記錄差不多2分鐘的視頻。

      如果我們有文件形式的攝像記錄,那么就似乎可以使用文件傳輸?shù)膮f(xié)議,例如 sftp, scp 等等登錄到樹莓派下載文件了。 然而這是不對的。這些協(xié)議在傳輸中使用了加密。

      樹莓派在向我們的電腦進行數(shù)據(jù)傳送的時候,如果用這些協(xié)議,就必須先對發(fā)送的數(shù)據(jù)進行加密。 在互聯(lián)網(wǎng)上,加密是很好的設計。但是在樹莓派和電腦之間只用一根網(wǎng)線連接的時候,就不是了。 樹莓派的運算能力是很有限的,使用加密只會讓傳送速度變慢,所以,不要使用加密!

      我們使用最原始而簡單的方法:使用 netcat命令 ,在筆記本電腦這一端監(jiān)聽數(shù)據(jù)輸入。 在樹莓派這一端,我們讓 raspivid 獲取一定周期(比如10分鐘,也許可以更長)的錄像, 將結果設定為直接輸出,然后利用Linux的管道機制,直接送進 netcat 發(fā)送。

      配置由樹莓派和筆記本構成的網(wǎng)絡

      樹莓派和筆記本電腦之間的連接,使用普通網(wǎng)線即可, 因為筆記本和樹莓派上的網(wǎng)卡都能自動適應網(wǎng)線,設定正確的模式(正常來說要使用交叉網(wǎng)線)。

      重要的一步是,筆記本電腦和樹莓派連接后構成的網(wǎng)絡中,需要手動為兩個設備設定IP地址。 對于筆記本電腦的設定,就比較簡單了。 我們將筆記本電腦和樹莓派相連的網(wǎng)卡上,將電腦的 IP地址設定為xxx.xxx.x.xxx , 子網(wǎng)掩碼為255.255.255.0 , 網(wǎng)關不要填 ``。

      配置樹莓派的方法是,先將樹莓派斷電,然后取出所用的SD卡,用讀卡器插回電腦。 在SD卡的boot分區(qū)中,有個cmdline.txt,這是樹莓派開機時所用到的一些參數(shù)。

      打開這個文件,會發(fā)現(xiàn)里面只有一行。這一行中用空格分開了很多設定參數(shù)。 我們在這一行的結尾,不添加空行,直接加上空格,然后寫上: ip=xxx.xxx.x.xxx

      當然如果這一行里面已經(jīng)有了ip=的參數(shù),應該直接修改它。

      這樣的結果就是,樹莓派開機之后,會自己選擇這個IP地址作為自己的地址。

      實現(xiàn)在筆記本上監(jiān)聽輸入

      netcat命令,在每收到一個文件的EOF(End Of File,表明文件已經(jīng)到結尾),就會退出。 我們?yōu)榱俗尳邮漳軌蜻B續(xù)進行,需要用腳本連續(xù)運行這個命令。 這樣就會為每個新接收到的視頻,在筆記本電腦這一端建立一個文件用來存儲。

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      25

      26

      27

      28

      29

      30

      31

      32

      33

      34

      35

      36

      37

      38

      39

      40

      41

      42

      43

      44

      45

      46

      47

      48

      49

      50

      51

      52

      # -*- coding: utf-8 -*-

      import os

      import signal

      import subprocess

      import sys

      Python實現(xiàn)樹莓派攝像頭持續(xù)錄像并傳送到主機的步驟

      import uuid

      # 獲取程序運行的本地目錄,和用來存儲接收結果的recv文件夾目錄

      BASEPATH = os.path.realpath(os.path.dirname(sys.argv[0]))

      RECV = os.path.join(BASEPATH, 'recv')

      # 如果接收目錄不存在,就自動新建

      print " *** Received files are put into: %s" % RECV

      if not os.path.isdir(RECV):

      os.system('mkdir -p %s' % RECV)

      # 下面的部分用來記錄正在等待接收的文件。這個文件會以一個UUID.tmp的格式命名。

      # 在接收成功后,就會被重命名為UUID。(UUID是一個特定格式的唯一字符串,不會重復)。

      # 如果在接收過程中按下Ctrl+C,就會發(fā)送一個終止命令給程序,這樣程序會退出,

      # 并刪除沒有接收完整的那個文件。

      working = False

      fullname = False

      def sigint_handler(signum, frame):

      global fullname, working

      print "\n"

      print " *** SIGINT detected. End the program."

      if working and fullname != False:

      print " *** Unfinished recording deleted."

      os.system('rm -f %s.tmp' % fullname)

      exit()

      signal.signal(signal.SIGINT, sigint_handler)

      # 使用一個死循環(huán)來不斷運行netcat(nc)命令。

      n = 1

      while True:

      recname = str(uuid.uuid1())

      print " [%8d] Listening for file [%s]. Use Ctrl+C to stop this script." % (n, recname)

      fullname = os.path.join(RECV, recname)

      working = True # 標記接收開始

      # 使用 nc -lp 10401 命令接收數(shù)據(jù),表明端口為10401。

      subprocess.call('nc -lp 10401 > %s.tmp' % fullname, shell=True)

      os.system('mv %s.tmp %s' % (fullname, fullname))

      working = False # 標記接收完畢

      n += 1

      上文所述的腳本,在筆記本上運行之后,就會在本地開啟10401端口,等待樹莓派上傳送的文件。 傳送的會直接寫入一個由UUID(全局唯一ID)標識的文件中,可以供以后處理。

      在樹莓派上攝像并發(fā)送攝像結果

      在樹莓派上命令拍攝的方法是:

      $ raspivid -o - -b 16000000 -t 100000 | nc xxx.xxx.x.xxx 10401

      這條指令的意義如下:

      -o - ,使用-o設定輸出,-表示直接輸出到標準輸出中,不寫入文件。

      -b 16000000 ,設定輸出比特率為16000000 bit/s。這大約是2兆字節(jié)每秒。

      -t 100000 ,設定錄像時間為100000毫秒,亦即100秒。

      | nc xxx.xxx.x.xxx 10401 ,使用管道|將結果導入到nc中,nc是發(fā)送模式,目標是xxx.xxx.x.xxx計算機上的10401端口。

      Python

      版權聲明:本文內(nèi)容由網(wǎng)絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權內(nèi)容。

      上一篇:聆聽90后行業(yè)開發(fā)者的故事,感受改變世界的力量
      下一篇:基于Puppteer自動化度量實踐
      相關文章
      久久久亚洲欧洲日产国码农村| 亚洲国产成人精品激情| 亚洲国产精品乱码在线观看97| 中文亚洲成a人片在线观看| 亚洲爆乳无码专区www| 亚洲人成图片网站| 色偷偷女男人的天堂亚洲网| 亚洲自偷自拍另类图片二区| 色噜噜亚洲精品中文字幕| 亚洲AV日韩精品久久久久| 亚洲AV无码专区国产乱码电影 | 亚洲国产精品xo在线观看| 亚洲特级aaaaaa毛片| 亚洲美女在线观看播放| 亚洲乱码中文字幕综合| 亚洲日韩精品无码专区网址| 亚洲av永久无码精品秋霞电影影院 | 亚洲一区无码精品色| 亚洲永久无码3D动漫一区| 亚洲精品亚洲人成人网| 亚洲国产精品VA在线看黑人| 久久亚洲精品成人| 亚洲毛片在线免费观看| 亚洲国产成人久久| 亚洲男人天堂2018av| 亚洲欧美一区二区三区日产| 成人精品国产亚洲欧洲| 亚洲午夜激情视频| 亚洲大尺度无码专区尤物| 亚洲天堂视频在线观看| 亚洲精品国产电影午夜| 国产91在线|亚洲| 亚洲国产精品精华液| 亚洲乱码中文字幕综合234| 亚洲无线观看国产精品| 亚洲国产高清人在线| 亚洲另类小说图片| 亚洲精品无码专区| 亚洲色婷婷综合开心网| 亚洲AV日韩AV天堂一区二区三区| 久久精品国产亚洲77777|