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

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

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

前提条件

  • ion-python
pip3 install -U pip
pip3 install ion-python==1.8.10

チュートリアル

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

binarysaver-bb-after-data-acquisition-BB

パイプラインを構築する

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

# pipeline setup
builder = Builder()
builder.set_target('host')
builder.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つの入力(画像データ、デバイス情報、フレームカウント、画像の幅と高さ)を必要とします。

# set port
payloadsize_p = Port('payloadsize', Type(TypeCode.Int, 32, 1), 0)
# bind input values to the input port
payloadsize_p.bind(payloadsize)

# add the first BB to acquire data
node = builder.add("image_io_u3v_gendc")
# add the second BB to save binary data
node_sensor0 = builder.add("image_io_binary_gendc_saver").set_iport([node.get_port('gendc')[0], node.get_port('device_info')[0], payloadsize_p, ])

画像データ、デバイス情報、フレームカウントは、前のノード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-") を設定して、お互いの内容を上書きしないように注意してください。

width_ps = []
height_ps = []
for i in range(num_device):
width_ps.append(Port('width' + str(i), Type(TypeCode.Int, 32, 1), 0))
height_ps.append(Port('height' + str(i), Type(TypeCode.Int, 32, 1), 0))
...

if num_device ==2 :
t_node1 = builder.add("image_io_binarysaver_u16x2") \
.set_iport([node.get_port('output')[1], node.get_port('device_info')[1], node.get_port('frame_count')[i], width_ps[1], height_ps[1]])
.set_param([output_directory,
Param('prefix', 'image1-')])
# create halide buffer for output port
terminator1 = t_node1.get_port('output')
output1 = Buffer(Type(TypeCode.Int, 32, 1), ())
terminator1.bind(output1)

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

# bind input values to the input port
for i in range(num_device):
width_ps[i].bind(width[i])
height_ps[i].bind(height[i])

出力ポートの設定

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

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

# create halide buffer for output port
terminator0 = node_sensor0.get_port('output')
output0 = Buffer(Type(TypeCode.Int, 32, 1), ())
terminator0.bind(output0)

パイプラインを実行する

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

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

完全なコード

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