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
1 2 3 4 5 6 |
321 git clone https://github.com/nickel110/libuvc.git 322 cd libuvc/ 323 mkdir build 324 cd build/ 325 cmake .. 326 make && sudo make install |
GStreamer
Gstreamerのパイプラインを使います。
ビデオストリームをエンコード処理まで実施できるようになります。
下記Gstreamerの公式HPを参照しています。
https://gstreamer.freedesktop.org/documentation/installing/on-linux.html?gi-language=c
1 |
sudo apt install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libgstreamer-plugins-bad1.0-dev gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-qt5 gstreamer1.0-pulseaudio |
v4l2loopback-dkms
v4l2loopback-dkmsまで必要かは少し怪しいですが、一応インストールしときます。
仮想的なビデオデバイスを生成できるようになります。
1 |
sudo apt install v4l2loopback-dkms |
gstthetauvc
Gstreamer THETA UVC plugin(gstthetauvc)をダウンロード・インストールします。
RICOH THETA用のプラグインです。
Gstreamerでビデオストリームを簡単に取得できるようになります
下記GitHubを参照しています。
https://github.com/nickel110/gstthetauvc.git
1 2 3 |
git clone https://github.com/nickel110/gstthetauvc.git cd gstthetauvc/thetauvc/ make |
makeで作った「gstthetauvc.so」をgstreamerのプラグインのフォルダに入れます。
「gstreamer-1.0」が何処にあるか不明だったため、findで探しています
1 2 3 4 |
sudo find / -type d -name 'gstreamer-1.0' ls /usr/lib/aarch64-linux-gnu/gstreamer-1.0 sudo cp gstthetauvc.so /usr/lib/aarch64-linux-gnu/gstreamer-1.0 ls /usr/lib/aarch64-linux-gnu/gstreamer-1.0 |
最後に下記コマンドを実行して、ライブラリのリンクとキャッシュを更新しました。
1 |
sudo /sbin/ldconfig -v |
下記コマンドで「gstthetauvc」のプラグインが使えるか確認できます。
1 |
gst-inspect-1.0 thetauvcsrc |
Gstreamerのテスト
ここからは画像使ってのテストのため、UbuntuのGUI上で行っています。
KR260のディスプレイポートから、画面表示させて実行しています。
今回はPYNQの仮想環境ではなく、通常のroot環境で実行しています。
OpenCVのビルド情報も確認して、Gstreamerに対応していることも確認しておきます。
確認プログラムに関しては下記です。下記GitHubにも置いています。
実行すると、下記のOpenCVのビルド情報が確認でき、Gstreamerでデモ画面が表示されます。
「GStreamer: YES (1.19.90)」も確認できました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 |
root@kria:/home/ubuntu# python3 gst-back-check.py General configuration for OpenCV 4.5.4 ===================================== Version control: unknown Extra modules: Location (extra): /build/opencv-Ro9xS7/opencv-4.5.4+dfsg/contrib/modules Version control (extra): unknown Platform: Timestamp: 2022-02-02T14:55:11Z Host: Linux 4.15.0-167-generic aarch64 CMake: 3.22.1 CMake generator: Ninja CMake build tool: /usr/bin/ninja Configuration: Release CPU/HW features: Baseline: NEON FP16 C/C++: Built as dynamic libs?: YES C++ standard: 11 C++ Compiler: /usr/bin/c++ (ver 11.2.0) C++ flags (Release): -g -O2 -ffile-prefix-map=/build/opencv-Ro9xS7/opencv-4.5.4+dfsg=. -flto=auto -ffat-lto-objects -flto=auto -ffat-lto-objects -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wuninitialized -Wsuggest-override -Wno-delete-non-virtual-dtor -Wno-comment -Wimplicit-fallthrough=3 -Wno-strict-overflow -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections -fvisibility=hidden -fvisibility-inlines-hidden -g -O2 -ffile-prefix-map=/build/opencv-Ro9xS7/opencv-4.5.4+dfsg=. -flto=auto -ffat-lto-objects -flto=auto -ffat-lto-objects -fstack-protector-strong -Wformat -Werror=format-security -DNDEBUG C++ flags (Debug): -g -O2 -ffile-prefix-map=/build/opencv-Ro9xS7/opencv-4.5.4+dfsg=. -flto=auto -ffat-lto-objects -flto=auto -ffat-lto-objects -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wuninitialized -Wsuggest-override -Wno-delete-non-virtual-dtor -Wno-comment -Wimplicit-fallthrough=3 -Wno-strict-overflow -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections -fvisibility=hidden -fvisibility-inlines-hidden -g -DDEBUG -D_DEBUG C Compiler: /usr/bin/cc C flags (Release): -g -O2 -ffile-prefix-map=/build/opencv-Ro9xS7/opencv-4.5.4+dfsg=. -flto=auto -ffat-lto-objects -flto=auto -ffat-lto-objects -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fsigned-char -W -Wall -Werror=return-type -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -Wuninitialized -Wno-comment -Wimplicit-fallthrough=3 -Wno-strict-overflow -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections -fvisibility=hidden -g -O2 -ffile-prefix-map=/build/opencv-Ro9xS7/opencv-4.5.4+dfsg=. -flto=auto -ffat-lto-objects -flto=auto -ffat-lto-objects -fstack-protector-strong -Wformat -Werror=format-security -DNDEBUG C flags (Debug): -g -O2 -ffile-prefix-map=/build/opencv-Ro9xS7/opencv-4.5.4+dfsg=. -flto=auto -ffat-lto-objects -flto=auto -ffat-lto-objects -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fsigned-char -W -Wall -Werror=return-type -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -Wuninitialized -Wno-comment -Wimplicit-fallthrough=3 -Wno-strict-overflow -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections -fvisibility=hidden -g -DDEBUG -D_DEBUG Linker flags (Release): -Wl,-Bsymbolic-functions -flto=auto -ffat-lto-objects -flto=auto -Wl,-z,relro -Wl,-z,now -Wl,--gc-sections -Wl,--as-needed -Wl,-Bsymbolic-functions -flto=auto -ffat-lto-objects -flto=auto -Wl,-z,relro -Wl,-z,now Linker flags (Debug): -Wl,-Bsymbolic-functions -flto=auto -ffat-lto-objects -flto=auto -Wl,-z,relro -Wl,-z,now -Wl,--gc-sections -Wl,--as-needed ccache: NO Precompiled headers: NO Extra dependencies: dl m pthread rt 3rdparty dependencies: OpenCV modules: To be built: alphamat aruco barcode bgsegm bioinspired calib3d ccalib core datasets dnn dnn_objdetect dnn_superres dpm face features2d flann freetype fuzzy hdf hfs highgui img_hash imgcodecs imgproc intensity_transform java line_descriptor mcc ml objdetect optflow phase_unwrapping photo plot python3 quality rapid reg rgbd saliency shape stereo stitching structured_light superres surface_matching text tracking video videoio videostab viz wechat_qrcode ximgproc xobjdetect xphoto Disabled: world Disabled by dependency: sfm Unavailable: cudaarithm cudabgsegm cudacodec cudafeatures2d cudafilters cudaimgproc cudalegacy cudaobjdetect cudaoptflow cudastereo cudawarping cudev cvv gapi julia matlab ovis python2 ts Applications: apps Documentation: doxygen python javadoc Non-free algorithms: NO GUI: GTK3 GTK+: YES (ver 3.24.30) GThread : YES (ver 2.71.1) GtkGlExt: NO OpenGL support: NO VTK support: YES (ver 9.1.0) Media I/O: ZLib: /usr/lib/aarch64-linux-gnu/libz.so (ver 1.2.11) JPEG: /usr/lib/aarch64-linux-gnu/libjpeg.so (ver 80) WEBP: /usr/lib/aarch64-linux-gnu/libwebp.so (ver encoder: 0x020f) PNG: /usr/lib/aarch64-linux-gnu/libpng.so (ver 1.6.37) TIFF: /usr/lib/aarch64-linux-gnu/libtiff.so (ver 42 / 4.3.0) JPEG 2000: OpenJPEG (ver 2.4.0) OpenEXR: /usr/lib/aarch64-linux-gnu/libImath-2_5.so /usr/lib/aarch64-linux-gnu/libIlmImf-2_5.so /usr/lib/aarch64-linux-gnu/libIex-2_5.so /usr/lib/aarch64-linux-gnu/libHalf-2_5.so /usr/lib/aarch64-linux-gnu/libIlmThread-2_5.so (ver 2_5) GDAL: YES (/lib/libgdal.so) GDCM: YES (3.0.10) HDR: YES SUNRASTER: YES PXM: YES PFM: YES Video I/O: DC1394: YES (2.2.6) FFMPEG: YES avcodec: YES (58.134.100) avformat: YES (58.76.100) avutil: YES (56.70.100) swscale: YES (5.9.100) avresample: NO GStreamer: YES (1.19.90) PvAPI: NO v4l/v4l2: YES (linux/videodev2.h) gPhoto2: YES Parallel framework: TBB (ver 2020.3 interface 11103) Trace: YES (built-in) Other third-party libraries: Lapack: NO Eigen: YES (ver 3.4.0) Custom HAL: NO Protobuf: /usr/lib/aarch64-linux-gnu/libprotobuf.so (3.12.4) OpenCL: YES (no extra features) Include path: /usr/include/CL Link libraries: Dynamic load Python 3: Interpreter: /usr/bin/python3 (ver 3.10.2) Libraries: /usr/lib/aarch64-linux-gnu/libpython3.10.so (ver 3.10.2) numpy: /usr/lib/python3/dist-packages/numpy/core/include (ver 1.21.5) install path: lib/python3.10/dist-packages Python (for build): /usr/bin/python3 Java: ant: /usr/bin/ant (ver 1.10.12) JNI: /usr/lib/jvm/default-java/include /usr/lib/jvm/default-java/include/linux /usr/lib/jvm/default-java/include Java wrappers: YES Java tests: NO Install to: /usr ----------------------------------------------------------------- GStreamer: GStreamer: YES (1.19.90) |
RICOH THETAを使っての画像処理
実際にRICOH THETAを使ってGstreamer+OpenCVで画像処理してみました。
Gstreamerで2K(1920x960)の360°ビデオストリームを画像処理します。
GStreamerのパイプライン
今回KR260にTHETAから360°ライブストリーミングを取得したパイプラインは下記です。
パイプライン定義した後は、opencvに渡してます。
プログラムの一部を切り出すと、下記内容です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# Definition of the GStreamer pipeline (software) pipeline = "thetauvcsrc mode=2K ! h264parse ! avdec_h264 ! videoconvert ! video/x-raw,format=BGR ! appsink" # Initialize the VideoCapture object cap = cv2.VideoCapture(pipeline, cv2.CAP_GSTREAMER) while True: ret, frame = cap.read() if not ret: print("Failed to receive the frame.") break # Display the full frame cv2.imshow("Full Frame", frame) |
360°ライブストリーミング
最初にRICOH THETA(360)からの360°画像をそのままKR260で取得します。
360°ライブストリーミングをリアルタイムで画面表示することが可能です。
プログラムはPythonで書いています。下記GitHubに置いています。
実際に360°カメラ周りにボールを投げる様子をテストしてみました。
テスト動画は下記です。
360°ビデオストリーミングをKR260上がRICOH THETAからリアルタイムで取得しています。
パイプラインの構成です。OpenCVはimshowで表示させるだけのために使っています。
2k(1920x960)の画像データを取得・表示させています。
ボールを投げて、360°カメラ周りに投げてテストしています。
上から見た図を一緒に確認すると、よく分かります。
OpenCVで前処理(pre_process)の練習
更にOpenCVで「360°画像を4分割」+「画面の位置シフト」の処理を行っています。
後々に行う、DPUでの物体検出の前処理(pre_process)の練習のためです。
プログラムは下記GitHubに置いています。
テスト動画は下記です。
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のプラグインを確認しましたが、ハードウェアのものがありませんでした。
1 2 3 4 5 6 7 8 9 10 11 12 |
root@kria:/home/ubuntu# gst-inspect-1.0 |grep h264 libav: avdec_h264: libav H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 decoder libav: avenc_h264_omx: libav OpenMAX IL H.264 video encoder encoder openh264: openh264dec: OpenH264 video decoder openh264: openh264enc: OpenH264 video encoder rtp: rtph264depay: RTP H264 depayloader rtp: rtph264pay: RTP H264 payloader typefindfunctions: video/x-h264: h264, x264, 264 uvch264: uvch264deviceprovider (GstDeviceProviderFactory) uvch264: uvch264mjpgdemux: UVC H264 MJPG Demuxer uvch264: uvch264src: UVC H264 Source videoparsersbad: h264parse: H.264 parser |
公式の下記ドキュメントを確認すると、Petalinuxで入れ込む必要があるということでした。
更にハードウェアデコーダをFPGAに合成する必要があります。
公式のプラグイン確認方法を試してみましたが、もちろん存在していませんでした。
今回はハードウェアエンコーダ・デコーダは諦めますが、また何処で試してみたいと思います。
1 2 |
root@kria:/home/ubuntu# gst-inspect-1.0 –-version No such element or plugin '–-version' |
まとめ
KR260と360°カメラ(RICOH THETA)でリアルタイムの画像処理をしました。
Gstreamerでパイプラインを繋ぎ、OpenCVで処理しています。
今回のKR260で実施した内容は、下記記事で紹介したテストの一部です。
コメント