前言
在3D数据处理和计算机视觉领域,点云技术扮演着至关重要的角色。Point Cloud Library (PCL) 作为最广泛使用的开源C++库之一,提供丰富的算法和工具来处理大规模的3D点云数据。
推荐一款专门为 .NET 平台封装的 PCL 库。通过这个封装,PCL的强大功能可以直接在C#和VB.NET中使用,极大地简化开发流程,提高开发效率。
项目介绍
对于3D点云处理来说,Pcl点云库必不可少。
如果说OpenCV是2D信息获取与处理的结晶,那么Pcl就在3D信息获取与处理上具有同等地位。
但不同于opencv拥有众多.NET包装,如OpencvSharp、emgucv等,目前并没有可靠的Pcl的.NET包装(PclSharp已经好几年没有维护,而现行版本又bug太多),这不利于.NET用户开发3D点云的相关应用。
为解决这个问题,笔者开发了Pcl点云库的.NET包装:PclCSharp。
该库封装的是Pcl1.8.1版本,主要集成了pcl库的点云处理功能,但没有封装点云可视化功能。
因为在pcl中,点云可视化是靠vtk实现的,而vtk有C#的版本。用户可以使用vtk可视化点云,使用该库对点云进行处理。
目前该库仅支持Windows10 X64平台。
项目特点
兼容性:目前仅支持 Windows 10 x64 平台。
功能聚焦:专注于 PCL 的核心点云处理功能,确保高性能和稳定性。
易用性:简化了在 C# 和 VB.NET 中使用 PCL 的复杂度,使开发者能够更专注于业务逻辑。
互操作性:与 VTK 的 C# 版本无缝集成,提供了完整的点云处理和可视化解决方案。
使用方法
本库是在 VS 2017、.NET Framework4.6.1框架中进行封装的,主要封装了四个Dll,分别是PointCloudSharpDll、PclCSharp、PointCloudDll和PclDll。
其中前两个是用C#封装的Dll,它们是对后两个dll的包装。它们之间具体的依赖关系见下图。
在实际使用时,只需要在.NET中引用PointCloudSharpDll、PclCSharp这两个dll即可。
但是需要把其他两个dll以及这两个dll依赖的所有dll全部放在exe所在目录。
当然,你也可以放在system32目录,或者放在环境变量指定的文件夹。建议放在exe所在目录中。
依赖的dll全部放在depend/x64目录中。
切记,下图所列的所有dll必须一个不漏的和PointCloudSharpDll、PclCSharp这两个dll放在一起,不然会报System.DllNotFoundException:无法加载 DLL这个错误。
还有一点需要注意,对于pcl_common_release这个dll,它依赖的都是系统级的dll和C++运行时的dll。
对于系统级的dll,只要是正常的window10系统(笔者是在win10上封装的,所以得是win10系统)都会在system32目录中包含相应的dll,所以无需额外添加。至于C++的dll,大部分安装了编程软件的电脑也都会包含,所以也无需额外添加。
用户只需将bin目录下的PointCloudSharpDll、PclCSharp、PointCloudDll和PclDll四个dll和depend/x64目录中的所有dll一起放在exe所在路径中即可使用。
命名空间
1、PointCloudSharp命名空间
PointCloudSharp中封装了该库的数据结构。
目前将pcl::PointCloudpcl::PointXYZ、vectorpcl::PointIndices这两类数据结构进行了封装,对应C#的类为PointCloudXYZ、PointIndices。其他的数据结构后续逐步封装。具体见doc目录中的函数说明。
2、PclCSharp命名空间
该命名空间中包含了pcl中点云处理的算法,暂时封装了Io、Filter、Segmentation、SampleConsensus和Util五个静态类,每个类大体对应着pcl的一个模块,后续会慢慢增加其他模块。各个类之间的关系见下图。
具体见doc目录中的函数说明。
项目使用
函数Demo
在Demo目录中,提供了C#语言的示例。该Demo包含各个模块的示例程序。具体函数实现请见Demo目录。
相关的点云文件可在source目录中找到。
1、IoDemo
该demo主要是关于Io模块的示例程序,在该demo中,笔者演示了如何加载pcd、ply、obj、stl格式的文件,并使用vtk进行可视化,除此之外,还可使用该demo将加载的文件保存为pcd或者ply格式的文件。
结果见下图。
2、FilterDemo
该demo主要是关于Filter模块的示例程序。在该demo中,笔者演示了如何对桌子文件(table_scene_lms400.pcd)进行体素下采样、均匀下采样、半径滤波、统计滤波、直通滤波等,并使用vtk进行可视化。
桌子点云图见下
对其进行体素下采样,采样参数设置为0.08,结果见下。可以看到桌子点云变的很稀疏了。
对其进行统计滤波,邻域参数设置为40,阈值设置为1,结果见下。可以桌子的稀疏离群点都被去除。
对其进行半径滤波,搜索半径设置为0.08,阈值个数设置为40,结果见下。可以桌子左边的一部分离群点被去除。
对其进行直通滤波,需要滤波的轴设置为x轴,x最小值为0.4,最大为1,结果见下。
3、SegDemo
该demo主要是关于Segmentation模块的示例程序。在该demo中,笔者演示了如何使用VTK动态地生成圆形点云,并使用欧式聚类和区域生长对生成的点云进行分割。
点击生成点云按钮之后,显示框中便会动态地生成圆形点云,见下图
从图中可以看出,该点云数据明显分为三类,分别使用欧式聚类和区域生长算法对其进行分割。
欧式聚类结果见下
区域生长的结果见下:
在本数据中,区域生长的效果并不如欧式聚类,这是因为本数据是人为生成的,每个点簇之间的距离明显较大,这种情况使用欧式聚类效果就不错,而且参数也只需要设置一个距离阈值就行,比区域生长要简便高效。
项目地址
Gitee:gitee.com/shudengdeng…
总结
以上仅展示了PclCSharp的部分功能。更多实用特性和详细信息,请大家访问项目地址。
希望通过本文能为点云库PCL开发提供有价值的参考。欢迎在评论区留言交流,分享您的宝贵经验和建议。
最后
如果你觉得这篇文章对你有帮助,不妨点个赞支持一下!你的支持是我继续分享知识的动力。如果有任何疑问或需要进一步的帮助,欢迎随时留言。
也可以加入微信公众号 [DotNet技术匠] 社区,与其他热爱技术的同行一起交流心得,共同成长!
优秀是一种习惯,欢迎大家留言学习!