C#解析读取pcd文件

C#解析pcd文件内点云数据

前言

这一段时间做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我感觉做的并不是很好,但是数据能获取

Pcap文件解析pcd文件可以使用PCL(Point Cloud Library)库中的`pcl::PCDWriter`类。以下是一个简单的示例代码: ```c++ #include <iostream> #include <string> #include <pcl/io/pcd_io.h> #include <pcl/io/pcap_io.h> #include <pcl/point_types.h> int main(int argc, char** argv) { if (argc < 3) { std::cout << "Usage: " << argv[0] << " input.pcap output.pcd" << std::endl; return -1; } std::string input_file = argv[1]; std::string output_file = argv[2]; pcl::PCDWriter writer; pcl::PointCloud<pcl::PointXYZI>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZI>); pcl::PCAPReader reader; if (reader.open(input_file) == -1) { std::cerr << "Failed to open Pcap file: " << input_file << std::endl; return -1; } int packet_count = 0; while (!reader.end_of_stream()) { struct pcap_pkthdr header; const unsigned char* data = reader.read_packet_data(header); if (data == nullptr) { continue; } // parse packet data // ... // add point to point cloud pcl::PointXYZI point; point.x = 1.0; // example point data point.y = 2.0; point.z = 3.0; point.intensity = 4.0; cloud->push_back(point); packet_count++; } reader.close(); if (packet_count == 0) { std::cerr << "No packets found in Pcap file: " << input_file << std::endl; return -1; } writer.writeBinary(output_file, *cloud); std::cout << "Converted " << packet_count << " packets to PCD file: " << output_file << std::endl; return 0; } ``` 在上述代码中,我们首先使用`pcl::PCAPReader`类打开Pcap文件,然后使用`reader.read_packet_data()`方法逐个读取数据包。在读取数据包后,我们可以解析数据包以获取点云数据,并将其添加到`pcl::PointCloud`对象中。最后,我们使用`pcl::PCDWriter`类将点云写入PCD文件。 请注意,上述代码仅提供了一个简单的示例,实际上,从Pcap文件解析点云数据可能需要更复杂的逻辑和算法。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值