前言
这一段时间做Benewake激光雷达的测试,涉及到对pcd点云文件数据的解析,在网络上找了一圈,就发现个pclsharp的,不知道是我配置错了还是系统的问题,调用一直报错,源代码也没编译成功,下了一个其他博主写的,发现只能解析ASCII格式的,二进制的解析出来数据都对不上,导致点的位置都不对,干脆自己编译C++的pcl点云库,自己做了一个动态编译库,供自己调用,但奈何C++基础不太扎实,C++动态链接库端应该有更好的解决方案的,但是自己写的这个还是能用,经过测试,解析ASCII格式和二进制格式的文件都能够解析出数据。
代码
**下载C++生成的动态链接库,没有积分的可以发邮件給我,看到邮件我会回复的,我的邮箱:localstorage@qq.com
DLL为Release X64位下编译的,调用时请保持环境一致,或者兼容该环境
DLL为Release X64位下编译的,调用时请保持环境一致,或者兼容该环境
DLL为Release X64位下编译的,调用时请保持环境一致,或者兼容该环境
**
// 调用实例
/**
1.首先获取文件内点的数量(这点做的不太好)
2.创建数组,获取点云数据
**/
//C#调用C++,首先引入dll,注册字符集
//这个方法是获取点云数据,str传pcd文件的绝对路径,
[DllImport("AddOperate.dll", EntryPoint = "loadPCDFile", CharSet = CharSet.Auto)]
public static extern int loadPCDFile([MarshalAs(UnmanagedType.LPStr)] string str,float[] arr_X, float[] arr_Y, float[] arr_Z);
//这个方法是获取点的数量,msg传pcd文件的绝对路径
[DllImport("AddOperate.dll", EntryPoint = "Size", CharSet = CharSet.Auto)]
public static extern int Size([MarshalAs(UnmanagedType.LPStr)] string msg);
/// <summary>
/// 解析*.pcd点云数据格式文件
/// </summary>
/// <param name="加载的PCD文件绝对路径"></param>
public bool LoadFile(string strFile,ref float[] arr_X, ref float[] arr_Y, ref float[] arr_Z)
{
loadPCDFile(strFile,arr_X, arr_Y, arr_Z);
return true;
}
/// <summary>
/// h获取文件下点的数量
/// </summary>
/// <param name="strFile"></param>
/// <returns></returns>
public int PcdSize(string strFile)
{
int size = Size(strFile);
return size;
}
调用试列
//pcd文件绝对路径
string url = @"C:\Users\Administrator\Desktop\新建文件夹 (3)\13_48_15_213.pcd";
pcdFile pcd = new pcdFile();
//获取点的数量
int size=pcd.PcdSize(url);
Dictionary<string, float[]> dic = new Dictionary<string, float[]>();
//创建存放X,Y,Z轴数据的数组
float[] arr_X = new float[size];
float[] arr_Y = new float[size];
float[] arr_Z = new float[size];
//调用解析方法
pcd.LoadFile(url,ref arr_X,ref arr_Y,ref arr_Z);
dic.Add("m_fX", arr_X);
dic.Add("m_fY", arr_Y);
dic.Add("m_fZ", arr_Z);
后言
没有积分的朋友可以发邮件给我,邮箱:localstorage@qq.com,其次,这个DLL我感觉做的并不是很好,但是数据能获取