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をビルドするのでそのために必要なライブラリも含まれています。
$ 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を使用することにします。
$ wget -O opencv.zip https://github.com/opencv/opencv/archive/3.4.14.zip
$ unzip opencv.zip
続いてビルドをします。
$ cd opencv-3.4.14
$ mkdir build
$ cd build
$ cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local ..
$ make -j4
ビルドには時間がかかるので気長に待ちます。
ビルドが完了したらインストールします。
$ sudo make install
libuvc-theta をビルド・インストールする
ようやく、今回の本丸libuvc-thetaをビルド・インストールします。
https://github.com/ricohapi/libuvc-theta
適当なディレクトリに移動し、libuvc-thetaのリポジトリをクローンします。
$ git clone https://github.com/ricohapi/libuvc-theta
そしてビルド・インストールします。
$ mkdir build
$ cd build
$ cmake ..
$ make
$ sudo make install
libuvc-theta-sample を動かす
ようやく環境が整ったのでサンプルを動かしていきます。
まず、以下のリポジトリをクローンします。
https://github.com/codetricity/libuvc-theta-sample
$ git clone https://github.com/codetricity/libuvc-theta-sample
このリポジトリはRICOH本家のlibuvc-theta-sampleからforkして一部改変されているものです。
こちらのリポジトリではサンプル実行時の引数に--format
が追加されており、4K or 2Kを指定することができます。
ラズパイ4はHWデコーダが4K対応しておらず、2Kでないと実用的に動かせないため、引数に--format
に2Kを指定し実行します。
(Jetsonなどのハードウェアを使用すれば4Kでのライブストリーミングも可能と思います。)
$ cd gst
$ make
$ ./gst_viewer --format 2K
gst_viewerのウインドウが起動し、THETAで撮影されたEquirectangularの画像が表示されます。
続いてlibuvc-theta-sampleリポジトリに含まれているgst_loopbackを使用してみます。
まず、v4l2loopback をロードします。
$ sudo modprobe v4l2loopback
その後、Dummy video deviceのIDを確認します。
$ 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のインデックスがハードコードされている部分を、先程確認したインデックスに書き換えます。
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を実行します。
$ make
$ ./gst_loopback --format 2K
正常に動作した場合、start, hit any key to stop
と標準出力に表示されます。
これでv4l2デバイスとしてTHETAのライブストリーミング映像を取り扱える状態になりました。
試しにOpenCVのVideoCaptureでキャプチャしてみます。
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をロボットに乗せてライブストリーミングするなどの用途が広がりそうです!