当需要使用PclSharp1.12.0点云库开发Winform应用程序时,可结合Activiz(C#版的VTK)库进行可视化显示,来开发自己的点云数据窗体应用程序。
下载地址:PclSharp1.12.0点云库-C#文档类资源-CSDN下载
首先使用创建一个空的Winform应用程序,然后右键添加引用>>选中PclSharp.dll,点击添加。
将PclSharp1.12.0资源包下X64下的Release的PclSharp.Extern.dll放到自己的Winform项目的Debug/Release下
把PclSharp1.12.0资源包下的dlls文件夹下的相关pcl库文件全部复制到Winform的Debug/Release下
再把VTK9.0下的所有dll文件也复制到Winform项目的Debug/Release下
引用右键选择管理NuGet程序包 ,浏览中输入Activiz,选中Activiz.NET.x64(5.8.0版本),点击安装
安装完成后,引用中会出现两个Kitware的库
再Form1窗体设计里拖一个Panel控件,再拖入一个按钮控件,用来点击加载点云,进行可视化显示。
回到Form1代码设计里,声明一个RenderWindowControl控件(用来可视化点云),添加命名空间 using Kitware.VTK;
然后在主窗体的Load事件中 ,创建RenderWindowControl对象并进行设置。
在button1的点击事件中,读取点云后,然后在vtk中进行可视化显示
目标平台选择X64或者AnyCpu
然后启动应用程序,点击加载点云,效果如下图:
程序源代码:
using Kitware.VTK;
using PclSharp;
using PclSharp.IO;
using System;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace PclSharpWinform
{
public partial class Form1 : Form
{
/// <summary>
/// 声明控件
/// </summary>
private RenderWindowControl renderWindowControl1;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
renderWindowControl1 = new RenderWindowControl();
renderWindowControl1.AddTestActors = false;
renderWindowControl1.Dock = System.Windows.Forms.DockStyle.Fill;
renderWindowControl1.Location = new System.Drawing.Point(0, 0);
renderWindowControl1.Name = "renderWindowControl1";
renderWindowControl1.Size = new System.Drawing.Size(100, 100);
renderWindowControl1.TabIndex = 0;
renderWindowControl1.TestText = null;
//将控件添加进Panel
this.panel1.Controls.Add(renderWindowControl1);
}
/// <summary>
/// 点击加载点云
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
//读取点云数据
var cloud = new PointCloudOfXYZ();
using (var reader = new PCDReader())
reader.Read(AppDomain.CurrentDomain.BaseDirectory + $"//pcd//rabbit.pcd", cloud);
//显示点云
ShowPointCloud(cloud, renderWindowControl1);
}
/// <summary>
/// 异步线程的方法显示点云数据
/// </summary>
/// <param name="pointCloud"></param>
public void ShowPointCloud(PointCloudOfXYZ pointCloud, RenderWindowControl renderWindowControl)
{
Task.Run(() => {
try
{
//PickUp();
ShowPointCloud(ConvertTovtkPoints(pointCloud), renderWindowControl);
}
catch (Exception)
{
}
});
}
private float MaxZ;
private float MinZ;
/// <summary>
/// PointCloud 将转成vtk点集
/// </summary>
/// <returns></returns>
private vtkPoints ConvertTovtkPoints(PointCloudOfXYZ pointCloud)
{
vtkPoints points = new vtkPoints();
try
{
MinZ = pointCloud.Points[0].Z;
MaxZ = pointCloud.Points[0].Z;
for (int i = 0; i < pointCloud.Points.Count; i++)
{
if (pointCloud.Points[i].Z > MaxZ) MaxZ = pointCloud.Points[i].Z;
if (pointCloud.Points[i].Z < MinZ) MinZ = pointCloud.Points[i].Z;
points.InsertPoint(i, pointCloud.Points[i].X, pointCloud.Points[i].Y, pointCloud.Points[i].Z);
}
return points;
}
catch (Exception)
{
return points;
}
}
/// <summary>
/// 显示点云
/// </summary>
/// <param name="points"></param>
private void ShowPointCloud(vtkPoints points, RenderWindowControl renderWindowControl)
{
try
{
vtkPolyData polyData = vtkPolyData.New();
polyData.SetPoints(points);
//Color
vtkVertexGlyphFilter glyphFilter = vtkVertexGlyphFilter.New();
glyphFilter.SetInput(polyData);
glyphFilter.Update();
vtkElevationFilter ColoredGrid = vtkElevationFilter.New(); //帮点上颜色
ColoredGrid.SetInputConnection(glyphFilter.GetOutputPort());
ColoredGrid.SetLowPoint(0, 0, MaxZ);
ColoredGrid.SetHighPoint(0, 0, MinZ);
// Visualize
vtkPolyDataMapper mapper = vtkPolyDataMapper.New();
mapper.SetInputConnection(ColoredGrid.GetOutputPort());
vtkActor triangulatedActor = triangulatedActor = vtkActor.New();
triangulatedActor.SetMapper(mapper);
//renderWindowControl1控件提供“渲染窗口”
vtkRenderWindow renderWindow = renderWindowControl.RenderWindow;
//渲染器
vtkRenderer renderer = renderWindow.GetRenderers().GetFirstRenderer();
//设置背景色
renderer.SetBackground(.1, .2, .3);
//可以刷新显示
//renderWindow.SetSize(520, 520);//设定窗口的大小
renderWindow.SetSize(renderWindowControl.Width - 1, renderWindowControl.Height);//设定窗口的大小
vtkActorCollection coll = renderer.GetActors();
//int count = coll.GetNumberOfItems();
//for (int i = 0; i <= count; i++)
//{
// renderer.RemoveActor(renderer.GetActors().GetLastActor());
//}
coll.RemoveAllItems();//移除已有角色
renderer.RemoveAllViewProps();
renderer.AddActor(triangulatedActor);
vtkInteractorStyleTrackballCamera style = vtkInteractorStyleTrackballCamera.New(); //移动摄像头
//获取交互器
vtkRenderWindowInteractor renderWindowInteractor = renderWindow.GetInteractor();
renderWindowInteractor.Start();
//设置"相机Camera"
vtkCamera camera = renderer.GetActiveCamera();// 新建相机
renderer.ResetCamera();
}
catch (Exception)
{
throw;
}
}
}
}