ビデオ処理システムにとってビデオ入力の方法は最初に考慮すべきものだと思います。連載記事第2話は、Jetsonに接続したCSI接続のLibargus準拠カメラから画像を取り込む方法についてご紹介します。
[Jetsonビデオ処理プログラミング]
第1話 NVIDIA提供 JetPackとSDKでできること
第2話 ビデオ入力(CSI接続のLibargus準拠カメラ)
カメラ接続インターフェース
JetsonにはMIPI Camera Serial Interface(CSI)と呼ばれるカメラ専用インターフェースが備わっています。今回は、このCSI接続のカメラ(以下、「CSIカメラ」とします)の話ですが、最初に、他の接続方式も見てみましょう。
接続方式 |
長所 |
短所/課題 |
CSI |
・低遅延 ・高フレームレート |
・カメラのモデルごとにデバイスドライバーが必要 ・JetsonのISPを利用する場合は、NVIDIA社の認定するカメラパートナーからのサポートが必要(有償) |
USB Video Class (UVC) |
・入手が容易 ・低価格なウェブカメラから、高性能な工業用カメラまでバリエーションが豊富 |
・CSI方式と比較すると高遅延 |
USB3 Vision |
・高フレームレート |
・Jetson対応製品が少ない |
GigE |
・長距離伝送 |
・Jetson対応製品が少ない |
IP (ネットワークカメラ) |
・入手が容易 |
・高遅延 ・(通常、圧縮されているので)低画質 |
CSI
CSIはMobile Industry Processor Interface (MIPI) Allianceによって策定されている規格であり、現行のJetson製品はすべてCSI-2に準拠し、CSI専用のI/Oピンを備えています。但し、レーン数や、PHYがJetsonのモデル毎に異なるため、Jetsonシリーズ内で、カメラの最大接続数や、対応するフレームレートなどが異なります。
Jetsonに対応するCSIカメラはサードパーティー各社から発売されておりますが、手軽に利用できる代表的なものとしてRaspberry PiカメラモジュールV2(V1には対応しないので注意)が存在し、Jetson Nano開発者キットとJetson Xavier NX開発者キットに接続できます。
Jetsonに対応するCSIカメラ
Jetsonに対応するCSIカメラはサードパーティー各社から販売されています。カメラのモデルごとに対応するLinuxデバイスドライバーが必要ですので、必ず、Jetsonに対応したCSIカメラをお求めください。
CSIカメラを選択する際の注意
CSIカメラの利用で注意いただきたいのは、CSIカメラ(イメージセンサー)のモデルごとにLinuxデバイスドライバーが必要ということです。先に述べたRaspberry PiカメラモジュールV2用デバイスドライバーはJetsonのL4T OSに最初から含まれているので、すぐに利用できるようになっています。
CSIカメラは通常Raw(Bayer)と呼ばれる形式で画像データを出力します。これをJetson内部に存在するImage Signal Processor(ISP)と呼ばれるモジュールで、CFA補間(デモザイク)、ノイズ除去、画素欠陥補正、ひずみ補正、ガンマ補正など数々の処理を施して、画像処理のソフトウェアが扱うことのできる画像データへ変換します。但し、JetsonのISPモジュールはその詳細が非公開であり、NVIDIA社から特別にその情報開示を受けたJetsonカメラパートナーと呼ばれるサードパーティーのみがJetsonのISPを扱うことができます。そのため、未対応のCSIカメラをJetsonで使えるようにするためには、Jetsonカメラパートナーからのサポート(有償)を受ける必要があります。カメラ側にISP機能を持つカメラであれば、JetsonのISPをバイパスすることで、デバイスドライバー開発の難易度は下がる可能性がありますが、開発が必要があることに変わりはありません。こういった状況はJetsonに限ったものではなく、他のプラットフォームにも当てはまると思われます。
接続方式 |
Jetsonの ISPを使用 |
API |
CSI |
Yes |
Libargus |
CSI |
No ISPをバイパス |
V4L2 |
USB (UVC) |
No(注1) |
V4L2 |
注1:USB接続でJetsonのISPを利用する手段は存在しません。
画像の取得方法
CSIカメラから画像を取得する方法は、大きく分けると以下の2通りです。
・GStreamerを利用する方法
・Libargus Camera APIを利用する方法
次から、それぞれの方法について説明いたします。
GStreamerを利用する方法
NVIDIA社から提供されるnvarguscamerasrcエレメントを使ってCSIカメラへアクセスできます。最も簡単にこれを行う方法は、Jetsonのコマンドウィンドウから以下のコマンドを実行することです。
$ gst-launch-1.0 nvarguscamerasrc ! nvoverlaysink
上記の例では、nvarguscamerasrcエレメントをデフォルト設定で動作させていますが、以下のコマンドで設定可能なパラメーターを確認できます。
$ gst-inspect-1.0 nvarguscamerasrc
たとえば、Jetson Nano開発者キットの2番目のカメラコネクターに取り付けたCSIカメラから画像を取り込む場合は、sensor-idパラメーターを設定して以下のようにします。
$ gst-launch-1.0 nvarguscamerasrc sensor-id=1 ! nvoverlaysink
ただ、上記のようにコマンドラインで起動させますと、自由度が少なくアプリケーションへの組み込みには適さないと思いますので、アプリケーションコードからnvarguscamerasrcエレメントを利用する場合は、GStreamer APIから利用します。
OpenCVからnvarguscamerasrcエレメントへアクセス
OpenCV VideoCapture GStreamerバックエンドを利用することで、OpenCVのVideoCaptureでCSIカメラからの画像を取得できます。
参考:
Libargus Camera APIを利用する方法
Jetson Mulitimedia APIに含まれるLibargus Camera APIでCSIカメラを細かく制御可能です。可能な制御が多く、アクセスできるデータも多岐に渡りますが、その分、プログラミングは複雑です。サンプルコードはJetPackに含まれており、以下のパスに存在します。
/usr/src/jetson_multimedia_api/argus
次回はUSBカメラのビデオ入力方法を解説!
連載記事「Jetsonビデオ処理プログラミング」の第2話、ビデオ入力方法についてご紹介しましたがいかがでしたでしょうか。
次回は同じくビデオ入力ですがUSBカメラなどV4L2に準拠したカメラについて取り上げてご紹介します。
お困りのことがあれば、ぜひお問い合わせください
弊社ではハードウェアのNVIDIA GPUカードやGPUワークステーションの選定やサポート、また顔認証、導線分析、骨格検知のアルゴリズム、さらに学習環境構築サービスなどを取り揃えております。お困りの際は、ぜひお問い合わせください。