Skip to main content
Version: 1.3.0

MPSizectorS_SDK_Gray

应用简介

本应用使用 MPSizectorS_SDK 库处理读取 MPDat 格式的 SizectorS 3D 相机数据并生成深度图像。

应用流程

  • 导入相关头文件和库,包括 OpenCV 和 MPSizectorS_SDK_Gray;

  • 调用 MPSizectorS_Utils::Load() 函数加载 mpdat-float 数据;

  • 使用 MPSizectorS_Utils::ConvertToFloat3DFrame() 将数据转换成 MPSizectorS_DataFrameFloat3DStruct 类型的数据,便于进行深度值计算;

  • 获取图像的深度信息,使用 MPSizectorS_Utils::GetAutoColorDepthRange_Float3D() 函数获取;

  • 修改每个像素的值,将深度值归一化到 0~255 的范围,并存储到 depthImg 矩阵中;

  • 调用 OpenCV 的 imshow() 函数显示深度图像,调用 imwrite() 函数存储深度图像;

  • 调用 waitKey() 函数等待按键并退出。

代码调用

本应用主要包含以下几个函数:

加载数据

该步骤用于加载 mpdat-float 格式的数据文件并读取其中的数据,将其转换为 MPSizectorS_DataFrameUndefinedStruct 类型的数据。

MPSizectorS_DataFrameUndefinedStruct data;
bool dev = MPSizectorS_Utils::Load(&data, "E:/SizectorS_SDK_Gray/test/SizectorS_DataExport5.mpdat");

其中,&data 是一个指向 MPSizectorS_DataFrameUndefinedStruct 类型的指针变量。

格式转换

该步骤用于将 MPSizectorS_DataFrameUndefinedStruct 类型的数据转换成 MPSizectorS_DataFrameFloat3DStruct 类型的数据,便于后续的深度值计算操作。

MPSizectorS_DataFrameFloat3DStruct float3DData = MPSizectorS_Utils::ConvertToFloat3DFrame(data);

获取图像深度

该步骤用于获取图像的深度信息,返回一个 MPSizectorS_ColorDepthRangeStruct 结构体类型的数据。

MPSizectorS_ColorDepthRangeStruct colorDepth;
MPSizectorS_Utils::GetAutoColorDepthRange_Float3D(&colorDepth, data.FrameInfo, float3DData.Data);

生成深度图像

// 创建一个与原图像等大的矩阵
cv::Mat depthImg(yPixResolution, xPixResolution, CV_8UC1);
// 修改矩阵中每个像素的值
for (int i = 0; i < yPixResolution; i++){
for (int j = 0; j < xPixResolution; j++){
MPSizectorS_DataPointFloat3DStruct float3DStruct = float3DData.Data[j + i * float3DData.FrameInfo.DataInfo.XPixResolution];
if ((float3DStruct.Mask & 0x7) == 0) {
depthImg.at<uchar>(i, j) = (float3DStruct.Z - colorDepth.Min) / (colorDepth.Max - colorDepth.Min) * 255;
}
else {
depthImg.at<uchar>(i, j) = 0;
}
}
}

该步骤中,首先遍历了 depthImg 矩阵中的每个像素,然后获取其对应的三维坐标点的深度值,通过归一化将深度值转换为灰度值,并存储到 depthImg 矩阵中。

存储深度图像

cv::imwrite("depthImg.png", depthImg);

显示深度图像

cv::namedWindow("depthImg", cv::WINDOW_NORMAL);
imshow("depthImg", depthImg);
cv::resizeWindow("depthImg", 800, 600);
cv::waitKey();

此处使用了 namedWindow() 函数创建了一个窗口并指定窗口名称,然后通过 imshow() 函数将深度图像显示在此窗口中。

结论

本应用实现了将 SizectorS 3D 相机数据转换为深度图像,并将深度图像显示和存储的功能。