最近研究了下用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,把读到的数据显示出来
测试效果
测试代码
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;
}
}
}