检索 Azure Kinect 图像数据

本页提供有关如何通过 Azure Kinect 检索图像的详细信息。 本文演示如何捕获和访问在设备的色彩和深度之间协调的图像。 若要访问图像,必须先打开并配置设备,然后可以捕获图像。 在配置和捕获图像之前,必须找到并打开设备

你还可以参考 SDK 流示例,其中演示了如何使用本文所述的函数。

本文将介绍以下函数:

配置并启动设备

Kinect 设备上提供的两个相机支持多种模式、分辨率和输出格式。 有关完整列表,请参考 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

以下示例演示如何访问捕获的深度图像。 相同的原则也适用于其他图像类型。 但是,请务必将图像类型变量替换为正确的图像类型,例如 IR 或彩色。

// 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 设备。 你还可以: