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)。
我正在尝试读取 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)。