2012年04月11日

監視カメラ(動体検知・メール通知・クラウドへ保存)をUbuntuで構築する

普段は殆ど使わないカメラ(Webカメラ)がノートPCに付いてるってことありますよね?
今日はこの使わなくなったカメラとUbuntu(僕はXubuntu)を使って監視カメラとその動画ファイルをGmailメール(無料で最大7.5GBまでデータを保存可能)を使って通知するサーバを作ってみたいと思います。

motion

Motionのインストールと設定


動体検知にはMotionパッケージを利用します。Ubuntuソフトウェア・センター又は端末から次のコマンドでmotionをインストール。

$ sudo apt-get install motion

motionの設定ファイルは/etc/motion/motion.confです。エディタで開いて設定します。

$ sudo gedit /etc/motion/motion.conf

最低限の設定は次の通り。

1.デーモン起動
もし、デーモンとして起動させたい場合、daemonをonにします(標準でオフ)。
 
daemon on

デーモンの場合、設定ファイルにprocess_id_fileとして定義されているプロセスID記録用のディレクトリも作成しておきます。

$ sudo mkdir /var/run/motion

これでmotionコマンド実行時にデーモンとして動作しますが、最初は動作確認しやすいoffが良いかと。
デーモンとして起動した場合は$ sudo ls /etc/init.d/motion stopで停止します。
(/etc/init.d/motion startは起動に失敗するので注意。スクリプトの変更が必要)


2.フレームレートの設定
1秒間に撮影するフレーム数を変更します。標準では2ですが、ここでは30fpsに変更します。

# Maximum number of frames to be captured per second.
# Valid range: 2-100. Default: 100 (almost no limit).
framerate 30
 

3.イメージ・サイズ
width, heightでサイズを指定できます。まあ、監視カメラなら大きなサイズは必要ないですね。

# Image width (pixels). Valid range: Camera dependent
width 320

# Image height (pixels). Valid range: Camera dependent
height 240


4.動体検知しきい値
Motionは撮影した画像を比較し、変化したピクセル数を基準に動体検知します。この検知基準となるピクセル数、標準では1500ですが、300にして感度を上げます。運用しながら要調整ですね。

# Threshold for number of changed pixels in an image that
# triggers motion detection (default: 1500)
threshold 300


5.ノーモーション検知しきい値
動体検知終了を判断する為にノーモーションの連続継続時間をgapとして設定します。
この値が大きいと、検知頻度は少くなりますが、生成される動画ファイルは大きくなります。逆に短いと生成される動画ファイルは小さくなりますが、検知頻度は多くなります。
標準では連続60秒ですが、今回はメールに動画ファイルを添付したいので10〜30秒程度にします。

# Gap is the seconds of no motion detection that triggers the end of an event
# An event is defined as a series of motion images taken within a short timeframe.
# Recommended value is 60 seconds (Default). The value 0 is allowed and disables
# events causing all Motion to be written to one single mpeg file and no pre_capture.
gap 30


6.コーデックの指定
ffmpeg_video_codecで動画ファイルのフォーマットを指定します。標準ではswfですが、今回はmpeg4(作成されるファイルはavi形式)に変更。

# Codec to used by ffmpeg for the video compression.
# Timelapse mpegs are always made in mpeg1 format independent from this option.
# Supported formats are: mpeg1 (ffmpeg-0.4.8 only), mpeg4 (default), and msmpeg4.
# mpeg1 - gives you files with extension .mpg
# mpeg4 or msmpeg4 - gives you files with extension .avi
# msmpeg4 is recommended for use with Windows Media Player because
# it requires no installation of codec on the Windows client.
# swf - gives you a flash film with extension .swf
# flv - gives you a flash video with extension .flv
# ffv1 - FF video codec 1 for Lossless Encoding ( experimental )
# mov - QuickTime ( testing )
 
ffmpeg_video_codec mpeg4


7.ライブカメラ、管理ポートの設定
webcam_port(8081)、control_port(8080)パラメータで、配信(Live Webcam)及び管理用のWebサーバが起動しますが、余計なサービスを起動したくない場合は0にします。


8.録画終了イベント発生時のアクション実行
動体検知・録画終了した時点で呼び出す処理をvalue部分に設定します。この部分は後述。

# Command to be executed when a movie file (.mpg|.avi) is closed. (default: none)
# To give the filename as an argument to a command append it with %f
; on_movie_end value

ここまで出来たら次のコマンドでmotionの動作確認をしてみましょう。

$ sudo motion

デーモン起動でなければ端末にログが出力され、動体検知の状況が確認できるはずです。
標準設定のままであれば、target_dirで指定した/tmp/motionにイメージ・ファイルが作成されます。


muttとGmailを使ってコマンドからメール送信


motionのon_movie_endイベントでメールを送信する為に、まずはGmailで専用アカウントを用意しましょう。

Gmail: Google メール

続いてUbuntuにmuttをインストール。

$ sudo apt-get install mutt 

mutt用の設定ファイルを作成しましょう。

$ gedit /path/to/mutt.conf

Gmailを使ってメールを送信する為の最低限の設定は次の通り。
 
set charset="utf-8"
set send_charset="us-ascii:iso-2022-jp"

set from = "webcam用アカウント@gmail.com"
set realname = "監視 太郎"

set smtp_url = "smtp://webcam用アカウント@smtp.gmail.com:587/"
set smtp_pass = "webcam用アカウントのパスワード"

設定ファイルが準備できたら次のコマンドで動作確認してみましょう。

$ echo "Hello world" | mutt -F /path/to/mutt.conf -s "件名" 宛先@gmail.com

指定したアドレスにメールが届けばOK。

最後にmotionから呼び出すシェル(on_movie_end.sh)を次のような内容で用意します。

#!/bin/sh
AVI_PATH=$1
AVI_DIR=`dirname $AVI_PATH`
MP4_NAME="MOTION-`date +'%Y%m%d-%H%M%S'`.mp4"
MP4_PATH=$AVI_DIR/$MP4_NAME

EMAIL_TO=通知・送信先@gmail.com
EMAIL_SUB="監視カメラ"
EMAIL_BODY="動体を検知しました"
MUTT_CONF=/path/to/mutt.conf

# convert to mp4
ffmpeg -i $AVI_PATH -f mp4 -s 320x240 -vcodec mpeg4 -b 3000k -acodec aac -ab 128k $MP4_PATH > /dev/null 2>&1

if [ $? -eq 0 ]; then
  # send email by mutt & gmail
  echo $EMAIL_BODY | mutt -F $MUTT_CONF -s $EMAIL_SUB -a $MP4_PATH -- $EMAIL_TO
  if [ $? -eq 0 ]; then
    # clean up old motion files (over 60 minnutes)
    find $AVI_DIR -type f -mmin +60 | xargs rm -rf
  fi
fi

motion自体から動画ファイルのパスを取得できるので、引数($1)として取得し、avi形式のファイルをmp4に変換後、muttでメール送信しています。
(メール送信が成功した場合、古いファイルを削除)
avi形式だとスマートフォンから簡単に見れないのでmp4に変換しましたが、必須では無いですね。
尚、変換に失敗する場合は次のコマンドで追加コーデックなどを一式インストールしてください。

 $ sudo apt-get install  ubuntu-restricted-extras

最後に用意したシェル・スクリプトをmotionから呼び出すように設定します。

 $ sudo gedit /etc/motion/motion.conf

on_movie_end sh /path/to/on_movie_end.sh %f

準備はおしまい。

さあ、$ sudo motionで監視・通知カメラを起動してみましょう。


動体検知・通知を試してみる!


動体を検知してしばらく待つと通知先にメールが届きます。

スクリーンショット - 2012年04月11日 - 00時04分51秒

開いてみるとmp4ファイルが添付されています。

スクリーンショット - 2012年04月11日 - 00時05分49秒

実際の動画はこちら。検知してから録画が始まるのでムービー開始時点から侵入者が映っていますが、Motionは侵入者が映る前から開始・動体監視しています。



勿論、mp4なのでiPhoneでも録画した動画をその場で再生・確認出来ます。

今回紹介した設定はかなり敏感に検知するので、室内防犯用かもしれませんね。


LOGICOOL ウェブカム HD画質 120万画素 C270
ロジクール (2010-08-20)
売り上げランキング: 46



Posted by netbuffalo at 00:31│Comments(16)TrackBack(0)Linux 


この記事へのトラックバックURL

http://trackback.blogsys.jp/livedoor/netbuffalo/3942942
この記事へのコメント
すみません らずびあんで本文通りの事を行ったのですが
echo "Hello world" | mutt -F /path/to/mutt.conf -s "件名" 宛先@gmail.comのところまでよかったのですが
motionから呼び出すシェルを上記の通りかいて
シェル・スクリプトをmotionから呼び出すように設定したのですが
うまく送信されません(そもそもめーるがこない)
どうすればよいでしょう
(ちなみにaviからmp4の変換がうまくいってない問題でしょうか?)
Posted by 齐天大圣 at 2015年11月03日 17:56
メールで返信お願いします
Posted by 齐天大圣 at 2015年11月04日 17:09
齐天大圣さん、ご連絡遅れました。
正直なところ、僕はUbuntuで試したのでRaspberry Piでは動かない方法かもしれません。
また、Raspberry Piでは試せないのではっきりした原因はわかりません。 まずは、motionから呼び出すシェル・スクリプトに簡単なデバッグ文を付け加えて、どこまで正常に処理されているか確認してははどうでしょうか。
サンプル・スクリプトはメールでお送りしますね。
Posted by netbuffalo at 2015年11月04日 21:41
やってみたのですがうまくいきません
cat /tmp/motion.txt と打ってもファイルはありませんと表示されます
/tmp/motion.txtを作ってからでも中には何も書かれません
何の問題でしょうか
Posted by 齐天大圣 at 2015年11月05日 21:01
西遊記さん

/tmpの下にファイルが作成されていないということはmotionからシェルが呼び出されていないことを意味します。

例えば、次のようなことが原因です。

1)motionが動体を検知していない
2)motionは動体を検知したがシェル・ファイルの場所が見つからない

1)は無いとして、2)ですと、/path/to/motion_on_movie_end.sh の /path/to が間違っている可能性があります。 /path/to はシェル・ファイルと同じ場所に移動して pwd コマンドを実行すると表示されるパス(例えば /home/pi など)になります。 これは問題無いかと思いますが念の為・・・。

何か気がついたら追加でご報告しますね。

Posted by netbuffalo at 2015年11月07日 17:02
現在ファイルの保存先は/srvです
保存先を変えてみましたが(/home/pi)
やはりだめです
ラズベリーパイを3台使って実験しましたが
どれもつかえません
ほかの場所も試しましたがやはりだめです
どすればいいでしょうか
すみません お願いします
Posted by 齐天大圣 at 2015年11月12日 17:09
動画がそもそも作られてないようですかどうすればいいですか
Posted by 齐天大圣 at 2016年01月09日 14:49
もし動画ではなく画像を送るようにする場合シェルはどう書けばいいでしょうか
すみませんお願いします
Posted by 齐天大圣 at 2016年01月09日 14:51
メールで返信お願いします
Posted by 齐天大圣 at 2016年01月09日 15:35
齐天大圣さん、ご連絡が遅くなりすみません。

気になってはいたのですが、このところ忙しく先日の回答以上の調査・作業はできていませんでした。しばらく忙しいのですが手が空いたらもう一度、齐天大圣さんと似た環境を作ってみますね。もし、回答が整ったらメールと合わせてご報告します。
Posted by netbuffalo at 2016年01月12日 22:49
齐天大圣さん

ご相談頂いた件ですが、思い切って専用OSを使ってはどうでしょうか。

<motionEyeOS>
https://github.com/ccrisan/motioneyeos/releases/

これはモーション検知専用OSイメージで動体検知、画像・動画撮影、メール送信など特に設定せずに簡単に動かせるようです。

現在発売中の「日経Linux 2016年2月号」で2ページほどの紹介記事もあります。
#ちなみに、僕もVirtualBox/VMWareを使った仮想化特集で3ページほど記事書いてます!
#是非、ご近所の書店>コンピューター雑誌コーナーにお立ち寄り下さい。
Posted by netbuffalo at 2016年01月16日 17:34
大変参考になりました。
ただ本文中でファイル名をon_movie_end.shで作成しているのに
motion.confの中ではmotion_on_movie_end.shとしています。
誤記だと思います。
Posted by はっちー at 2016年01月26日 11:29
はっちーさん、ご指摘ありがとうございます。
記事本文を修整致しました。(^^;
Posted by netbuffalo at 2016年01月26日 19:06
久しぶりです
なぜラズベリーパイではmaillで送信できないのか
調べてみたところ(諦めれずに)
問題点が分かりました
/path/to/on_movie_end.shを作った後
これをつき加えてはどうでしょうか
chmod a+x /path/to/on_movie_end.sh
と後前回お教えしてもらった.sh(motion.txtを作るもの)
を実行した結果
ffmpeg failed.と出ました
どうすればいいでしょうか?
Posted by saitenntaisei at 2016年05月31日 21:31
saitenntaiseiさん、コメントが遅くなり申し訳ありませんでした。

お送りしたシェルスクリプトの以下のコマンドが失敗していますね。

ffmpeg -i $AVI_PATH(AVIファイルへのパス) -f mp4 -s 320x240 -vcodec mpeg4 -b 3000k -acodec aac -ab 128k $MP4_PATH(mp4ファイルの出力先)

これを手動で実行してみることは可能でしょうか。もっと詳しくエラーメッセージが表示されます。

また、余計なオプションをつけているのが原因でRaspberry Piで動かないのかもしれないので、思い切ってシェルの該当行を次のように変えて動かしてみると良いかもしれません。

ffmpeg -i $AVI_PATH $MP4_PATH

以上です。
Posted by netbuffalo at 2016年06月02日 18:50
ffmpeg -i $AVI_PATH(AVIファイルへのパス) -f mp4 -s 320x240 -vcodec mpeg4 -b 3000k -acodec aac -ab 128k $MP4_PATH
をどうやって手動で実行すればいいでしょうか
ちなみに
ffmpeg -i $AVI_PATH $MP4_PATHにしてみましたができませんでした

いちいちお騒がせしてすみません
Posted by saitenntaisei at 2016年06月05日 13:23

コメントする

名前
URL
 
  絵文字