ラズパイで定点カメラ
 


JUGEMテーマ:電子工作
 


訳有って監視カメラを取り付ける事にしたんですが、見積もりを取ったところ60万と出て来まして
必要に迫られましてラズパイでカメラを作ってみる事にします。
色々と調べたんですが、arduinoの場合は処理速度と記録容量の問題でNG
価格との兼ね合いでRaspberryPIで作ってみることにします。
今回はプロトタイプとしてRaspberryPi3とラズパイカメラにて一定期間の画像が取得できる事を目標にします。
将来的にはRaspberryPiZeroに移行して防水の筐体に入れたいと思います。
■要求仕様
 最低でも5秒間隔で1週間は保存したい。
 
■風景
 

 

■セットアップ

 

・パイカメラのライブラリをインストール
 sudo apt-get install python-picamera

 

■【検証1】静止画を保存

 

import picamera
camera=picamera.PiCamera()
camera.capture('image.jpg')

この状態だと左右が逆になるようなので調べると

#左右反転
camera.hflip = True
#上下反転
camera.vflip = True

他にもパラメーターありそうなので調べると以下の物もあり
#camera.resolution = (1920,1200)
#camera.sharpness = 0
#camera.contrast = 0
#camera.brightness = 50
#camera.saturation = 0
#camera.ISO = 0
#camera.video_stabilization = False
#camera.exposure_compensation = 0
#camera.exposure_mode = 'auto'
#camera.meter_mode = 'average'
#camera.awb_mode = 'auto'
#camera.image_effect = 'none'
#camera.color_effects = None
#camera.rotation = 0

・今回はサイズ左右反転とサイズのみ指定して以下の様にした。

import picamera

camera=picamera.PiCamera()
camera.hflip = True
camera.resolution = (640,480)
camera.capture('image_mono.gif')

 

■【検証2】動画を画面に表示

 

import picamera
import time

camera=picamera.PiCamera()
#左右反転
camera.hflip = True
camera.resolution = (640,480)
#動画表示開始
camera.start_preview()
#10秒間の動画
time.sleep(10)
#動画表示終了
camera.stop_preview()
camera.close()

 

■【検証3】動画を保存

 

import picamera
import time

camera=picamera.PiCamera()
#左右反転
camera.hflip = True
camera.resolution = (640,480)
#動画を保存開始
camera.start_recording('record.h264')
#10秒間の動画
time.sleep(10)
#動画を保存終了
camera.stop_recording()
camera.close()

record.h264で保存されるのでmp4に変換

・gpacをインストール
sudo apt-get install -y gpac
・コマンドでmp4に変換
MP4Box -fps 30 -add record.h264 record.mp4

 

■【検討】上記の検証で判ったこと


 静止画の保存でRaspberryPi3で実行した場合で640×480サイズでGIFで保存して220KByteで約3秒。
 動画の保存でRaspberryPi3で実行した場合で640×480サイズで10秒で1.8MByte。
 動画では32GのSDで3.5時間分しか記録できないので静止画しか選べない

 

■容量設計


 ラズパイのマイクロSDの容量を32GByteとする。
 OSシステムの容量を4GByteとしてデータとして28GByte使えるとする。
 写真のサイズを640×480として
 GIFで保存して220KByteとして
 5秒間隔で1週間だと
  7日間 × 24 時間 × 60分 × 12(1分の枚数) × 220KByte
  計算の答え
  約25GByte
 3GByteは予備って事で大丈夫って事にした。
 64GByteのSDなら2秒単位でもOKですね。
 128GByteならば2秒単位でも2週間以上保持可能です。

 

■ディレクトリ構成


 /home/pi/picamera
       camera.py
       camera.sh
       /data
         /YYYYMMDD (日付20181224等)
           HHMMDD (時刻091824等)

 

■プログラム


・camera.py


import picamera
import datetime
import os

#ディレクトリとファイル名を作成
now = datetime.datetime.now()
base_directory = '/home/pi/picamera/data/'
YYYYMMDD = now.strftime('%Y%m%d')
output_directory = base_directory + YYYYMMDD
if not os.path.exists(output_directory):
  os.makedirs(output_directory)
  os.chmod(output_directory, 0777)
filename = now.strftime('%H%M%S')
filename_fullpath = output_directory + '/' + filename + '.gif'

#カメラを起動して保存
camera=picamera.PiCamera()
camera.hflip = True
camera.vflip = False
camera.resolution = (640,480)
camera.capture(filename_fullpath)

camera.close()

 

・解説


日付と時刻からディレクトリとファイル名を生成して
静止画を保存する


■起動シェル


・camera.sh


find /home/pi/picamera/data/* -name '*.gif' -ctime +7 -exec rm -f {} ¥;
find /home/pi/picamera/data/* -type d -ctime +7 -exec rm -rf {} ¥;
python /home/pi/picamera/camera.py

・解説
1週間経過したファイルを削除
1週間経過したディレクトリを削除
camra.pyを起動

 

■クーロン設定


・crontab -e


* * * * * for i in `seq 0 5 59`;do (sleep ${i}; /home/pi/picamera/camera.sh) & done;

 

・解説


先頭部の「* * * * * 」は毎分00秒にcronで実行
実行するコマンドは「for i in `seq 0 5 59`;do (sleep ${i}; /home/pi/picamera/camera.sh) & done;」

縦に書くと以下の様になり
for i in `seq 0 5 59`;
do (
  sleep ${i};
  /home/pi/picamera/camera.sh) & 
done;

一定時間sleepしてからcamera.shを起動するコマンドを60個実行する
となる。

 

■取得した写真

 

■トラブル

 

上記で実行していたところ、1時間実行したぐらいのところで

「camera=picamera.PiCamera()」がエラーになり実行できなくなった。

調べたところ、RaspberryPIを最新化することで解決できるようなので以下のコマンドを実行。

sudo apt-get update
sudo apt-get upgrade
sudo apt-get dist-upgrade
sudo rpi-update
sudo reboot

 

その後は9時間経過しても今のところ安定。