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彩色图像显示在此窗口中。
输出图像如下:

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