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