.NET 封装 PCL 点云库,可在C#、VB.NET语言中使用

600 阅读9分钟

前言

在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技术匠] 社区,与其他热爱技术的同行一起交流心得,共同成长!

优秀是一种习惯,欢迎大家留言学习!