Azure Kinect 录制颜色格式

Azure Kinect Recording Color Format

我正在尝试读取 Azure Kinect 记录并保存帧中的图像。但是,无法设置 color_format,这会导致使用 imwrite 时出现问题。

我已阅读此处的录音文档:https://docs.microsoft.com/en-us/azure/Kinect-dk/azure-kinect-recorder

默认情况下,格式似乎是 K4A_IMAGE_FORMAT_COLOR_MJPG。但是我不确定在创建 material 时要传入什么参数。对于 BGRA32,它是 CV_8UC4,对于深度图像,它是 CV_16U。

我想有两种方法可以解决这个问题,要么通过设置 color_format,要么找出适合录音默认格式的参数。

您可以像访问普通网络摄像头一样使用 OpenCV 访问 rgb:

VideoCapture cap(0); // open the default camera
cap.set(CV_CAP_PROP_FRAME_WIDTH, 3840);
cap.set(CV_CAP_PROP_FRAME_HEIGHT, 2160);
if (!cap.isOpened())  // check if we succeeded
    return -1;
Mat frame, img;
for (;;)
{

    cap >> frame; // get a new frame from camera
    cout << frame.cols << " x " << frame.rows << endl;
    resize(frame, img, Size(), 0.25, 0.25);
    imshow("frame", img);
    if (waitKey(30) >= 0) break;
}

没有调用k4a函数,不需要设置颜色格式

如果您想以 jpeg 格式使用他们的 SDK,他们在其中一个示例代码中提供了一个函数:

long WriteToFile(const char *fileName, void *buffer, size_t bufferSize)
{
    cout << bufferSize << endl;
    assert(buffer != NULL);

    std::ofstream hFile;
    hFile.open(fileName, std::ios::out | std::ios::trunc | std::ios::binary);
    if (hFile.is_open())
    {
        hFile.write((char *)buffer, static_cast<std::streamsize>(bufferSize));
        hFile.close();
    }
    std::cout << "[Streaming Service] Color frame is stored in " << fileName << std::endl;

    return 0;
}

您只需拨打:

image = k4a_capture_get_color_image(capture);
WriteToFile("color.jpg", k4a_image_get_buffer(image), k4a_image_get_size(image));

最后可以设置格式为RGBA32:

config.color_format = K4A_IMAGE_FORMAT_COLOR_BGRA32;

并将其转换为 OpenCV Mat:

color_image = k4a_capture_get_color_image(capture);
    if (color_image)
    {
        uint8_t* buffer = k4a_image_get_buffer(color_image);        // get raw buffer
        cv::Mat colorMat(Hrgb, Wrgb, CV_8UC4, (void*)buffer, cv::Mat::AUTO_STEP);
        //do something with colorMat
        k4a_image_release(color_image);
    }

有关最后一个选项的更多详细信息:

最后一个解决方案的数据稍微好一些,但 3840x2160 的缓冲区明显更大(33M 对 ~1.5M)。