相机链接
SR7LinkFunc.SR7IF_EthernetOpen(LaserCamera3D_ID, ref pEthernetConfig);
设置回调函数
获取数据x方向间距
LaserCamera3D_XInterval = SR7LinkFunc.SR7IF_ProfileData_XPitch(LaserCamera3D_ID, new IntPtr());
获取数据宽度
LaserCamera3D_Width = SR7LinkFunc.SR7IF_ProfileDataWidth(LaserCamera3D_ID, new IntPtr());
获取当前批处理行数
LaserCamera3D_Height = SR7LinkFunc.SR7IF_ProfilePointSetCount(LaserCamera3D_ID, new IntPtr());
通过上面获取的高度和行数初始化高度图和灰度图
internal int[][] LaserCamera3D_HeightData = new int[2][] { null, null }; //高度数据缓存
internal byte[][] LaserCamera3D_GrayData = new byte[2][] { null, null }; //灰度数据缓存
internal int[][] LaserCamera3D_EncoderData = new int[2][] { null, null }; //编码器数据缓存
/// <summary>
/// 初始化m_HeightData,m_GrayData,m_EncoderData
/// </summary>
/// <param name="Height"></param>
/// <param name="Width"></param>
/// <returns></returns>
internal int InitData(int Height, int Width)
{
try
{
for (int index = 0; index < LaserCamera3D_CameraNum; index++)
{
LaserCamera3D_HeightData[index] = new int[Height * Width];
LaserCamera3D_GrayData[index] = new byte[Height * Width];
LaserCamera3D_EncoderData[index] = new int[Height];
for (int i = 0; i < LaserCamera3D_HeightData[index].Length; i++)
{
LaserCamera3D_HeightData[index][i] = -1000000000;
}
for (int i = 0; i < LaserCamera3D_GrayData[index].Length; i++)
{
LaserCamera3D_GrayData[index][i] = byte.MinValue;
}
for (int i = 0; i < LaserCamera3D_EncoderData[index].Length; i++)
{
LaserCamera3D_EncoderData[index][i] = int.MinValue;
}
}
return 0;
}
catch (Exception e)
{
return -1;
}
声明回调函数
/// <summary>
/// 一次回调模式获取图像,仅需调用一次
/// </summary>
/// <param name="_DataCallBackMode"></param>
internal int LaserCamera3D_InitOnetimeCallBack()
{//注册取图完成回调函数
Console.WriteLine("SR7IF_SetBatchOneTimeDataHandler => BatchOneTimeCallBack.");
LaserCamera3D_BatchOneTimeCallBack = new SR7IF_BatchOneTimeCallBack(BatchOneTimeCallBack);
return SR7LinkFunc.SR7IF_SetBatchOneTimeDataHandler((int)LaserCamera3D_ID, LaserCamera3D_BatchOneTimeCallBack);
}
回调函数里面写的内容
public struct SR7IF_STR_CALLBACK_INFO
{
public int xPoints; //x方向数据数量
public int BatchPoints; //批处理数量
public int BatchTimes; //批处理次数
public double xPixth; //x方向点间距
public int startEncoder; //批处理开始编码器值
public int HeadNumber; //相机头数量
public int returnStatus; //0:正常批处理
}
/// <summary>
/// 一次回调函数
/// </summary>
/// <param name="info"></param>
/// <param name="data"></param>
internal void BatchOneTimeCallBack(IntPtr info, IntPtr data)
{
Console.WriteLine("BatchOneTimeCallBack Invoked.");
lock (LaserCamera3D_Obj)
{
if (LaserCamera3D_InInspecting)
{
Console.WriteLine("RouteInspect3D is inspecting, return BatchOneTimeCallBack.");
return;
}
}
if (!LaserCamera3D_Connected)
{
lock (LaserCamera3D_Obj)
{
LaserCamera3D_Finished = true;
Console.WriteLine("LaserCamera3D_Finished = true");
}
Console.WriteLine("BatchOneTimeCallBack return because !LaserCamera3D_Connected.");
return;
}
SR7IF_STR_CALLBACK_INFO coninfo = new SR7IF_STR_CALLBACK_INFO();
coninfo = (SR7IF_STR_CALLBACK_INFO)Marshal.PtrToStructure(info, typeof(SR7IF_STR_CALLBACK_INFO));
//if (coninfo.returnStatus != -100 && coninfo.returnStatus < 0)
if (coninfo.returnStatus != 0)
{
lock (LaserCamera3D_Obj)
{
LaserCamera3D_Finished = true;
Console.WriteLine("LaserCamera3D_Finished = true");
}
Console.WriteLine("BatchOneTimeCallBack retrun fasle.");
return;
}
LaserCamera3D_Height = coninfo.BatchPoints;
LaserCamera3D_Width = coninfo.xPoints;
if (LaserCamera3D_CameraNum == 2)
{
LaserCamera3D_Width = 2 * coninfo.xPoints;
}
if (coninfo.BatchPoints * coninfo.xPoints != LaserCamera3D_HeightData[0].Length)
{
InitData(coninfo.BatchPoints, coninfo.xPoints);
}
IntPtr[] mTmpData = new IntPtr[2];
IntPtr[] mTmpGraydata = new IntPtr[2];
IntPtr[] mTmpEncoderdata = new IntPtr[2];
bool bReceivedData = false;
for (int index = 0; index < coninfo.HeadNumber; index++)
{
Console.WriteLine("coninfo.HeadNumber > 0");
批处理轮廓获取(批处理一次回调一次)
mTmpData[index] = SR7LinkFunc.SR7IF_GetBatchProfilePoint(data, index);
批处理编码器获取(批处理一次回调一次)
mTmpEncoderdata[index] = SR7LinkFunc.SR7IF_GetBatchEncoderPoint(data, index);
if (mTmpData[index] != IntPtr.Zero)
{
Marshal.Copy(mTmpData[index], LaserCamera3D_HeightData[index], 0, LaserCamera3D_Height * coninfo.xPoints);
}
if (LaserCamera3D_ImageType == 0)
{
批处理亮度获取(批处理一次回调一次)
mTmpGraydata[index] = SR7LinkFunc.SR7IF_GetBatchIntensityPoint(data, index);
if (mTmpGraydata[index] != IntPtr.Zero)
{
{
bReceivedData = true;
Console.WriteLine("copy new data........");
Marshal.Copy(mTmpGraydata[index], LaserCamera3D_GrayData[index], 0, LaserCamera3D_Height * coninfo.xPoints);
}
}
else
{
Console.WriteLine("mTmpGraydata[index] == IntPtr.Zero");
}
}
else
{
Console.WriteLine("LaserCamera3D_ImageType != 0");
}
if (mTmpEncoderdata[index] != IntPtr.Zero)
{
Marshal.Copy(mTmpEncoderdata[index], LaserCamera3D_EncoderData[index], 0, LaserCamera3D_Height);
}
}
lock (LaserCamera3D_Obj)
{
if (bReceivedData)
{
LaserCamera3D_Finished = true;
Console.WriteLine("LaserCamera3D_Finished = true");
}
}
GC.Collect();
Console.WriteLine("BatchOneTimeCallBack End.");
}
//批处理点数
int nBatchNum = 5000;
LaserCamera3D_SetParam(0, -1, 0x000A, nBatchNum);
Console.WriteLine("重置扫描行数:" + nBatchNum.ToString());
//细化点数
int nRefining_points = 0;
LaserCamera3D_GetParam(0, -1, 0x0009, out nRefining_points);
Console.WriteLine("获取细化点数:" + nRefining_points.ToString());
//批处理点数
int nBatchNum2 = 0;
LaserCamera3D_GetParam(0, -1, 0x000A, out nBatchNum2);
Console.WriteLine("获取重置扫描行数:" + nBatchNum2.ToString());
//采样周期
int nSampled_cycle = 0;
LaserCamera3D_GetParam(0, -1, 0x0002, out nSampled_cycle);
Console.WriteLine("相机接收频率:" + nSampled_cycle.ToString());