Skip to main content
Version: Next

MPSizectorS_SDK_Auxiliary_WRGB

应用简介

本应用使用 MPSizectorS_SDK 库处理读取 mpdat 格式的 SizectorS 3D 相机外部曝光RGB浮点3D数据并生成彩色图像。

应用流程

  • 引用OpenCV 和 SizectorS 3D 相机相关头文件和库;

  • 调用 MPSizectorS_Utils::Load() 函数加载 mpdat 数据(数据类型为浮点3D);

  • 使用 MPSizectorS_Utils::ConvertToFloat3DFrame() 将数据转换成 MPSizectorS_DataFrameFloat3DStruct 类型的数据,便于获取数据;

  • 获取每个像素位置的RGB通道灰度值数据,并存储到 rgbImg 矩阵中;

  • 调用 OpenCV 的 imshow() 函数显示RGB彩色图像,调用 imwrite() 函数存储RGB彩色图像;

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

代码调用

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

加载数据

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

MPSizectorS_DataFrameUndefinedStruct data;
bool dev = MPSizectorS_Utils::Load(&data, "../../TestData/normalBox_expo1-result-mode1-rgb.mpdat");

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

格式转换

该步骤用于将 MPSizectorS_DataFrameUndefinedStruct 类型的数据转换成 MPSizectorS_DataFrameFloat3DStruct 类型的数据,便于后续的获取图像RGB通道数据操作。

MPSizectorS_DataFrameFloat3DStruct float3DData = MPSizectorS_Utils::ConvertToFloat3DFrame(data);

获取RGB通道数据

// 创建一个与原图像等大的矩阵,通道数为3
cv::Mat rgbImg(yPixResolution, xPixResolution, CV_8UC3);

for (int i = 0; i < yPixResolution; i++)
{
for (int j = 0; j < xPixResolution; j++)
{
//根据外部曝光设置判断当前数据拍摄时是否启用外部曝光
bool hasAuxiliaryWhiteImage = false;
if ((float3DData.FrameInfo.ExternalExposureSettings.ExternalExposureEnable & 0x1) != 0)
{
//使能了外部白光光源曝光
hasAuxiliaryWhiteImage = true;
}

bool hasAuxiliaryRGBImage = false;
if ((float3DData.FrameInfo.ExternalExposureSettings.ExternalExposureEnable & 0x2) != 0)
{
//使能了外部RGB光光源曝光
hasAuxiliaryRGBImage = true;
}

//数据index
int index = j + i * float3DData.FrameInfo.DataInfo.XPixResolution;

int dataSize = float3DData.FrameInfo.DataInfo.XPixResolution * float3DData.FrameInfo.DataInfo.YPixResolution;

//3D点数据
MPSizectorS_DataPointFloat3DStruct float3DStruct = float3DData.Data[index];

if (hasAuxiliaryRGBImage)
{
cv::Vec3b color_value;

//外部曝光数据在内存中的排列顺序:
//dataSize * byte大小的W通道数据(如果有的话)
//3 * dataSize * byte大小的RGB通道数据(如果有的话)
//补充: RGB通道数据顺序为dataSize * byte的R通道数据,dataSize * byte的G通道数据, dataSize * byte的B通道数据

//R通道数据
color_value[2] = float3DData.AuxiliaryRGB[index];
//G通道数据
color_value[1] = float3DData.AuxiliaryRGB[index + dataSize];
//B通道数据
color_value[0] = float3DData.AuxiliaryRGB[index + dataSize * 2];

rgbImg.at<cv::Vec3b>(i, j) = color_value;
}
}
}

存储RGB彩色图像

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

显示RGB彩色图像

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

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

输出图像如下:

image

结论

本应用实现了将 SizectorS 3D 相机外部曝光RGB浮点3D数据转换为彩色图像,并将彩色图像显示和存储的功能。