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;
        }
    }
}
相关推荐
还是大剑师兰特1 小时前
C#面试题及详细答案120道(86-95)-- 进阶特性
c#·大剑师
我是唐青枫4 小时前
C#.NET ControllerBase 深入解析:Web API 控制器的核心基石
c#·.net
O败者食尘D5 小时前
【C#】使用Enigma将Winform或WPF打包成一个exe
c#
The Sheep 20238 小时前
C# 吃一堑,长一智
c#
q***829114 小时前
如何使用C#与SQL Server数据库进行交互
数据库·c#·交互
hixiong12317 小时前
C# OpenCVSharp实现Hand Pose Estimation Mediapipe
开发语言·opencv·ai·c#·手势识别
baivfhpwxf202317 小时前
SQL Server 服务端如何在其他电脑连接
c#
Dm_dotnet18 小时前
WPF/C#:使用Microsoft Agent Framework框架创建一个带有审批功能的终端Agent
c#
Dm_dotnet18 小时前
WPF/C#:使用Stylet中的IWindowManager用于显示等待窗体、对话框与消息框
c#
Jackson@ML18 小时前
360度看C#编程语言
开发语言·c#