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;
        }
    }
}
相关推荐
周杰伦fans9 小时前
C# required 关键字详解
开发语言·网络·c#
游乐码12 小时前
c#ArrayList
开发语言·c#
唐青枫12 小时前
C#.NET Monitor 与 Mutex 深入解析:进程内同步、跨进程互斥与使用边界
c#·.net
周杰伦fans13 小时前
cad文件选项卡不见了怎么办?
c#
llm大模型算法工程师weng13 小时前
Python敏感词检测方案详解
开发语言·python·c#
游乐码14 小时前
c#stack
开发语言·c#
橘子编程14 小时前
编程语言全指南:从C到Rust
java·c语言·开发语言·c++·python·rust·c#
zztfj15 小时前
C# 异步方法 async / await CancellationToken 设置任务超时并手动取消耗时处理
c#·异步
无风听海15 小时前
.NET10之C# 中的is null深入理解
服务器·c#·.net
龙侠九重天17 小时前
C# 机器学习数据处理
开发语言·人工智能·机器学习·ai·c#