怎么把k4a_image_t转换成opencv矩阵?(Azure Kinect传感器SDK)

Sno*_*man 3 opencv kinect-sdk azurekinect

我开始使用Azure Kinect Sensor SDK。我仔细阅读了官方的使用指南。我可以从传感器捕获图像作为原始缓冲区,但是我想将它们转换为opencv矩阵。

Sno*_*man 5

首先,您需要告诉Azure Kinect传感器以BGRA32格式捕获彩色图像(而不是JPEG或其他压缩格式)。的深度图像被以16位1信道格式捕获


您可以通过设置配置来做到这一点:

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_BGRA32; // <==== For Color image
config.color_resolution = K4A_COLOR_RESOLUTION_2160P;
config.depth_mode = K4A_DEPTH_MODE_NFOV_UNBINNED; // <==== For Depth image 
Run Code Online (Sandbox Code Playgroud)

然后,配置完成后,您可以按照以下方式捕获彩色图像,然后使用原始缓冲区从彩色图像创建一个opencv矩阵:

k4a_image_t colorImage = k4a_capture_get_color_image(capture); // get image metadata
if (colorImage != NULL)
{
    // you can check the format with this function
    k4a_image_format_t format = k4a_image_get_format(colorImage); // K4A_IMAGE_FORMAT_COLOR_BGRA32 

    // get raw buffer
    uint8_t* buffer = k4a_image_get_buffer(colorImage);

    // convert the raw buffer to cv::Mat
    int rows = k4a_image_get_height_pixels(colorImage);
    int cols = k4a_image_get_width_pixels(colorImage);
    cv::Mat colorMat(rows , cols, CV_8UC4, (void*)buffer, cv::Mat::AUTO_STEP);

    // ...

    k4a_image_release(colorImage);
}
Run Code Online (Sandbox Code Playgroud)

同样,对于深度图像,您可以像这样将原始深度数据转换为opencv(请注意,矩阵类型已更改!):

k4a_image_t depthImage = k4a_capture_get_depth_image(capture); // get image metadata
if (depthImage != NULL)
{
    // you can check the format with this function
    k4a_image_format_t format = k4a_image_get_format(depthImage); // K4A_IMAGE_FORMAT_DEPTH16 

    // get raw buffer
    uint8_t* buffer = k4a_image_get_buffer(depthImage);

    // convert the raw buffer to cv::Mat
    int rows = k4a_image_get_height_pixels(depthImage);
    int cols = k4a_image_get_width_pixels(depthImage);
    cv::Mat depthMat(rows, cols, CV_16U, (void*)buffer, cv::Mat::AUTO_STEP);

    // ...

    k4a_image_release(depthImage);
}
Run Code Online (Sandbox Code Playgroud)

注意:Opencv矩阵构造函数不会为指针复制或分配新的内存,而是会初始化矩阵头以指向指定的数据!


资料来源: