Taifuh.com

阿部のFacebookからの転載ブログ

IoT関連

ラズパイで監視カメラ

投稿日:2016年12月23日 更新日:

ラズパイ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というテーブルに、日付とファイル名を登録しているだけだ。

以上で設定は全て終わり。

ちなみに、こういった見たくないものも写ってしまうのだった。
あ〜あぁ・・・・。

-IoT関連
-, , ,

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

2021年12月
 12345
6789101112
13141516171819
20212223242526
2728293031