ラズパイにUSB接続のWebカメラを接続し画像出力/ストリーミングする設定

## はじめに

ラズパイにUSB接続のWebカメラを接続し、画像出力やストリーミング配信するまでの設定メモ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274270/84edc90d-80cd-8c63-dfdc-ab114419caa6.png)

## 参考

参考にしたサイト

- USB接続のWebカメラの設定方法
    - https://hellobreak.net/raspberrypi-webcamera-0511/
    - (丁寧な説明で大変分かりやすく助かりました)
- USB接続のWebカメラでストリーミング配信
    - https://qiita.com/MuAuan/items/b3abd4cff2f39aa1f2d0

## 環境

- Webカメラ
    - BUFFALOの`BSW500M`
    - https://www.buffalo.jp/product/detail/bsw500mbk.html
- ラズパイ
- Raspberry Pi 4 Model B / 4GB

```console:ラズパイ情報
$ cat /proc/cpuinfo | grep Model
Model           : Raspberry Pi 4 Model B Rev 1.2
$ cat /proc/meminfo | grep MemTotal
MemTotal:        3866512 kB
$ cat /etc/os-release
PRETTY_NAME="Raspbian GNU/Linux 10 (buster)"
NAME="Raspbian GNU/Linux"
VERSION_ID="10"
VERSION="10 (buster)"
VERSION_CODENAME=buster
ID=raspbian
ID_LIKE=debian
HOME_URL="http://www.raspbian.org/"
SUPPORT_URL="http://www.raspbian.org/RaspbianForums"
BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"
$ python -V
Python 3.7.3
$ pip list | grep opencv
opencv-contrib-python 4.1.0.25
opencv-python         4.5.3.56
```

## 設定していく

lsusbコマンドでWebカメラをUSB接続したことを認識できるか確認

```console:Webカメラ接続前
$ lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 002: ID 2109:3431 VIA Labs, Inc. Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
```

```console:Webカメラ接続後
$ lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 004: ID 0411:02da BUFFALO INC. (formerly MelCo., Inc.)
Bus 001 Device 002: ID 2109:3431 VIA Labs, Inc. Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
```

1つデバイス情報が増えているので、USB接続は認識している様子
次に、`ls /dev/video*`コマンドでビデオデバイスが接続されているか確認する

```console:Webカメラ接続前
$ ls /dev/video*
/dev/video10  /dev/video11  /dev/video12  /dev/video13  /dev/video14  /dev/video15  /dev/video16
```

```console:Webカメラ接続後
$ ls /dev/video*
/dev/video0  /dev/video10  /dev/video12  /dev/video14  /dev/video16
/dev/video1  /dev/video11  /dev/video13  /dev/video15
```

Webカメラを接続するとビデオデバイスも増えているので認識できている様子
次に、webカメラを制御するドライバをインストールします。（コマンド実行後、念のためラズパイOSを再起動しました）

```console
$ sudo apt-get install fswebcam
```

これで、Webカメラが使用できる状態になったはず。

## 動作確認

以下のコマンドで、Webカメラの映像が画像出力できれば成功です。

```
fswebcam image.jpg
```

---

## OpenCVでキャプチャしてみる

OpenCVでWebカメラの映像をキャプチャします。
まずはOpenCVをインストールします。

```
$ sudo apt install libavutil56 libcairo-gobject2 libgtk-3-0 libqtgui4 libpango-1.0-0 libqtcore4 libavcodec58 libcairo2 libswscale5 libtiff5 libqt4-test libatk1.0-0 libavformat58 libgdk-pixbuf2.0-0 libilmbase23 libjasper1 libopenexr23 libpangocairo-1.0-0 libwebp6
$ sudo pip3 install opencv-python
```

OpenCVでWebカメラの映像を画像出力してみます。以下を実行後にWebカメラの映像がtest.jpgとして出力されれば成功です。

```
$ python
Python 3.7.3 (default, Jul 25 2020, 13:03:44)
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> cap = cv2.VideoCapture(0)
>>> ret, frame = cap.read()
>>> cv2.imwrite('test.jpg', frame)
True
>>>
```

---

## MJPEG-Streamerでストリーミング配信してみる

Webカメラの映像を、MJPEG-Streamerでストリーミング配信します。
(MJPEG-Streamerのインストールは [**ここ**](https://qiita.com/suo-takefumi/items/2ae5527869dc13d038a9) を参照)

※ `-d /dev/video0` で、Webカメラのデバイスを指定してるようです。

```shell:start_server.sh
#!/bin/sh

PORT="8080" #ポート番号
ID="1000" #IDは好きなもの
PW="1000" #パスワード
SIZE="320x240" #画面サイズ
FRAMERATE="20" #フレームレート
export LD_LIBRARY_PATH=/usr/local/lib
/usr/local/bin/mjpg_streamer \
    -i "input_uvc.so -f $FRAMERATE -r $SIZE -d /dev/video0 -y -n" \
    -o "output_http.so -w /usr/local/share/mjpg-streamer/www -p $PORT -c $ID:$PW"
```

shell実行時の標準出力

```
$ ./start_server.sh
MJPG Streamer Version: git rev: 000000000000000000000000000000
 i: Using V4L2 device.: /dev/video0
 i: Desired Resolution: 320 x 240
 i: Frames Per Second.: 20
 i: Format............: YUYV
 i: JPEG Quality......: 80
 i: TV-Norm...........: DEFAULT
 o: www-folder-path......: /usr/local/share/mjpg-streamer/www/
 o: HTTP TCP port........: 8080
 o: HTTP Listen Address..: (null)
 o: username:password....: 1000:1000
 o: commands.............: enabled
```

shell `start_server.sh` を実行した状態で、ブラウザで URL `http://{{ラズパイのIPアドレス}}:8080/`にアクセスし、MJPEG-Streamerの画面が表示され、Webカメラの映像が表示されれば成功です。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274270/f48e06b3-269a-91fe-3ad1-475a67265db9.png" width="300">