Azure Kinect 画像データを取得する

このページでは、Azure Kinect から画像を取得する方法に関する詳細情報を提供します。 この記事では、デバイスのカラーと深度の間で調整された画像をキャプチャしてアクセスする方法を示します。 画像にアクセスするには、まずデバイスを開いて構成する必要があります。その後に、画像をキャプチャできます。 画像を構成してキャプチャする前に、デバイスを検索して開く必要があります。

また、この記事にある関数を使用する方法を示す SDK ストリーミングの例を参照することもできます。

次の関数を扱っています。

デバイスを構成して起動する

Kinect デバイスで使用できる 2 つのカメラは、複数のモード、解像度、出力形式をサポートしています。 完全な一覧については、Azure Kinect 開発キットのハードウェアの仕様を参照してください。

ストリーミング構成は、k4a_device_configuration_t 構造体の値を使用して設定されます。

k4a_device_configuration_t config = K4A_DEVICE_CONFIG_INIT_DISABLE_ALL;
config.camera_fps = K4A_FRAMES_PER_SECOND_30;
config.color_format = K4A_IMAGE_FORMAT_COLOR_MJPG;
config.color_resolution = K4A_COLOR_RESOLUTION_2160P;
config.depth_mode = K4A_DEPTH_MODE_NFOV_UNBINNED;

if (K4A_RESULT_SUCCEEDED != k4a_device_start_cameras(device, &config))
{
    printf("Failed to start device\n");
    goto Exit;
}

カメラは起動された後、k4a_device_stop_cameras() が呼び出されるか、またはデバイスが閉じられるまで引き続きデータをキャプチャします。

安定化

複数デバイスの同期機能を使用してデバイスを起動する場合は、それを固定された露出設定を使用して行うことを強くお勧めします。 手動露出が設定されている場合は、画像とフレーム レートが安定するまでにデバイスからの最大 8 キャプチャが必要になることがあります。 自動露出の場合は、画像とフレーム レートが安定するまでに最大 20 キャプチャが必要になることがあります。

デバイスからキャプチャを取得する

画像は、関連付けられた方法でデバイスからキャプチャされます。 キャプチャされた各画像には、深度画像、IR 画像、カラー画像、または画像の組み合わせが含まれます。

既定では、API は、ストリーミング モードで要求されたすべての画像を受信した後でしかキャプチャを返しません。 k4a_device_configuration_tsynchronized_images_only パラメーターをクリアすることによって、深度またはカラー画像のみを含む部分的なキャプチャを、それが使用可能になったらすぐに返すように API を構成できます。

// Capture a depth frame
k4a_capture_t capture = NULL;
switch (k4a_device_get_capture(device, &capture, TIMEOUT_IN_MS))
{
case K4A_WAIT_RESULT_SUCCEEDED:
    break;
case K4A_WAIT_RESULT_TIMEOUT:
    printf("Timed out waiting for a capture\n");
    continue;
    break;
case K4A_WAIT_RESULT_FAILED:
    printf("Failed to read a capture\n");
    goto Exit;
}

API がキャプチャを正常に返した後、キャプチャ オブジェクトの使用を完了したら k4a_capture_release() を呼び出す必要があります。

キャプチャから画像を取得する

キャプチャされた画像を取得するには、画像の種類ごとに適切な関数を呼び出します。 つぎのいずれかです。

この画像の使用を完了したら、これらの関数によって返されたすべての k4a_image_t ハンドルで k4a_image_release() を呼び出す必要があります。

画像バッファーにアクセスする

k4a_image_t には、画像のプロパティを取得するための多くのアクセサー関数があります。

画像のメモリ バッファーにアクセスするには、k4a_image_get_buffer を使用します。

次の例は、キャプチャされた深度画像にアクセスする方法を示しています。 この同じ原則が他の画像の種類にも適用されます。 ただし、image-type 変数を正しい画像の種類 (IR や color など) に確実に置き換えてください。

// Access the depth16 image
k4a_image_t image = k4a_capture_get_depth_image(capture);
if (image != NULL)
{
    printf(" | Depth16 res:%4dx%4d stride:%5d\n",
            k4a_image_get_height_pixels(image),
            k4a_image_get_width_pixels(image),
            k4a_image_get_stride_bytes(image));

    // Release the image
    k4a_image_release(image);
}

// Release the capture
k4a_capture_release(capture);

次のステップ

これで、Azure Kinect デバイスを使用してカメラの画像をキャプチャし、カラーと深度の間で調整する方法がわかりました。 また、次のことも可能です。