导览
利用C#写一个简单的点云读取软件
01
.asc的格式
ASC文件主要分为注释+数据两个部分
其中注释部分,一行代表一个信息比如XY点数,点云XY物理长度等;
数据部分:所有数据之间没有换行,点与点之间用“\t”分隔。
ASC点云以第一行第一列为开始点(0位),从左往右写入,写到第一行最后一列时,换行,从第二行第一列开始继续写入,以此往复,直到最后一行最后一列点。
02
C# 代码
打开文件
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Title = "选择你的点云文件";
openFileDialog.RestoreDirectory = true;
openFileDialog.ShowDialog();
if (openFileDialog.FileName != null)
{
string pathfile_pointcloud = openFileDialog.FileName;
}
利用OpenFileDIog类来获得需要读取的点云路径
读取注释行和数据
StreamReader reader = new StreamReader(pathfile_pointcloud);
string[] pointcloud_file = reader.ReadToEnd().Split(new string[] { "\r\n" }, StringSplitOptions.None);
string[] data_1 = pointcloud_file[12].Split(new string[] { "\t" }, StringSplitOptions.None);
if (pointcloud_file[11] == "# Start of Data:")
{
int x_pitch = int.Parse(pointcloud_file[2].Split('=')[1]);
Matsize.Width = x_pitch;
int y_pitch = int.Parse(pointcloud_file[3].Split('=')[1]);
Matsize.Height = y_pitch;
float pitch_x = float.Parse(pointcloud_file[4].Split('=')[1]) / x_pitch;
float pitch_y = float.Parse(pointcloud_file[5].Split('=')[1]) / y_pitch;
}
读取注释行中的重要信息和分割数据点云
将点云存入一个二维数组
datamat = new double[x_pitch, y_pitch];
for (int y = 0; y < y_pitch; y++)
{
for (int x = 0; x < x_pitch; x++)
{
datamat[x, y] = double.Parse(data_1[y * x_pitch + x]);
if (datamat[x, y] > maxv) { maxv = datamat[x, y]; }
}
}
点云保存为一个Double二维数据
保存同理,可视作读取的逆过程。
小结
1. ASC文件介绍
2. 读入和保存