Raspberry Pi4 + RICOH THETA V でライブストリーミング

# Raspberry Pi4 + RICOH THETA V 

THETA V発売当初、THETA Vを使ってライブストリーミングをしようと思うと、Linuxではドライバが対応しておらず、Windowsで接続するしかありませんでした。
しかし、いつの間にかRICOH公式からLinux向けのライブストリーミング用ライブラリが公開され、Linuxでもライブストリーミングが可能になっておりました。
参考：https://dc.watch.impress.co.jp/docs/news/1267757.html

そこで、どこのご家庭でも転がっているラズパイと、THETA Vでライブストリーミングを試してみました。

## 環境

- Raspberry Pi4 4GB
    - Raspberry Pi OS 32bit
- RICOH THETA V

今回は、THETA Vで試しましたがTHETA Z1でも同様のことができるかと思います。

## 手順

まずは必要なパッケージ類をインストールしていきます。
※ まっさらなRaspberry Pi OSの状態からスタートしたつもりですが、過不足あるかもしれません。。

### 必要なライブラリをaptでインストールする

この後、OpenCVをビルドするのでそのために必要なライブラリも含まれています。

```bash
$ sudo apt install -y build-essential cmake libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev libusb-1.0 libjpeg-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev v4l2loopback-dkms
```

### OpenCVをビルドする

後段のlibuvc-thetaをビルドする際に必要になるので、OpenCVをビルド・インストールします。

まず、ソースをダウンロードし解凍します。
本稿執筆時のOpenCV3系の最新バージョンは3.4.14だったので、そのバージョンのソースをダウンロードします。
※ OpenCV4系もリリースされていますが、4系では後段のビルドに失敗しました。対応策はあると思いますが、確認していないためOpenCV3.xを使用することにします。

```bash
$ wget -O opencv.zip https://github.com/opencv/opencv/archive/3.4.14.zip
$ unzip opencv.zip
```

続いてビルドをします。

```bash
$ cd opencv-3.4.14
$ mkdir build
$ cd build
$ cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local ..
$ make -j4
```

ビルドには時間がかかるので気長に待ちます。
ビルドが完了したらインストールします。

```bash
$ sudo make install
```

### libuvc-theta をビルド・インストールする

ようやく、今回の本丸libuvc-thetaをビルド・インストールします。
https://github.com/ricohapi/libuvc-theta

適当なディレクトリに移動し、libuvc-thetaのリポジトリをクローンします。

```bash
$ git clone https://github.com/ricohapi/libuvc-theta
```

そしてビルド・インストールします。

```bash
$ mkdir build
$ cd build
$ cmake ..
$ make
$ sudo make install
```

### libuvc-theta-sample を動かす

ようやく環境が整ったのでサンプルを動かしていきます。

まず、以下のリポジトリをクローンします。
https://github.com/codetricity/libuvc-theta-sample

```bash
$ git clone https://github.com/codetricity/libuvc-theta-sample
```

このリポジトリはRICOH本家のlibuvc-theta-sampleからforkして一部改変されているものです。
こちらのリポジトリではサンプル実行時の引数に`--format`が追加されており、4K or 2Kを指定することができます。
ラズパイ４はHWデコーダが4K対応しておらず、2Kでないと実用的に動かせないため、引数に`--format`に2Kを指定し実行します。
(Jetsonなどのハードウェアを使用すれば4Kでのライブストリーミングも可能と思います。)

```bash
$ cd gst
$ make
$ ./gst_viewer --format 2K
```

gst_viewerのウインドウが起動し、THETAで撮影されたEquirectangularの画像が表示されます。




続いてlibuvc-theta-sampleリポジトリに含まれているgst_loopbackを使用してみます。

まず、v4l2loopback をロードします。

```bash
$ sudo modprobe v4l2loopback
```

その後、Dummy video deviceのIDを確認します。

```bash
$ v4l2-ctl --list-devices
bcm2835-codec-decode (platform:bcm2835-codec):
	/dev/video10
	/dev/video11
	/dev/video12

bcm2835-isp (platform:bcm2835-isp):
	/dev/video13
	/dev/video14
	/dev/video15
	/dev/video16

Dummy video device (0x0000) (platform:v4l2loopback-000):
	/dev/video0
```
この場合、Dummy video deviceは`/dev/video0`なので、デバイスのインデックスとして`0`を使用します。

次に、gst_viewer.cのソースを変更します。
deviceのインデックスがハードコードされている部分を、先程確認したインデックスに書き換えます。

```diff_c
if (strcmp(cmd_name, "gst_loopback") == 0)
	pipe_proc = "decodebin ! autovideoconvert ! 
				"video/x-raw,format=I420 ! identity drop-allocation=true !"
-				"v4l2sink device=/dev/video2 qos=false sync=false";
+				"v4l2sink device=/dev/video0 qos=false sync=false";

```

再ビルドし、gst_loopbackを実行します。

```bash
$ make
$ ./gst_loopback --format 2K
```

正常に動作した場合、`start, hit any key to stop`と標準出力に表示されます。
これでv4l2デバイスとしてTHETAのライブストリーミング映像を取り扱える状態になりました。

試しにOpenCVのVideoCaptureでキャプチャしてみます。

```python:capture_test.py
import cv2


def main():
    # VideoCaptureの引数にはdeviceのインデックスを指定
    cap = cv2.VideoCapture(0)
    if cap.isOpened() is False:
        print("cannot open video capture.")
        return

    cv2.namedWindow("capture", cv2.WINDOW_NORMAL)
    print("press any key to stop")
    while(True):
        ret, frame = cap.read()
        cv2.imshow("capture", frame)
        key = cv2.waitKey(1)
        if key is not -1:
            break
    return


if __name__ == "__main__":
    main()
```

gst_viewerで表示した際よりも若干遅延がありますが、v4l2デバイスとしてVideoCaptureでキャプチャした画像が表示されます。
ここまでくれば、後は煮るなり焼くなり好きにすることができます。エンジョイ！

# まとめ

公開されているライブラリを使用してLinux(Raspberry Pi4)上でTHETA Vのライブストリーミング映像をキャプチャすることができました。
Linuxでキャプチャすることができるようになり、THETAをロボットに乗せてライブストリーミングするなどの用途が広がりそうです！