ラズパイ3で監視カメラを構成したので、メモとして残しておく。
カメラはUSBの安いWebカメラ、ロジテック C270だ。
最大1280 x 720の解像度で、千円で買ったカメラにしては十分。
USBのWebカメラをラズパイに接続すると /dev/video0 で難なく認識される。
監視カメラの機能としては、動くものを感知すると録画をスタートし、動きが無くなったところで録画を停止するといった、一般的なものとしてMotionというソフトが人気のようだ。
早速、以下のサイトから最新版のVer.4.01をダウンロード。
https://github.com/Motion-Project/motion/releases
具体的には “pi_jessie_motion_4.0.1-1_armhf.deb” という、ラズパイ用のものをダウンロードしてインストール。
なお、apt-getでmotionを引っ張ってきても良いのだが、それだとVer.3レベルの古いものしかないようだ。まぁ、古くてもちゃんと動作するのだが、H264/mp4がサポートされてなかったりと、イマイチなので、Ver.4以降がお勧めだ。
取り敢えず、何も考えずにmotionを起動する。
$ service motion start
特に画像が表示されるという訳でもないのだが、吐き出されるログを眺めて色々と下調べだ。
以下のログはWebカメラがサポートする動画形式だ。
v4l2_set_pix_format: Supported palettes: v4l2_set_pix_format: (0) YUYV (YUYV 4:2:2) v4l2_set_pix_format: 0 - YUYV 4:2:2 (compressed : 0) (0x56595559) v4l2_set_pix_format: (1) MJPG (Motion-JPEG) v4l2_set_pix_format: 1 - Motion-JPEG (compressed : 1) (0x47504a4d)
このカメラはYUYV、つまりRAWデータと、Motion JPEGの2種類のデータ形式をサポートしているようだ。RAWは生の画像データなので綺麗といえば綺麗だが、画像処理に時間が掛かるため、1秒間あたりのフレームレートが低くなってしまい、結果としてカクカクした動画になってしまう。スムーズで滑らかな動画のためにはフレームレートを上げる必要があり、今回の場合はMotion JPEGを選択するのが適当だ。
と、色々とログから情報を拾い、設定ファイルに反映していく。
$ sudo vi /etc/motion/motion.conf
以下、主に修正した場所を示す。
daemon on | デーモンとして動作させる。 |
v4l2_palette 8 | 先ほど出てきた動画形式 8=Motion JPEG |
power_line_frequency 1 | 交流電源周波数 1=50Hz |
width 800 height 600 |
800 x 600 pixelの動画サイズとする。最大1280 x 720まで行けるのだが、動画のクオリティとファイルの大きさからこのサイズと判断。 |
framerate 24 | フレームレートは毎秒24コマ |
mask_file /etc/motion/mask/mask.pgm | マスクファイルとは、動きを検知してほしくない場所をマスクするためのビットマップ画像ファイルだ。木の幹が風で揺れただけで反応していては意味がないので、人の動作とは無関係の場所はマスクしておく。なお、マスク・ファイルは黒がマスクで、白が検出領域であり、JPEG形式で作成した場合は、以下のコマンドでPGM形式に変換しておく必要がある。
djpeg -grayscale -pnm mask.jpg > mask.pgm |
snapshot_interval 300 | 動きがなくても5分おきに画像を保存。 |
text_double on | 画像に写し込む、日時などの情報のフォントを2倍のサイズにする。 |
output_pictures first | 動作を検出した際の一番初めのフレームを画像として残す。これはサムネイルに使用するためだ。 |
ffmpeg_video_codec mp4 ffmpeg_bps 700000 |
動画形式を h264/mp4 とし、ビットレートは700Kbpsとする。 |
on_movie_end /var/lib/motion/script/regtable %f | 処理が終わった際に呼び出すスクリプトを指定。引数として動画のファイル名を渡す。1週間を過ぎたファイルを自動的に削除するために、時間とファイル名をデータベースに登録するスクリプトだ(詳細後述)。 |
処理が終わった際に呼び出すスクリプトはperlで作成しており、内容は以下の通り。
#!/usr/bin/perl use File::Basename; use DBI; $filepath = shift(@ARGV); $dir = dirname($filepath); @extlist=('.mp4'); ($fn,$path,$ext) = fileparse($filepath,@extlist); $hostname = "192.168.0.100"; $database = "kanshi"; $user = "kanshi"; $password = "kanshi"; my $dbh = DBI->connect("DBI:mysql:$database:$hostname",$user,$password) or die "Cannot connect to Database: $DBI::errstr"; $fn =~ /(\d{4})-(\d{2})-(\d{2})_(\d{2})-(\d{2})-(\d{2})/; $file_datetime = "$1-$2-$3 $4:$5:$6"; $sth = $dbh->prepare("INSERT INTO file_info values(\"$file_datetime\", \"$fn\")"); $sth->execute; $sth->finish; $dbh->disconnect;
単に、kanshiというデータベースのfile_infoというテーブルに、日付とファイル名を登録しているだけだ。
以上で設定は全て終わり。
ちなみに、こういった見たくないものも写ってしまうのだった。
あ〜あぁ・・・・。