人工知能がますます進化するにつれて、ロボットは危険な場所の検査や日常的な視覚監視の退屈さから人間を解放するために、ますます使用されるようになっています。一定程度の自律的な意思決定を提供するために、ロボットにはしばしば、NVIDIA Jetsonやx86シングルボードコンピュータ(SBC)などのオンボードLinuxコンピュータに接続されたカメラが搭載されています。
アプリケーションが360度ライブビデオを活用する場合、2つのアプローチがあります。最初の、より難しいアプローチは、複数のカメラを使用し、ビデオをコンピュータ上で編集するか、各ビデオフィードを個別に処理することです。使用するカメラの数は、各カメラの視野に依存します。ロボットが180度以上を表示できる2つの魚眼レンズを使用している場合、2つのカメラだけが必要です。3つまたは4つのカメラを使用することが一般的です。
より簡単なアプローチは、消費者向けの360°カメラを使用することです。自由で独立したtheta360.guide開発コミュニティでは、開発者がロボットプロトタイプに360°ビジョンを追加し、ビデオをOpenCVに入力する方法について最も人気のあるトピックの1つです。
360度カメラからLinuxコンピュータにビデオを取得するための異なる方法がありますが、最も一般的な方法はUSBケーブルを使用することです。WiFiとEthernetはあまり一般的ではありません。RICOH THETA V、X、Z1モデルは、LinuxコンピュータにUSBウェブカムとして表示されることがあります。ただし、Linux上での作業が少し必要です。MacOSコンピュータは、RICOH THETAカメラを直接使用できます。Windowsでは、RICOHがドライバを提供しています。Linuxでは、RICOHがGitHubでlibuvc-thetaと呼ばれるlibuvcの改良版を提供しています。
カメラをOpenCVにビデオデバイスとして公開するために、RICOHはサンプルプログラムlibuvc-theta-sampleを提供しています。これはv4l2loopbackと共に使用して、OpenCVに/dev/video*
デバイスを利用できるようにします。
カメラをLinuxコンピュータに接続して接続をテストするには、まずカメラからLinuxコンピュータにUSBケーブルを接続し、次の手順を実行します:
git clone https://github.com/ricohapi/libuvc-theta.git
sudo apt install libjpeg-dev
cd libuvc-theta
mkdir build
cd build
cmake ..
make
sudo make install
cd ../..
git clone https://github.com/ricohapi/libuvc-theta-sample.git
cd libuvc-theta-sample/gst
make
# THETAをコンピュータに接続し、
# ライブストリーミングモードである必要があります
./gst_viewer
gstreamerで表示される360°ビデオカメラ
ビルドに失敗した場合は、追加のgstreamerライブラリが必要な場合があります。これにより、すべてのライブラリがインストールされます。
sudo apt-get install \
libgstreamer1.0-0 \
gstreamer1.0-plugins-base \
gstreamer1.0-plugins-good \
gstreamer1.0-plugins-bad \
gstreamer1.0-plugins-ugly \
gstreamer1.0-libav \
gstreamer1.0-doc \
gstreamer1.0-tools \
gstreamer1.0-x \
gstreamer1.0-alsa \
gstreamer1.0-gl \
gstreamer1.0-gtk3 \
gstreamer1.0-qt5 \
gstreamer1.0-pulseaudio \
libgstreamer-plugins-base1.0-dev
さらに、Raspberry Pi 4は4K H.264ハードウェアデコードサポートが不足しているため動作しません。
/dev/video*の設定
libuvcデバイスをビデオデバイスとして利用可能にするには、v4l2loopbackを使用できます。libuvc-theta-sampleアプリケーションは、ビデオをv4l2にシンクするためにgstreamerを使用します。
コンピューターに単一のビデオカメラしかない場合は、ビルドを実行する前にこの行を変更する必要があります。以下は、RICOH THETAが唯一のウェブカムとして接続されているコンピューター向けの行です。
"v4l2sink device=/dev/video0 sync=false";
OpenCVからのアクセス
OpenCVからカメラを使用できるかどうかをテストするには、単純なフレームのリサイズから始めましょう。
import cv2
cap = cv2.VideoCapture(0)
# ウェブカムが正しくオープンされているかをチェック
if not cap.isOpened():
raise IOError("Cannot open webcam")
while True:
ret, frame = cap.read()
frame = cv2.resize(frame, None, fx=0.25, fy=0.25, interpolation=cv2.INTER_AREA)
cv2.imshow('Input', frame)
c = cv2.waitKey(1)
if c == 27:
break
cap.release()
cv2.destroyAllWindows()
カメラの遅延
遅延はコミュニティの議論で大きな問題です。THETAカメラの遅延は約350msです。これは、ロボットが素早く反応する必要がある多くのアプリケーションや、障害物を避けながら移動するドローンを制御する場合にも高すぎます。遅延は、2つのレンズのインカメラステッチングに起因します。ビデオフィードでステッチングを無効にすることはできません。
v4l2loopbackの代替案
v4l2loopbackを使用すると複雑さとオーバーヘッドが増加するため、gstthetauvcパッケージを使用して、カメラに直接アクセスすることができます。
以下は、gstthetauvcを使用した同じテストです。
import cv2
# 以下のパイプラインが動作しました
# cap = cv2.VideoCapture("thetauvcsrc \
# ! decodebin \
# ! autovideoconvert \
# ! video/x-raw,format=BGRx \
# ! queue ! videoconvert \
# ! video/x-raw,format=BGR ! queue ! appsink")
# nickel110さんに感謝のパイプライン提案
# ハードウェアアクセラレーションを強制する試み
# NVIDIA 510.73と古いGTX 950を使用してUbuntu 22.04でテスト済み
cap = cv2.VideoCapture("thetauvcsrc \
! queue \
! h264parse \
! nvdec \
! gldownload \
! queue \
! videoconvert n-threads=0 \
! video/x-raw,format=BGR \
! queue \
! appsink")
if not cap.isOpened():
raise IOError('Cannot open RICOH THETA')
while True:
ret, frame = cap.read()
frame = cv2.resize(frame, None, fx=0.5, fy=0.5, interpolation=cv2.INTER_AREA)
cv2.imshow('frame', frame)
c = cv2.waitKey(1)
if c == 27:
break
cap.release()
cv2.destroyAllWindows()
360度ビデオライブフィードの例
以下は、色変換やエッジ検出のためにOpenCVを使用する例です。
# グレースケールに変換
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# エッジ検出のために画像をぼかす
img_blur = cv2.GaussianBlur(img_gray, (3,3), 0)
# Cannyエッジ検出
edges = cv2.Canny(image=img_blur, threshold1=100, threshold2=200) # Cannyエッジ検出
# Cannyエッジ検出画像の表示
cv2.imshow('Canny Edge Detection', edges)
ライブ人物およびモニター検出。
カメラには2つのレンズがあります。シャッターボタンと反対側の側にはリアレンズがあり、シーンの中心に配置されます。オブジェクト検出は、オブジェクトが正確にequirectangularビューの中心に配置されているときに最も正確です。
リアレンズに中心に配置された人間
しかしながら、人間がエクイレクタングルビューの端にいても、検出はかなりうまく機能します。夜間でも同様です。モデルを魚眼レンズまたは360°画像のデータベースでトレーニングする必要があるかもしれません。
エクイレクタングルビューの端で人が検出されました
検出の改善
ライブ360°ビデオフィードからのエクイレクタングルフレームで基本的な検出が機能しているところまで来たので、精度を向上させるためのさまざまなテクニックを試してみることができます。1つの方法は、各フレームから複数の平坦化されたシーンを作成し、それぞれのシーンでオブジェクトを検出することです。エンジニアのmisojiが提供する動画360° Object Detect(Yolo) in ROS2 rviz2 and KR260は、このテクニックの良いデモンストレーションを提供しています。また、パノラマビデオ用に改良されたYOLOのバージョンもあります。論文PV-YOLO: An Object Detection Model for Panoramic Video based on YOLOv4を参照してください。
結論
一般の市販360°カメラを使用すると、360°ビデオをUSBウェブカメラとしてOpenCVなどのソフトウェアに簡単に表示できます。 360°ビデオはビデオデバイスとしてアクセスしたり、gstreamerを介してアクセスしたりできますので、標準のOpenCVや他の検出ソフトウェアをライブビデオの正距円筒図形フレームに使用できます。 画像の歪みのため、物体検出アルゴリズムは、標準の非360°ウェブカメラと比較してうまく動作しません。 ただし、変更せずにいくつかの検出を開始することができます。 実際に歪んだ正距円筒ビュー内のオブジェクトを認識するために検出を教育または研究プロジェクト以上に使用するには、オブジェクトの認識を改善する技術を調査する必要があります。
Source:
https://dzone.com/articles/opencv-integration-live-video-for-robotics