[おうちハック]Raspberry Pi 3 と USBカメラで赤ちゃんモニタリングページを作る
こんにちは、たるこすです。
今回もおうちハックネタです。
先日赤ちゃんがうまれ、妻が面倒を見てくれているのですが、 料理を作る時など同じ部屋にいない際に赤ちゃんの様子が心配だという話を妻から聞きました。
そこで、Raspberry Pi 3 に USB カメラをつないで赤ちゃんの様子を撮影し、 それを手元の端末のブラウザから見ることができるシステムを作りました。
カメラ映像のストリーミング
Raspberry Pi からのカメラストリーミングソフトは MJPG-streamer というのがよく使われているようなので、これを使ってみます。
参考にしたページ
インストール
まずは 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
にアクセスし、以下のようなページが表示されれば成功です。
これで、カメラのストリーミングができるようになったのですが、このままだと常にストリーミングが行われてしまい電気代がもったいないです。
そのため、ページを見ている時だけストリーミングが行われるような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
にアクセスすると以下のようなページが表示されるようになりました。
実際に使うときのイメージとしては以下のような感じです。
おわりに
MJPG-streamer を使うことで、簡単にUSBカメラ映像のストリーミングができました。
せっかくなので、画像を定期的に保存したり、機械学習にかけてみたりすると面白そうですね。
時間があればやってみたいと思います。