本流程可以实现vs2019下c# winform应用程序开发,通过两种类库引用方法分别实现点云与图片的加载与显示功能
由于pcl的.NET包装并不可靠,且pclsharp已经很久没有维护了(网上只有Justin Bruening封装好的sharp库,且版本较老),因此采用在vs2019下配置pcl库并实现功能,并编译生成dll文件,再生成c#可引用的.NET类库的方式,实现c#对点云的处理和显示(这里应用的原理是c#类库的两种引用方式之一,引用自定义类库(白盒引用有源码))
opencv、vtk有可靠的.NET包装,并有现成的sharp库,直接引入即可(NuGet引用 (黑盒引用无源码))
流程为 配置c#界面程序-->实现图片显示功能(NuGet引用opencv+vtk)-->实现点云显示功能(vs2019配置pcl实现功能、生成dll库文件、生成dll库文件、打包成c#所需类库(源码引用pcl))
初次配置参考博主:
1、打开vs2019,新建c#项目,选择c#窗体应用--winforms,下一步
更改项目名称、位置,框架默认,创建
2、打开form1.cs设计界面,分别放入panal用于显示点云,picturebox显示图片,两个button分别加载点云与图片
3、首先实现图片显示功能,单击选中按钮,更改名字和显示文本,分别将button1和button2的文本更改为:“加载点云”,“加载图片”,名字更改为:“loadcloud”,“loadpicture”,并ctrl s保存
4、双击加载图片按钮,以实现对其触发的操作,这里的思路是,点击按钮时,弹出文件浏览窗口,加载图片,并将其显示在picturebox控件上,这里使用opencv进行对图片的加载
5、opencv的sharp封装可以使用c#类库包含两种方法之一的黑盒引用方式,即NuGet管理,下面进行演示,右键项目解决方案-->管理NuGet程序包,在浏览里搜索opencv
6、安装OpenCvSharp4.Windows及OpenCvSharp4.Extensions组合或OpencvCvSharp4及OpenCvSharp4.Extensions及OpenCvSharp4.runtime,参考博主
这里选择第一种组合,包安装目录在本项目根目录下,无需选择与配置
若弹窗确定即可,若安装失败,请检查网络
7、安装完成后,可见引用已经有了cv sharp库,这说明我们可以引用此类库并使用其中的命名空间下的函数了
8、在类库引用处添加using OpenCvSharp;using OpenCvSharp.Extensions;引用opencvsharp类库命令,这就是c#的类库引用黑盒引用方式,即通过NuGet程序包进行管理,如需其他类库,通过此方式可以很方便的引用,且安装目录就在项目根目录下,缺点是只能引用已经封装且发布的现成类库,即“黑盒”,无法更改源码,只能使用现有方法,适合已经封装好的库,另外一种类库引用方法即白盒引用后面进行演示
9、同样的,使用上述方法,还可以对vtk进行引用,vtk的c#封装名称为activiz,同样在NuGet中搜索安装与引用
10、全部完成后,下面实现对图片的显示,在双击加载图片按钮生成的代码中,写入以下代码:
更改平台为release x64(根据自己的需要),运行,发现会报错,参考博主
解决方法为,在NuGet程序包管理中安装或更新System.Drawing.Common
11、安装更新完成后再次运行,点击加载图片,选择jpg或png类型,显示成功,可见opencv配置成功,后面可以正常使用c#下的cv进行图片的显示、二值化、分割、标注等等功能
1、根据简述,pcl并无可靠的sharp版本,因此采用c#引用类库的第二种方式即白盒引用源码引用,通过vs2019创建的c++项目以对pcl进行配置及函数实现,将其编译生成dll文件,并做出c#可以白盒引用源码引用的类库。第一步,再次打开vs创建动态链接库新项目
更改名称及路径,创建(需要注意这里的名称,后面需要与这里一致)
2、分别添加新建项头文件cloud.h和源文件cloud.cpp(名称任意),配置平台release x64,并配置pcl,配置pcl方法欢迎参考之前的流程链接:
3、都配置好后,在cloud.h文件下添加如下内容:
在cloud.cpp文件下添加如下内容:
这里面只实现对pcd和ply的点云加载,如想实现其他三维点云处理功能如直通滤波、下采样、配准等等,对应实现cpp和h文件内的内容即可,其他详情如直通分割操作可参考博主:
4、这种白盒引用方式的好处就是c#没有pcl的可靠包,因此可以在vs2019下实现所有的pcl功能,c#程序只做调用与显示,这样就将pcl与c#链接起来了,且由于是白盒引用,即可修改源码,因此相对更加灵活。完成后,在预处理器定义下(属性-->c++预处理器-->预处理器定义)添加NOMINMAX(否则会报错,因为pcl库中的函数模板max min与vs中的宏max冲突),运行,即可生成dll文件
5、生成的dll文件在项目x64 release(若平台配置的是release x64)文件夹下
6、接着,需要将dll转为.NET类库,再次添加或新建类库(.NET Framework)项目,更改名称路径,注意,这里的框架一定要和第一步骤里创建的c#界面程序中的框架一致,创建
7、添加引用using System.Runtime.InteropServices;(才可以使用dllimport)写入以下代码,对应刚刚dll库中的内容,一定要注意对应关系,尤其是函数名称,参数名称,对照自己的命名
8、完成后,运行,即可生成.NET类库dll文件,生成的dll文件在项目bin x64 release(若平台配置的是release x64)文件夹下
9、至此,完成了c++下pcl与c#的链接,下面到c#中引用和使用,将上述生成的两个dll文件放在一起,放入第一步建好的c#界面程序根目录下的bin release(若平台配置的是release x64)文件夹下,打开之前的c#界面项目,在解决方案下找到引用-->添加引用,点击浏览,浏览,找到.NET类库.dll文件(后面生成的那个)添加
10、添加进来后点击确定,可见引用进来成功,这就是第二种引用方式,白盒源码引用,可以修改代码,以实现c#下对应的功能,这里要注意,类名根据自己刚才创建项目时候更改的寻找对应
11、下面就可以使用库内的函数了,首先添加引用,接着到界面里双击加载点云按钮生成代码,(之前实现了加载图片,现在实现加载点云)
12、在按钮触发函数写入如下代码:
13、运行程序,点击加载点云按钮,选择ply或pcd类型点云文件,可见加载成功
因此在c#中,可以使用这两种不同的类库引用方式,以实现对点云的显示、处理,对图像的显示、处理