用樹莓派USB攝像頭做個監控

7tiny發表於2022-05-31

【前言】

看著陰暗的角落裡吃灰噎到嗓子眼的樹莓派,一起陪伴的時光歷歷在目,往事逐漸湧上心頭,每每觸及此處,內心總會升騰起陣陣憐憫之情...

我這有兩個裝置,一個是積灰已久的樹莓派,另一個是積灰已久的USB攝像頭。

我們今天用這兩個裝置做一個拍攝監控方案(非視訊錄製),然後將拍攝好的圖片合成視訊進行觀看。

主要用到的技術有:樹莓派/linux操作,crontab,python,ffmpeg。

【系列目錄】

  1. 樹莓派驅動usb攝像頭(非官方攝像頭模組)
  2. 樹莓派載入外接USB硬碟
  3. 樹莓派拍攝獲取素材程式
  4. 樹莓派定時任務編寫
  5. 將素材圖片合成視訊

【實現過程】

樹莓派驅動usb攝像頭(非官方攝像頭模組)

首先我們要保證樹莓派可以識別usb攝像頭裝置,使用命令:

lsusb

image

可以看到usb裝置列表第一個即 海康威視1080p usb攝像頭,說明我們的攝像頭裝置被正確識別,如果無法識別,則要排除裝置故障或想辦法安裝裝置驅動程式。

我們使用fswebcam應用來驅動usb攝像頭模組

sudo apt-get install fswebcam
sudo apt-get install mplayer

簡單輸入拍照命令測試下

fswebcam -r 1920*1080 --delay 3 --skip 10 1.jpg

image

image

我們把樹莓派上的 1.jpg 下載下來進行檢視,成功拍攝到了畫面!

image

我們在使用fswebcam時,增加了幾個引數,下面介紹這幾個引數的作用:

引數 作用
-r 1920*1080 拍攝圖片解析度
--delay 3 延時3s後拍攝(給攝像頭自動對焦的時間,否則會模糊,這個經常拍照的可以理解吧)
--skip 10 作用同上,拍攝時其實會拍攝好多幀,我們跳過前10幀以保證清晰度

樹莓派載入外接USB硬碟

我們計劃編寫一個程式來長時間捕捉攝像頭畫面,那麼就需要一個比較大的儲存空間來存放我們拍攝的圖片,我們從小角落找到一個同樣“積灰已久”的固態硬碟。

windows下使用過的硬碟,推薦格式化成FAT32格式,該格式是相容Linux系統檔案格式的,NTFS格式相容性不是特別好,可能讀寫會出問題。

當然直接用linux fdisk命令格式化成 ext2/3/4 也是可以的,但是後續在windows環境下讀寫又是新問題,如果硬碟不是準備永久掛載在linux系統下使用,還是建議用FAT32格式使用。

windows10/11 下已經不提供格式成 FAT32 的入口,我們可以下載奧梅分割槽助手快速格式化成想要的格式。

使用命令檢視固態硬碟是否被識別

lsusb

image

可以看到,第二個usb裝置便是我們的usb固態硬碟裝置了(M.2硬碟放到了USB硬碟盒進行外接)

使用 fdisk 命令檢視硬碟屬性

fdisk -l

image

使用 mount 掛載硬碟裝置,將磁碟掛載到 /mnt/sda1 路徑下

雖然網上有很多教程說配置一個配置檔案(具體配置我就不說了),然後讓裝置開機自動掛載,但我個人極不推薦,修改配置檔案開機自動掛載雖然貌似一勞永逸,但在硬碟裝置發生變更時,大概率因為忘記同步修改配置檔案,會造成無法啟動系統的嚴重故障,折騰不說還可能需要重灌系統解決...其實啟動不頻繁情況下,手動裝載也不費事。

mount /dev/sda3 /mnt/sda1

然後使用 df 命令檢視儲存佔用詳情

df

image

可以看到硬碟成功掛載。

樹莓派拍攝獲取素材程式

我們編寫一個短小的python指令碼來實現以下幾點小功能:

  • 據時間歸檔目錄
  • 呼叫api執行拍照,並按時間戳命名
import os
import time

if __name__ == '__main__':
    path = '/mnt/sda1'
    # path = 'E:\code\Project.Python\CameraShoot'
    folder = f'{path}/{time.strftime("%Y%m%d")}'

    if not os.path.exists(folder):
        os.mkdir(folder)

    # 拍照
    os.system(
        f'fswebcam -r 1920*1080 --delay 3 --skip 10 {folder}/{time.strftime("%Y%m%d%H%M%S")}.jpg'
    )

樹莓派定時任務編寫

我們使用 linux 環境下的 crontab 編寫定時任務,來定時執行拍照任務(初步定每分鐘拍一張)

crontab -e
* * * * * python /7tiny/camera_shoot.py

採用定時任務,每分鐘自動排程執行我們寫好的python指令碼,來進行拍照任務的執行

等待一段時間後,便可拿到拍攝素材...

image

image

將素材圖片合成視訊

我們先簡單從樹莓派上下載下來拍攝好的圖片,在 windows 上簡單合成一個視訊,完成我們的任務目標,後期可以根據需要在樹莓派上自動合成。

我們用 ffmpeg 軟體將圖片合成為視訊。

首先下載 ffmpeg 軟體的 exe 版本(windows),linux上可直接下載linux版。

然後將解壓後 ffmpeg 的 exe 目錄新增到環境變數,方便我們執行命令。

將樹莓派上的圖片下載下來。

image

下載下來的圖片我們是預設使用時間戳來命名圖片的,因為ffmpeg只能從 0 - n 順序識別圖片,無法識別時間戳這種命名,因此,我這裡自己編寫了一個工具將圖片名稱替換成了 0 - n.jpg。

有需要的同學可以在文末獲取到工具原始碼及下載地址。

重新命名好後,我們執行命令壓縮圖片為 mp4 檔案。

ffmpeg -r 10 -f image2 -i %d.jpg -vcodec libx264 -pix_fmt yuv420p out.mp4

同樣我們介紹下使用的幾個引數:

引數 作用
-r 10 視訊為每秒10幀,可以根據需要調整,10幀就是10張圖片
%d 從0開始在當前目錄遞增尋找圖片
-vcodec libx264(windows相容)
-vcodec libx265(體積更小,windows預設不支援) 視訊壓縮引數
-pix_fmt yuv420p 視訊編碼格式(windows下播放相容)

執行後,我們便可檢視到圖片被拼接成為 mp4 格式的視訊。

image

image

【總結】

本文通過短小的程式碼片段初步使用樹莓派+usb攝像頭進行環境捕捉,在此基礎上,可以進行很多額外的場景擴充套件及使用優化。

【原始碼地址】

重新命名工具原始碼及編譯後綠色程式:
https://github.com/sevenTiny/SevenTinyToolBox/blob/main/tools/SevenTinyToolBox.RenameWithNumber.exe

相關文章