0

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

我在这里阅读了录制文档:https ://docs.microsoft.com/en-us/azure/Kinect-dk/azure-kinect-recorder 。

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

我假设有两种方法可以解决这个问题,或者通过设置 color_format 或者找出哪个参数对于录制的默认格式是正确的。

4

1 回答 1

2

您可以使用 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);
    }

有关此处最后一个选项的更多详细信息:如何将 k4a_image_t 转换为 opencv 矩阵?(Azure Kinect 传感器 SDK)

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

于 2019-08-05T11:26:19.363 回答