C#+PclSharp1.12.0+Activiz,开发Winform点云数据处理及可视化程序

10 篇文章 2 订阅

当需要使用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;
            }
        }
    }
}
 

  • 4
    点赞
  • 66
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 13
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

西~风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值