detamamoruのブログ

興味を持ったことや勉強したことに関して記事を書きます。主に低レイヤー寄りの記事を公開。

Raspberry Pi B+でinsta360 airの動画をOpenCVで処理する

出田 守です。
昔購入したRaspberry Pi B+が寂しそうにこちらを見ていたので、何かに使ってあげることにしました。
まず、ラズパイ自身の視点になって今どういう気持ちなのか確かめることにしました。

事前準備

  1. 最新のRaspbianをインストール(この時はRelease date: 2020-02-13のものが最新でした)
  2. OpenCV>=3.1.0をインストール
  3. mjpeg-streamerのインストール

OpenCVはなぜバージョンが3かというとこの後、使用するmjpg-streamerというツールでinput_opencvというプラグインを使おうと思っています。このプラグインがバージョン3しか対応してなさそうだったためです。ちなみに、最初pip3を使ってopencv-pythonをインストールしたのですが、mjpg-streamerでopencvを見つけてくれなかったので、ソースからビルドしました。以下のリンクなどを参考にしてビルドしました。めちゃめちゃ時間かかりました。
mjpeg-streamerは色んな入出力用のプラグインを組み合わせてjpegフレームを処理してくれるツールです。事前準備を済ませた上で、インストールはGitHubを見れば簡単にできました。

参考:

OpenCVで処理してからストリーミング

input_opencvプラグインを使って、撮影した動画をOpenCVに入力・処理してから、output_httpプラグインを使って出力された動画をブラウザで見てみようと思います。

./mjpg_streamer -i "./input_opencv.so --filter ./cvfilter_py.so --fargs ./plugins/input_opencv/filters/cvfilter_py/example_filter.py -f 10 -r 320x240 -d /dev/video0" -o "./output_http.so -w ./www -p 8080"

input_opencvプラグインの説明ではopencv3.1.0でしかテストしていませんと書いてあります。私は試しに3.4.9をインストールして試しましたが、サンプルを動かした限り大丈夫そうです。
実行コマンドはちょっと長いですが、簡単に各オプションは以下のような意味です。

オプション 説明
-i インプットプラグインを指定
--filter input_opencvを指定した場合に、フィルターファイルがPythonの場合はcvfilter_py.soを、C++の場合はcvfilter_cpp.soを指定
--fargs フィルターファイルを指定
-f フレームレート
-r 解像度
-d カメラのデバイスファイル
-o アウトプットプラグインを指定
-w 表示用ソースが入ったフォルダを指定
-p ポート番号

実行後無事起動すれば、LAN内でブラウザから魚眼2つを見ることができます。
これだけでは、ラズパイの気持ちが分からないので、次回はスティッチングという処理をして見やすくしようと思います。