跳到主要内容
版本:Next

ZMap 与 ZMapSimple 数据转 Float3D 点云数据说明书

场景简介

ZMap 与 ZMapSimple 深度图数据由于其不含 x 、 y 数据,数据量小,传输速度较快,常用于对实时性要求较高的场景,如 AOI 、 SPI 应用;ZMap 与 ZMapSimple 数据在 ControlCenter 中为了显示三维点云,使用了近似计算来恢复 x 、 y数据,通过当前点的像素坐标乘以x 、y 方向点间距得到近似的 x、y ,此方法一般适用于远心镜头或非远心镜头但对x、y精度要求不高的情况(因镜头畸变和非远心镜头透视关系导致x、y方向点间距不是固定值);
当需要精确x、y时,可利用相机标定参数以及相机重建得到的Z值对x、y进行精确计算,SDK中提供了转换接口供客户调用,使用该接口时需连接相机以获取当前相机的标定参数,且处理的深度图数据需为当前相机产生的数据,使获取到的相机标定参数与数据匹配;接口声明与调用示例如下:

接口声明

/// <summary>
/// 获取相机标定参数
/// </summary>
/// <param name="pIMPSizectorS">
/// 相机句柄
/// </param>
/// <param name="CalibParam">
/// 相机标定参数结构体指针
/// </param>
/// <returns>
/// 获取参数是否成功
/// </returns>
DLL_EXPORT bool MPSizectorS_GetCalibParamStruct(IMPSizectorS* pIMPSizectorS, MPSizectorS_CalibParamStructType* CalibParam);

/// <summary>
/// 根据相机标定参数,将 ZMap 或 ZMapSimple 格式数据,转换为 Float3D 格式。
/// </summary>
/// <param name="SrcFrame">
/// 原始 Undefined 格式数据,内容必须是 ZMap、ZMapSimple 格式。 支持Binning 、Roi;
/// </param>
/// <param name="DstFrame">
/// 输出的 Undefined 格式数据,Float3D 格式。 !!!输出数据的内存由接口内部分配,当不需要时需使用delete [] DstFrame.Data;释放内存
/// </param>
/// <returns>
/// 转换操作是否成功
/// </returns>
DLL_EXPORT bool MPSizectorS_GetFloat3DFrameFromZMapFrame(MPSizectorS_DataFrameUndefinedStruct SrcFrame,
MPSizectorS_DataFrameUndefinedStruct* DstFrame, MPSizectorS_CalibParamStructType CalibParam);

c++调用示例

#include "MPSizectorS_API.h"

IMPSizectorS *Sensor = MPSizectorS_Factory::GetInstance(MPSizectorS_LogMediaType_CallBack);
MPSizectorS_CalibParamStructType calibParam;

//获取与当前相机标定参数匹配的深度图数据,从数据回调中拍摄数据 或 手动载入离线数据均可
void DataCallBack(MPSizectorS_DataFormatType DataFormat, MPSizectorS_DataFrameUndefinedStruct Data)
{
if(nullptr != Data.Data
&& (DataFormat == MPSizectorS_DataFormatType::MPSizectorS_DataFormatType_FixZMap
|| DataFormat == MPSizectorS_DataFormatType::MPSizectorS_DataFormatType_FixZMapSimple))
{
MPSizectorS_DataFrameUndefinedStruct dstFrame;
dstFrame.Data = NULL;
bool ret = MPSizectorS_Utils::GetFloat3DFrameFromZMapFrame(Data, &dstFrame, calibParam);
if (ret)
{
//对数据进行处理
//...

//释放数据内存
delete[] dstFrame.Data;
}
}
}


int main()
{
//创建相机句柄 打开设备
Sensor->UpdateDeviceList();
Sensor->SetDataCallBack(DataCallBack);//设置数据回调
bool rtv = Sensor->Open(Sensor->GetDeviceInfo(0));
if (!rtv)
{
printf("\r\nOpen device failed.\r\n\r\n");
delete Sensor;
system("pause");
return 0;
}

//获取相机标定参数
Sensor->GetCalibParamStruct(&calibParam);

//设置相机工作参数
Sensor->SetBinningState(false);//可选是否开启binning
Sensor->SetTriggerSource(MPSizectorS_TriggerSourceType_SoftTriggerOnly);
Sensor->SetHoldState(false);
Sensor->SetAutoReconnect(true);
Sensor->SetDataOutMode(MPSizectorS_DataOutModeType_FixZMap);//MPSizectorS_DataOutModeType_FixZMapSimple
Sensor->SetWorkingMode(MPSizectorS_WorkingModeType_3D_Fast);
Sensor->FireSoftwareTrigger(); //触发后在数据回调中处理数据

while((Sensor->GetDeviceState() == MPSizectorS_DeviceStateType_Disconnected) || (Sensor->GetDeviceState() == MPSizectorS_DeviceStateType_UnderInit))
{
Sleep(50);
printf(".");
}

system("Pause");

}

C#接口声明


public unsafe static byte MPSizectorS_GetFloat3DFrameFromZMapFrame(UnmanagedDataFrameUndefinedStruct data, out UnmanagedDataFrameUndefinedStruct float3DData, MPCalibParamStructType calibParam);

c#调用示例

using MPSizectorS_DotNet;

MPSizectorS Sensor;
private void convertFixZMapSimpleToFloat3D()
{
try
{
Sensor = new MPSizectorS(LogMediaType.CallBack);
Sensor.UpdateDeviceList();
Sensor.Open(Sensor.GetDeviceInfo(0));

//获取相机参数
Sensor.BinningState = 0;//可选是否开启binning
Sensor.TriggerSource = TriggerSourceType.SoftTriggerOnly;
Sensor.HoldState = 0;
Sensor.SetAutoReconnect(true);
Sensor.DataOutMode = DataOutModeType.FixZMap;//DataOutModeType.FixZMapSimple
Sensor.WorkingMode = WorkingModeType.Fast3D;

//获取与当前相机标定参数匹配的深度图数据,同步拍摄数据 或 手动载入离线数据均可
UnmanagedDataFrameUndefinedStruct zmapData;
DataFormatType dataType;
Sensor.SnapUnmanaged(true, out dataType, out zmapData, 2000);

UnmanagedDataFrameUndefinedStruct float3DData;
byte rtv = MPSizectorS.MPSizectorS_GetFloat3DFrameFromZMapFrame(zmapData, out float3DData, Sensor.CalibParam);
if (rtv == 0)
{
Console.WriteLine("ZMapFrame Transfer error!");
return;
}

//处理数据
//....

//释放转换接口分配的c++数据内存
Utils.FreeUnmanagedData(float3DData);

}
catch (Exception errorMsg)
{
MessageBox.Show("Transfer error! errorMeg = " + errorMsg.ToString());
}
}