メインコンテンツまでスキップ
バージョン: v24.05

センサーデータを保存する(非GenDC)

このチュートリアルでは、センサーから転送されたGenDCデータをバイナリファイルに保存する方法を学びます。 デバイスデータ形式がGenDCの場合、あるいは画像データのみではなく、全体のGenDCコンテナを保存したい場合は、前のチュートリアルページセンサーデータを保存する(GenDC)を参照してください。

前提条件

  • ion-kit(sensing-dev SDKと一緒にインストールされます)

チュートリアル

前のチュートリアルでは、パイプラインで単一のビルディングブロック(BB)を使用してセンサーデータを取得しました。今回は、binarysaver BBを組み込んで、データの取得と保存の2ステップフローを実現します。

binarysaver-bb-after-data-acquisition-BB

パイプラインの構築

パイプラインBuilderの初期化プロセスは、前のチュートリアルとまったく同じです。

// パイプライン設定
Builder b;
b.set_target(ion::get_host_target());
b.with_bb_module("ion-bb");

センサーデータ取得BBの後のビルディングブロック(BB)として、binarysaver BBを接続してフローを確立します。

使用する具体的なビルディングブロック(BB)は、使用されるセンサーデータの種類によって異なります。このチュートリアルでは、Mono12画像データを保存する方法を例示します。デバイスデータ形式がGenDCの場合、画像データのみではなく、全体のGenDCコンテナを保存する方が好ましい場合は、前のチュートリアルページセンサーデータを保存する(GenDC)を参照してください。

データ取得BBバイナリセーバーBB
非GenDCimage_io_u3v_cameraN_u<byte-depth>x<dim>image_io_binarysaver_u<byte-depth>x<dim>
非GenDC
(例:Mono8)
image_io_u3v_cameraN_u8x2image_io_binarysaver_u8x2
非GenDC
(例:Mono12)
image_io_u3v_cameraN_u16x2image_io_binarysaver_u16x2
非GenDC
(例:RGB8)
image_io_u3v_cameraN_u8x3image_io_binarysaver_u8x3

これで、パイプラインbに2つのBBを追加します。2つ目のBB、image_io_u3v_cameraN_u16x2は、ポートに5つの入力(画像データ、デバイス情報、フレームカウント、画像の幅と高さ)を必要とします。

// データを取得する最初のBBを追加
int32_t w = <画像の幅>;
int32_t h = <画像の高さ>;
Node n = b.add("image_io_u3v_cameraN_u16x2")();
// バイナリデータを保存する2つ目のBBを追加
n = b.add("image_io_binarysaver_u16x2")(n["output"], n["device_info"], n["frame_count"][i], &w, &h);

画像データ、デバイス情報、フレームカウントは、前のノードimage_io_u3v_cameraN_u16x2の取得BBによって取得されます。幅と高さは、コンソールでarv-tool-0.8 -n <デバイス名> control Width Heightコマンドを使用して取得できます。詳細な使用方法については、arv-tool-0.8を参照してください。

ヒント

複数センサの場合

Param("num_devices", 2)を使用して最初のBBで2つ以上のセンサーからデータを取得する場合、それぞれのバイナリセーバーBBを使用して個別に保存する必要があります。これを行わなかった場合、一方のセンサーのデータが他方のセンサーのデータを上書きしてしまいます。

binarysaver-bb-after-data-acquisition-BB-multi-sensor

最初のBBから各センサーの出力データにアクセスするには、次のようにインデックス[]を使用できます。それぞれのバイナリセーバーBBにParam("prefix", "image0-")Param("prefix", "image1-")を設定して、互いの内容を上書きしないようにしてください。

Node n = b.add("image_io_u3v_cameraN_u16x2")().set_param(Param("num_devices", 2),);

if (num_device == 2){
int32_t payloadsize1 = payloadsize[1];
Node n1 = b.add("image_io_binarysaver_u16x2")(n["output"][1], n["device_info"][1], n["frame_count"][i], &w, &h);
.set_param(
Param("prefix", "image1-"),
Param("output_directory", saving_diretctory)
);
n1["output"].bind(outputs[1]);
}

int32_t payloadsize0 = payloadsize[0];
n = b.add("image_io_binarysaver_u16x2")(n["output"][0], n["device_info"][0], n["frame_count"][i], &w, &h);
.set_param(
Param("prefix", "image0-"),
Param("output_directory", saving_diretctory)
);
n["output"].bind(outputs[0]);

複数のデバイスがある場合、それぞれの幅と高さが一致していることを確認してください。

# 入力値を入力ポートにバインド
std::vector<int32_t> width = {1920, 1920};
std::vector<int32_t> height = {1080, 1080};
int32_t w = width[0];
...
n = b.add("image_io_binimage_io_binarysaver_u16x2ary_gendc_saver")(n["output"][0], n["device_info"][0], n["frame_count"][i], &w, &h);
...

出力ポートの設定

バイナリファイルはbinary saver BBプロセス内で保存されますが、パイプラインからスカラー出力を取得します。

このスカラー出力は単にBBがデータを正常に保存したかどうかを示す終端フラグであり、具体的な値を使用するわけではありませんが、出力として受け取るための出力バッファを作成する必要があります。

Halide::Buffer<int> output = Halide::Buffer<int>::make_scalar();
n["output"].bind(output);

パイプラインの実行

builder.run()を実行して、パイプラインを通常どおり終了します。

デフォルトでは、バイナリデータは次の形式で保存されます:<出力ディレクトリ>/<プレフィックス>0.bin<出力ディレクトリ>/<プレフィックス>1.bin<出力ディレクトリ>/<プレフィックス>2.binなど。デフォルトの出力ディレクトリは現在のディレクトリであり、デフォルトのプレフィックスはraw-です。これらの値をカスタマイズするには、バイナリセーバーBB内のParamを利用してください。

完全なコード

このチュートリアルで使用される完全なコードはこちらです。