たるこすの日記

たるこすの日記

リアルからバーチャルへ、バーチャルからリアルへ

[おうちハック]Raspberry Pi 3 と USBカメラで赤ちゃんモニタリングページを作る

こんにちは、たるこすです。

今回もおうちハックネタです。

先日赤ちゃんがうまれ、妻が面倒を見てくれているのですが、 料理を作る時など同じ部屋にいない際に赤ちゃんの様子が心配だという話を妻から聞きました。

そこで、Raspberry Pi 3 に USB カメラをつないで赤ちゃんの様子を撮影し、 それを手元の端末のブラウザから見ることができるシステムを作りました。

カメラ映像のストリーミング

Raspberry Pi からのカメラストリーミングソフトは MJPG-streamer というのがよく使われているようなので、これを使ってみます。

参考にしたページ

WEBカメラで動画ストリーミング

インストール

まずは MJPG-streamer に必要なパッケージをインストールします。

$ sudo apt update
$ sudo apt install subversion libjpeg-dev imagemagick

次に MJPG-streamer のソースをチェックアウトします。

$ svn co http://svn.code.sf.net/p/mjpg-streamer/code/mjpg-streamer

チェックアウトしたフォルダに移動して、コンパイルを行います。

$ cd mjpg-streamer 
$ make 

実行

ビデオの読み取りができるよう、自分のアカウントをビデオグループに追加します。

$ sudo usermod -a -G video [your username]

実行します。

$ ./mjpg_streamer -i "./input_uvc.so -f 10 -r 320x240 -d /dev/video0 -y -n" -o "./output_http.so -w ./www -p 8080

手元の端末のブラウザで、http://[Raspberry Pi の IP]:8080 にアクセスし、以下のようなページが表示されれば成功です。

f:id:tarukosu:20170108114627p:plain

これで、カメラのストリーミングができるようになったのですが、このままだと常にストリーミングが行われてしまい電気代がもったいないです。
そのため、ページを見ている時だけストリーミングが行われるようなWebページを作ります。

自作ページでストリーミング映像を表示するには、以下のタグをページに入れるだけで良いです。

<img src="http://[Raspberry Pi の IP]:[ポート番号]/?action=stream"/>

表示用Webページの作成

web ページは nodejs で作ることにします。
また、クライアントのコネクションチェックのためにsocket.io を利用します。

ストリーミングの開始、終了は以下のように行うことにします。

  • ページにアクセスされたらストリーミング開始
  • 表示しているクライアントがなくなったら10秒後にストリーミング終了
    • 10秒後にしているのは、リロード時にストリーミングを終了させないため
  • 最後のアクセスから一定時間経過したらストリーミング終了

コードは以下のリポジトリにあるので、そちらをご覧ください。
GitHub - tarukosu/raspi-usbcam-monitor

Raspberry Pi で実行し、 http://[Raspberry Pi の IP]:8127 にアクセスすると以下のようなページが表示されるようになりました。

f:id:tarukosu:20170108114631p:plain

実際に使うときのイメージとしては以下のような感じです。

f:id:tarukosu:20170108195851p:plain

おわりに

MJPG-streamer を使うことで、簡単にUSBカメラ映像のストリーミングができました。
せっかくなので、画像を定期的に保存したり、機械学習にかけてみたりすると面白そうですね。
時間があればやってみたいと思います。