3d线扫获取图片

相机链接

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 int2\[\] { null, null }; //高度数据缓存

internal byte\[\]\[\] LaserCamera3D_GrayData = new byte2\[\] { null, null }; //灰度数据缓存

internal int\[\]\[\] LaserCamera3D_EncoderData = new int2\[\] { 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_HeightDataindex = new intHeight \* Width;

LaserCamera3D_GrayDataindex = new byteHeight \* Width;

LaserCamera3D_EncoderDataindex = new intHeight;

for (int i = 0; i < LaserCamera3D_HeightDataindex.Length; i++)

{

LaserCamera3D_HeightDataindexi = -1000000000;

}

for (int i = 0; i < LaserCamera3D_GrayDataindex.Length; i++)

{

LaserCamera3D_GrayDataindexi = byte.MinValue;

}

for (int i = 0; i < LaserCamera3D_EncoderDataindex.Length; i++)

{

LaserCamera3D_EncoderDataindexi = 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_HeightData0.Length)

{

InitData(coninfo.BatchPoints, coninfo.xPoints);

}

IntPtr\[\] mTmpData = new IntPtr2;

IntPtr\[\] mTmpGraydata = new IntPtr2;

IntPtr\[\] mTmpEncoderdata = new IntPtr2;

bool bReceivedData = false;

for (int index = 0; index < coninfo.HeadNumber; index++)

{

Console.WriteLine("coninfo.HeadNumber > 0");

批处理轮廓获取(批处理一次回调一次)

mTmpDataindex = SR7LinkFunc.SR7IF_GetBatchProfilePoint(data, index);

批处理编码器获取(批处理一次回调一次)

mTmpEncoderdataindex = SR7LinkFunc.SR7IF_GetBatchEncoderPoint(data, index);

if (mTmpDataindex != IntPtr.Zero)

{

Marshal.Copy(mTmpDataindex, LaserCamera3D_HeightDataindex, 0, LaserCamera3D_Height * coninfo.xPoints);

}

if (LaserCamera3D_ImageType == 0)

{

批处理亮度获取(批处理一次回调一次)

mTmpGraydataindex = SR7LinkFunc.SR7IF_GetBatchIntensityPoint(data, index);

if (mTmpGraydataindex != IntPtr.Zero)

{

{

bReceivedData = true;

Console.WriteLine("copy new data........");

Marshal.Copy(mTmpGraydataindex, LaserCamera3D_GrayDataindex, 0, LaserCamera3D_Height * coninfo.xPoints);

}

}

else

{

Console.WriteLine("mTmpGraydataindex == IntPtr.Zero");

}

}

else

{

Console.WriteLine("LaserCamera3D_ImageType != 0");

}

if (mTmpEncoderdataindex != IntPtr.Zero)

{

Marshal.Copy(mTmpEncoderdataindex, LaserCamera3D_EncoderDataindex, 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());

相关推荐
一技安身22 分钟前
【信创】外网aarch64终端安装deepseek Ragflow 迁移至内网银河麒麟服务器
运维·服务器
M哥支付1 小时前
快捷支付 VS 网关支付 安全对比
服务器·网络·其他·微信·金融
考虑考虑1 小时前
ElasticSearch索引命令
运维·后端·elasticsearch
2501_928996221 小时前
Agent 开发的 API 选型:从 Function Calling 到多模型协作的中科热备底层逻辑
服务器·重构·gitlab
非凡ghost2 小时前
AI修图不“造假“,摄影师的出片效率加速器
服务器·前端·人工智能·电脑
和裕2 小时前
光伏储能定制加强型瓦楞纸箱:降低组件运输隐裂率与售后损耗的核心价值
大数据·运维·网络·人工智能·算法
智购科技无人售货机工厂店2 小时前
2026自动售货机大屏交互设计原则:从信息层级到视觉动线的工程实践~YH
运维·python·单片机·嵌入式硬件·自动化·交互
Ruiery3 小时前
Linux 6.6内核 PCIe 深度解析(十):PCIe Port Driver(portdrv)— 一个物理 Port,拆出五个逻辑服务
linux·运维·服务器
天天喝旺仔3 小时前
Python asyncio 异步编程实战:用协程与事件循环构建高性能网络服务
服务器·网络·python·性能优化·fastapi
运维行者_4 小时前
ISP 企业级带宽计费怎么做?网络流量计费的 6 大核心能力
运维·服务器·网络·数据库·支持向量机·接口隔离原则