Raspberry Piで室内カメラを作る①

# 概要
自宅でのペット監視用に室内カメラを設置したくなりました。
始めは普通の室内カメラを買う予定だったのですが、Raspberry PiやPythonの勉強ついでに一から作ってみようと思います。

# 要件

室内カメラとして使う際に欲しい機能の一覧を記載しました。

* 任意のタイミングでストリーム配信を行える
* 一定間隔で画像を保存する
* 外出先のスマホから確認ができるようにする

最終的には全ての機能を実装したいところですが、今回はストリーミング配信の確認をしたいと思います。

# 調査

**1. 実装言語**
Raspberry Piを操作するための言語はPythonを採用します。
Raspberry PiにはPython実行環境が標準で搭載されており、2019年2月現在、Python2.7.13とPython3.5.3がインストールされています。現状Python2を選択する理由はないのでPython3系列を採用します。
3.5のままで良いのであればそのままでよいのですが、今後のためにPythonのバージョンは3.6または3.7にしておきたいので、今回はPython3.6を追加でインストールします。

※自分の環境のpythonのバージョンを調べたい場合は`python --version`および、`python3 --version`で確認ができます

**2. ソフトウェアの選別**
Raspberry Piでストリーミング配信と画像撮影を行うにはmotionかMJPG-streamerが一般的のようです。
調べているうちにmotionは遅延が発生しやすいということ、ブラウザが限定されてしまうようです。外出時にAndroidで配信を閲覧できるようにしたかったため、今回はMJPG-streamerを選択します。

**3. Webカメラ**
Raspberry Piでは専用カメラモジュールが発売されていますが、今回は手軽に実装したかったので
USBカメラでの実装を行います。
調査時に[この記事](https://atsuyakoike.hatenablog.com/entry/2018/10/04/200253)で[BSW200MBK](https://www.buffalo.jp/product/detail/bsw200mbk.html)を知り、広角撮影が可能なことからこちらをそのまま採用しました。

**3. まとめ**
調査の結果、今回必要なソフト・機器の一覧を下にまとめました。
必要に応じてこちらは追記をしていきます。

| 種別        | ソフトもしくは機器        | 備考                       |
|:-----------|----------------------------:|:--------------------------|
| 言語       | Python 3.6.x                | 実行時の最新バージョン       |
| 配信ソフト  | MJPG-streamer               |                           |
| Webカメラ  | BSW200MBK                   |                           |

# 準備物
[初回](https://qiita.com/henjiganai/items/2b39dd8cbc3cc3cbe4a4)の購入物品に追加して、バッファローから発売されている[BSW200MBK](https://www.buffalo.jp/product/detail/bsw200mbk.html)を購入しました。

# Webカメラ・ソフトウェアの準備
Raspberry PiとWebカメラの準備ができたら必要なソフトウェアのインストールを行います。
次回以降ではPython経由でサービス起動や静止画撮影を行う予定ですが、今回は動画配信のみなのでWebカメラの設定とMJPG-streamerのインストールのみ実施します。

##1. Webカメラの接続
開封後Raspberry Piに購入したWebカメラを接続しておきます。
接続後、ターミナルで`lsusb`と`ls /dev/video*`を実行してWebカメラが認識されているかを確認します。

```shell:
lsusb
# WebCamもしくはWideCamといった記載があるデバイスが存在するかを確認する
Bus 001 Device 00X: ID XXXX:XXXX ～ WideCam F100

ls /dev/video*
# Webカメラが正常に接続されている場合ビデオキャプチャデバイスが認識される
/dev/video0
```

認識がされていることが確認できたら`sudo rpi-update`を実行して再起動をします。

**Webカメラの撮影確認（任意）**
Webカメラが認識されているかを確認するためにfswebcamをインストールします。
`sudo apt-get install fswebcam`を実行してインストール後、`fswebcam /tmp/test.jpg`を入力して静止画撮影ができるかを確認します。

##2. MJPG-streamerのインストール
オリジナル版MJPG-streamerはRaspberry Piに対応していないので、[フォーク版](https://github.com/jacksonliam/mjpg-streamer)をインストールします。
オリジナル版、フォーク版どちらを利用する場合でもコンパイルが必要になります。

**1.インストール**
コンパイルに必要なものとMJPG-streamerを取得し、コンパイルを実行。

```shell:
# /opt配下に移動
cd /opt
# 現在のユーザのホームディレクトリに作成する場合は下記を実行
cd ~
# 必要に応じてインストール用ディレクトリを作成した方が管理がしやすい
# sudo mkdir mjpg-streamer
# sudo cd mjpg-streamer

# cmake、libjpeg8-devを取得
sudo apt-get install cmake libjpeg8-dev
sudo git clone https://github.com/jacksonliam/mjpg-streamer.git
# コンパイル
cd mjpg-streamer/mjpg-streamer-experimental
sudo make
# コンパイル後のバイナリファイルを配置
sudo make install
```

# ストリーム配信の確認

下記コマンドを実行した後、PCのブラウザに`http://192.168.XXX.XXX:8080/?action=stream`を入力して配信が行われているかを確認します。
ストリーム以外の動作は[こちら](https://github.com/jacksonliam/mjpg-streamer/blob/master/mjpg-streamer-experimental/plugins/output_http/README.md)で確認することができます。

```shell:
cd /usr/local/lib
# ポート8080、画面サイズ640×480、30fps、クオリティ10(1～100まで)で実行
mjpg_streamer -o "./output_http.so -w ./www -p 8080" -i "./input_uvc.so -d /dev/video0 -r 640x480 -fps 30 -q 10 -y -n"
# カメラモジュールで実行する場合
mjpg_streamer -o "./output_http.so -w ./www -p 8080" -i "./input_raspicam.so -x 640 -y 480 -fps 30 -q 10"
```

本来は上記のコマンドで実行できるはずなのですが、`ERROR: could not find input plugin`というエラーが発生してしまったためプラグインファイルをフルパスで記載しました。

```shell:
mjpg_streamer -o "/usr/local/lib/mjpg-streamer/output_http.so -w ./www -p 8080" -i "/usr/local/lib/mjpg-streamer/input_uvc.so -d /dev/video0 -r 640x480 -fps 30 -q 10 -y -n"
```
終了させたい場合は`Ctrl+C`を押せば終了させることができます。

#総括

これでストリーム配信ができる環境が整いました。
次回はPython3.6のインストール及び開発環境を構築し、任意のタイミングでストリーム配信や静止画撮影ができるように設定を行います。

# 参考
この記事を書くにあたって、以下のサイトを参考にさせて頂きました。
[【BUFFALO】「BSW200MBK」をUbuntuとRaspberry Piで使ってみた](https://atsuyakoike.hatenablog.com/entry/2018/10/04/200253)
[はじめてのRaspberry PIで監視カメラを作ってみた。](https://qiita.com/kinpira/items/bf1df2c1983ba79ba455)
[Raspberry Piに外部ネットワークからアクセスできる様にして携帯でペットを遠隔監視する方法](https://qiita.com/kinpira/items/c9e6dc910e8d96e8c19b)
[Raspberry Pi 3 の標準カメラで撮影した動画をブラウザに配信する方法まとめ](https://qiita.com/okaxaki/items/72226a0b0f5fab0ec9e9)
[Raspberry Piでwebカメラの映像を配信する方法(MJPG-streamer編)](https://www.smartllc.jp/blog/20150222-how-to-stream-webcam-with-mjpgstreamer-on-raspberrypi/)
[RasPi:MJPG-streamer動画配信で遊んでみた♬](https://qiita.com/MuAuan/items/b3abd4cff2f39aa1f2d0)
[mjpg-streamerでストリーミング配信](https://cozyattic.wordpress.com/2009/10/19/mjpg-streamer%E3%81%A7%E3%82%B9%E3%83%88%E3%83%AA%E3%83%BC%E3%83%9F%E3%83%B3%E3%82%B0%E9%85%8D%E4%BF%A1/)
[Raspberry Piでカメラが認識しない際の対処法](https://qiita.com/kaiyu_hara/items/0d27ec359b5a692c1f89)
[第8回: MJPG-streamerのインストール](http://blue-black.ink/?page_id=2245)