連載記事第5話は、キャプチャー画像やその処理結果画像をディスプレイへ表示する方法についてご紹介します。
[Jetsonビデオ処理プログラミング]
第1話 NVIDIA提供 JetPackとSDKでできること
第2話 ビデオ入力(CSI接続のLibargus準拠カメラ)
第5話 画像表示
画像表示API
Jetsonで利用できる画像表示APIは以下のようなものが存在します。
・GStreamerのビデオsinkプラグイン
・OpenCV High-level GUI
・Mulitimedia APIが提供するRendering API
・X11 + OpenGL ES
・NVIDIA Tegra Direct Rendering Manager (DRM)
それぞれの特徴について以下の表にまとめました。
API |
プログラミング言語 |
長所 |
短所/課題 |
GStreamerのビデオsinkプラグイン |
C Python |
・(比較的)簡単に使える |
・表示のみに利用するには使いづらい(すべての画像処理をGStreamerで行うべき) ・制御可能な機能が少ない |
OpenCV High-level GUI |
C Python |
・(比較的)簡単に使える |
・制御可能な機能が少ない |
Mulitimedia APIが提供するRendering API | C++ |
・(比較的)簡単に使える ・ソースコードが公開されている |
・制御可能な機能が少ない(ソースコードを改変すれば可能であるが、その難易度は高い) |
X11 + OpenGL ES | C |
・詳細な制御が可能 ・マルチプラットフォーム |
・難解 ・コーディング量が大 |
NVIDIA Tegra Direct Rendering Manager (DRM) | C |
・高速 ・DRM 2.0に準拠 |
・Linuxに関する深い知識が必要 |
GStreamerのビデオsinkプラグインを使う場合
NVMMメモリー(DMAバッファー:ハードウェアモジュール間で転送可能)上の画像データを表示できるビデオsinkプラグインを下表にまとめました。
プラグイン |
対応フォーマット |
備考 |
nv3dsink | RGBA, BGRA, ARGB, ABGR, RGBx, BGRx, xRGB, xBGR, AYUV, Y444, I420, YV12, NV12, NV21, Y42B, Y41B, RGB, BGR, RGB16 | |
nvegltransform + nveglglessink | I420, NV12, I422, NV16, I444, NV24, RGBA |
nvegltranformでEGLImageへ変換する必要あり NVIDIA DeepStream Plugin Manual -> Frequently Asked Questions -> Why is a Gst-nvegltransform plugin required on a Jetson platform upstream from Gst-nveglglessink? |
nvdrmvideosink | ドキュメントに記載なし | 実行時は、Ubuntuデスクトップを無効にする必要あり |
CPUメモリー上の画像データを表示する場合は、xvimagesinkなどのプラグインも利用可能
OpenCV High-level GUIを利用する場合
imshow関数で画像データの表示が可能です。
以下はOpenCV Python APIでのプログラミング例。
import cv2
import sys
cam_id = 0
cap = cv2.VideoCapture(cam_id)
if not cap.isOpened():
print("Cannot open camera")
sys.exit()
while True:
ret, frame = cap.read()
cv2.imshow("Test", frame)
key = cv2.waitKey(1)
if key == 27: # ESC
break
cv2.destroyAllWindows()
cap.release()
sys.exit()
Mulitimedia APIが提供するRendering APIを利用する場合
JetPackに含まれるV4L2サンプルコードの画像表示部分でRendering APIの使い方が分かります。このサンプルコードは以下のパスに存在します。
/usr/src/jetson_multimedia_api/samples/12_camera_v4l2_cuda
X11 + OpenGL ESを利用する場合
上記で述べたRendering APIが内部で行っている処理をユーザーが実装します。Rendering APIのソースコードが参考になります。
/usr/src/jetson_multimedia_api/samples/common/classes/NvEglRenderer.cpp
また、以下のサンプルコードも参考になります。
/usr/src/jetson_multimedia_api/argus/samples/eglImage
NVIDIA Tegra Direct Rendering Manager (DRM)を利用する場合
Multimedia APIパッケージに08_video_dec_drmサンプルコードが用意されておりますので、これを参考にしてください。なお、このサンプルコードは、JetsonのUbuntuデスクトップを無効にしてから、実行する必要があります。その方法は、上記リンク先ページの説明を参照してください。サンプルコードのパスは以下のとおりです。
/usr/src/jetson_multimedia_api/samples/08_video_dec_drm
次回は動画のエンコード方法について解説します!
連載記事「Jetsonビデオ処理プログラミング」の第5話、キャプチャー画像やその処理結果画像をディスプレイへ表示する方法をご紹介しましたがいかがでしたでしょうか。
次回は動画のエンコード方法についてご紹介します。
お困りのことがあれば、ぜひお問い合わせください
弊社ではハードウェアのNVIDIA GPUカードやGPUワークステーションの選定やサポート、また顔認証、導線分析、骨格検知のアルゴリズム、さらに学習環境構築サービスなどを取り揃えております。お困りの際は、ぜひお問い合わせください。