360°カメラ(RICOH THETA)をGStreamer+OpenCVで処理してみた

本サイトはアフィリエイト広告を利用しています。
AI

KR260と360°カメラ(RICOH THETA)でリアルタイムの画像処理をしました。

GStreamerでパイプラインを繋ぎ、OpenCVで処理しています。

インストール方法・プログラム含めて紹介します。

 

スポンサーリンク

360°カメラ(RICOH THETA)をGstreamer+OpenCVで処理してみた

KR260と360°カメラ(RICOH THETA)でリアルタイムの画像処理をしました。

Gstreamerでパイプラインを繋ぎ、OpenCVで処理しています。

USB経由で360°ライブストリーミングのデータを入手できるようになります。

 

実際に360°カメラ周りにボールを投げる様子をテストしてみました。

下記の360°画像はKR260上がRICOH THETAからリアルタイムで取得したものです。

上から見た図を一緒に確認すると、よく分かります。

 

更にOpenCVで「360°画像を4分割」+「画面の位置シフト」の処理を行っています。

後々に行う、DPUでの物体検出の前処理(pre_process)の練習のためです。

 

テスト動画は下記となっています。

 

 

インストール方法・プログラム含めて紹介します。

 

libuvc

USBカメラであるRICOH THETAから、ビデオストリームを取得できるようにします。

UVC(USB Video Class)関連のライブラリが必要になります。

下記libuvcのライブラリをダウンロード・インストールします。

 

下記GitHubを参照しています。

https://github.com/nickel110/libuvc.git

 

GStreamer

Gstreamerのパイプラインを使います。

ビデオストリームをエンコード処理まで実施できるようになります。

 

下記Gstreamerの公式HPを参照しています。

https://gstreamer.freedesktop.org/documentation/installing/on-linux.html?gi-language=c

 

 

v4l2loopback-dkms

v4l2loopback-dkmsまで必要かは少し怪しいですが、一応インストールしときます。

仮想的なビデオデバイスを生成できるようになります。

 

gstthetauvc

Gstreamer THETA UVC plugin(gstthetauvc)をダウンロード・インストールします。

RICOH THETA用のプラグインです。

Gstreamerでビデオストリームを簡単に取得できるようになります

 

下記GitHubを参照しています。

https://github.com/nickel110/gstthetauvc.git

 

makeで作った「gstthetauvc.so」をgstreamerのプラグインのフォルダに入れます。

「gstreamer-1.0」が何処にあるか不明だったため、findで探しています

 

最後に下記コマンドを実行して、ライブラリのリンクとキャッシュを更新しました。

 

下記コマンドで「gstthetauvc」のプラグインが使えるか確認できます。

 

Gstreamerのテスト

ここからは画像使ってのテストのため、UbuntuのGUI上で行っています。

KR260のディスプレイポートから、画面表示させて実行しています。

 

今回はPYNQの仮想環境ではなく、通常のroot環境で実行しています。

OpenCVのビルド情報も確認して、Gstreamerに対応していることも確認しておきます。

確認プログラムに関しては下記です。下記GitHubにも置いています。

 https://github.com/iotengineer22/AMD-Pervasive-AI-Developer-Contest/blob/main/src/gst-test/gst-back-check.py

 

実行すると、下記のOpenCVのビルド情報が確認でき、Gstreamerでデモ画面が表示されます。

「GStreamer: YES (1.19.90)」も確認できました。

 

RICOH THETAを使っての画像処理

実際にRICOH THETAを使ってGstreamer+OpenCVで画像処理してみました。

Gstreamerで2K(1920x960)の360°ビデオストリームを画像処理します。

 

GStreamerのパイプライン

今回KR260にTHETAから360°ライブストリーミングを取得したパイプラインは下記です。

パイプライン定義した後は、opencvに渡してます。

プログラムの一部を切り出すと、下記内容です。

 

360°ライブストリーミング

最初にRICOH THETA(360)からの360°画像をそのままKR260で取得します。

360°ライブストリーミングをリアルタイムで画面表示することが可能です。

プログラムはPythonで書いています。下記GitHubに置いています。

 https://github.com/iotengineer22/AMD-Pervasive-AI-Developer-Contest/blob/main/src/gst-test/gst-test-360-no-divide.py

 

実際に360°カメラ周りにボールを投げる様子をテストしてみました。

テスト動画は下記です。

 

360°ビデオストリーミングをKR260上がRICOH THETAからリアルタイムで取得しています。

 

パイプラインの構成です。OpenCVはimshowで表示させるだけのために使っています。

2k(1920x960)の画像データを取得・表示させています。

 

ボールを投げて、360°カメラ周りに投げてテストしています。

 

上から見た図を一緒に確認すると、よく分かります。

 

OpenCVで前処理(pre_process)の練習

更にOpenCVで「360°画像を4分割」+「画面の位置シフト」の処理を行っています。

後々に行う、DPUでの物体検出の前処理(pre_process)の練習のためです。

プログラムは下記GitHubに置いています。

 https://github.com/iotengineer22/AMD-Pervasive-AI-Developer-Contest/blob/main/src/gst-test/gst-test-360-4divide.py

 

テスト動画は下記です。

 

1920x960の画像をseciton1~4に分けて、480x960の4枚にしています。

更に360°カメラの正面が、section1の中心に位置するようにシフトしています。

 

 

Future Work

今回、Gstreamerのパイプラインでソフトウェアデコーダ(avdec_h264)を使いました。

但し、KR260のZynq UltraScale+ EVにはH.264/H.265ビデオコーデックが搭載されています。

もともとはH.264/H.265 ハードウェアエンコーダ・デコーダを使いたいと考えていました。

 

ただKR260のUbuntuのプラグインを確認しましたが、ハードウェアのものがありませんでした。

 

公式の下記ドキュメントを確認すると、Petalinuxで入れ込む必要があるということでした。

更にハードウェアデコーダをFPGAに合成する必要があります。

AMD Technical Information Portal

 

公式のプラグイン確認方法を試してみましたが、もちろん存在していませんでした。

今回はハードウェアエンコーダ・デコーダは諦めますが、また何処で試してみたいと思います。

 

まとめ

KR260と360°カメラ(RICOH THETA)でリアルタイムの画像処理をしました。

Gstreamerでパイプラインを繋ぎ、OpenCVで処理しています。

 

今回のKR260で実施した内容は、下記記事で紹介したテストの一部です。

AMD(Xilinx)のFPGAコンテストに参加した感想

AMD(Xilinx)のFPGAコンテストに参加した感想
AMD(Xilinx)とHackster(Avnet)が合同主催する、海外のコンテストに参加していました。AMD Pervasive AI Developer Contest の「Robotics AI」部門です。KR260というFPGAボ...

コメント