C# 读取pcd、ply点云文件数据

最近研究了下用pcl读取点云数据,又做了个C#的dll,方便读取,同样这个dll基于pcl 最新版本1.13.1版本开发。

上次做的需要先得到点云长度,再获取数据。这次这个定义了一个PointCloudXYZ类来存数据。将下面的dll拷贝到可执行目录下,引用Q_PclSharp.dll使用

Dll下载链接

链接:https://pan.baidu.com/s/1H7ig8YXJDTscprVDydjuJA

提取码:6xha

具体使用方法

  1. 引用Q_PclSharp.dll 并使用命名空间 using Q_PclSharp;

  2. PointCloudXYZ cloudXYZ = new PointCloudXYZ();

  3. IO.loadPlyFile(filePath, cloud.PointCloudXYZPointer);

装个VTK,把读到的数据显示出来

测试效果

测试代码

cs 复制代码
using Kitware.VTK;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Q_PclSharp;

namespace TestCSdll
{
    public partial class Form1 : Form
    {
        PointCloudXYZ cloud = new PointCloudXYZ();
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            if (ofd.ShowDialog() == DialogResult.OK)
            {                               
                cloud.Clear();
                IO.loadPlyFile(ofd.FileName, cloud.PointCloudXYZPointer);

                vtkPoints points = vtkPoints.New();
                for (int i = 0; i < cloud.Size; i++)
                {
                    points.InsertNextPoint(cloud.GetX(i), cloud.GetY(i), cloud.GetZ(i));

                }
                vtkUnsignedCharArray colors_rgb = GetRGB(cloud);
                vtkPolyData polydata = vtkPolyData.New();
                polydata.SetPoints(points);
                polydata.GetPointData().SetScalars(colors_rgb);

                vtkVertexGlyphFilter glyphFilter = vtkVertexGlyphFilter.New();
                glyphFilter.SetInputConnection(polydata.GetProducerPort());

                vtkPolyDataMapper mapper = vtkPolyDataMapper.New();
                mapper.SetInputConnection(glyphFilter.GetOutputPort());

                vtkActor actor = vtkActor.New();
                actor.SetMapper(mapper);

                vtkRenderer render = renderWindowControl1.RenderWindow.GetRenderers().GetFirstRenderer();

                for (int i = 0; i < render.GetActors().GetNumberOfItems(); i++)
                {
                    var item = render.GetActors().GetItemAsObject(i);
                    render.RemoveActor((vtkActor)item);
                    item.Dispose();
                }

                render.AddActor(actor);
                render.ResetCamera();
                this.Refresh();
            }
        }

        vtkUnsignedCharArray GetRGB(PointCloudXYZ cloud)
        {
            vtkUnsignedCharArray colors_rgb = vtkUnsignedCharArray.New();
            double[] minmax = new double[6];
            cloud.GetMinMaxXYZ(minmax);
            double z = minmax[5] - minmax[4];
            double z_median = z / 2;
            colors_rgb.SetNumberOfComponents(3);
            double r = 0, g = 0, b = 0;
            for (int i = 0; i < cloud.Size; i++)
            {               
                if ((cloud.GetZ(i) - minmax[4]) > z_median)
                {                   
                    r = (255 * ((cloud.GetZ(i) - minmax[4] - z_median) / z_median)); ;
                    g = (255 * (1 - ((cloud.GetZ(i) - minmax[4] - z_median) / z_median)));
                    b = 0;
                    colors_rgb.InsertNextTuple3(r, g, b);
                }
                else
                {
                    r = 0;
                    g = (255 * ((cloud.GetZ(i) - minmax[4]) / z_median));
                    b = (255 * (1 - ((cloud.GetZ(i) - minmax[4]) / z_median)));
                    colors_rgb.InsertNextTuple3(r, g, b);
                }
            }
            return colors_rgb;
        }
    }
}
相关推荐
初级代码游戏13 分钟前
套路化编程 C# winform 自适应缩放布局
开发语言·c#·winform·自动布局·自动缩放
大空大地20261 小时前
流程控制语句--switch多分支语句使用、while循环语句的使用、do...while语句、for循环
c#
kylezhao20193 小时前
C#序列化与反序列化详细讲解与应用
c#
JQLvopkk3 小时前
C# 实践AI :Visual Studio + VSCode 组合方案
人工智能·c#·visual studio
故事不长丨3 小时前
C#线程同步:lock、Monitor、Mutex原理+用法+实战全解析
开发语言·算法·c#
kingwebo'sZone3 小时前
C#使用Aspose.Words把 word转成图片
前端·c#·word
大空大地20264 小时前
表达式与运算符
c#
向上的车轮5 小时前
为什么.NET(C#)转 Java 开发时常常在“吐槽”Java:checked exception
java·c#·.net
心疼你的一切6 小时前
Unity异步编程神器:Unitask库深度解析(功能+实战案例+API全指南)
深度学习·unity·c#·游戏引擎·unitask
.房东的猫17 小时前
ERP(金蝶云星空)开发【安装篇】
c#