連載記事第5話は、キャプチャー画像やその処理結果画像をディスプレイへ表示する方法についてご紹介します。

 

[Jetsonビデオ処理プログラミング]

第1話 NVIDIA提供 JetPackとSDKでできること

第2話 ビデオ入力(CSI接続のLibargus準拠カメラ)

第3話 ビデオ入力(USB接続のV4L2準拠カメラ)

第4話 リサイズとフォーマット変換

第5話 画像表示

第6話 動画エンコード

第7話 動画デコード

第8話 画像処理

第9話 ディープラーニング推論

第10話 計算リソースの最大活用

画像表示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ワークステーションの選定やサポート、また顔認証、導線分析、骨格検知のアルゴリズム、さらに学習環境構築サービスなどを取り揃えております。お困りの際は、ぜひお問い合わせください。