VoIP模块相关知识汇总

2021字节跳动春招技术面试题:非科班程序员金三银四求职经历,先睹为快

  返回  

合并点云文件

2021/8/20 12:12:14 浏览:

1. 前言

目前还有很多局限性:

  1. 只针对ply格式的文件
  2. 只针对ascii类型的点云数据
  3. 数据格式也必须相同。比如数据都是带有rgb信息的,必须都得是带rgb信息的

合并程序由C#编写,如果不关心程序,只想使用这个小工具,可以直接跳到第三部分,我会放exe文件的链接,下载即可用(Windows系统)

2. 思路介绍及实现程序

思路很简单,文件头只保留一份,数据数量单独计算,点数据先存储到list中,然后在存储时写入文件。这样有一个好处,就是可以合并任意多个点云文件。(前提是内存足够大)

读取ply文件

代码

//创建对象
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Multiselect = true;//等于true表示可以选择多个文件
openFileDialog.Filter = "点云文件|*.ply";
openFileDialog.RestoreDirectory = true;
openFileDialog.FilterIndex = 1;

string filepath = "";

if (openFileDialog.ShowDialog() == DialogResult.OK)
{
    if (openFileDialog.FileNames.Length <= 0)
    {
        MessageBox.Show("未选择点云文件!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
        return;
    }
}
else
{
    return;
}

这个程序会唤起一个弹窗,找到正确的路径,用来选择任意多个点云文件

在这里插入图片描述

遍历文件

获取到了点云文件,然后进行遍历,这里用了一个for循环,**openFileDialog.FileNames.Count()**可以获取选中的文件数

for(int i=0;i< openFileDialog.FileNames.Count(); i++)    //遍历文件

针对多个文件,只需要保存一份文件的头就可以。看看文件头,第四行记录了点数据的数量,随着数据的增多,这个值也在变大,所以这里需要做一下计算。

ply
format ascii 1.0
comment Written by HALCON (export v1.0)
element vertex 12876
property float x
property float y
property float z
end_header

其余数据,包括点数据,直接原封不动地保存到list就可以。

while (!srReadFile.EndOfStream)   //遍历文件的行
{
    row++;
    string strReadLine;
    if (i == 0)     //第一个文件的头需要全部保存,其余文件的头可以丢弃
    {
        strReadLine = srReadFile.ReadLine(); //读取每行数据                                  

        dataList.Add(strReadLine);            //strReadLine                      

        if (row == 4)
        {
            oldString = strReadLine;
            char[] chs = { ' ' };
            string[] res = strReadLine.Split(chs, options: StringSplitOptions.RemoveEmptyEntries);
            elementVertex += Convert.ToInt32(res[2]);
        }
    }
    else
    {
        strReadLine = srReadFile.ReadLine(); //读取每行数据
        if (row == 4)
        {
            char[] chs = { ' ' };
            string[] res = strReadLine.Split(chs, options: StringSplitOptions.RemoveEmptyEntries);
            elementVertex += Convert.ToInt32(res[2]);
        }

        if (flag)
        {
            dataList.Add(strReadLine);
        }

        if (strReadLine.Equals("end_header"))
        {
            flag = true;
        }
    }
}

所有文件遍历完之后,把计算的真实数据量做一个替换,list中索引为3的数据就是文件头的element vertex 12876

//将旧数值替换为计算的数值
dataList[3] = dataList[3].Replace(oldString, "element vertex " + elementVertex.ToString());

写入新文件

到这里,获取到了一个包含所有数据的list,所以只要把它写到新文件即可。

/// <summary>
/// 将合并好的点云文件写入新文件中
/// </summary>
/// <param name="list1"></param>
private void WritePC(List<string> list1)
{
    string path = "";

    FolderBrowserDialog dialog = new FolderBrowserDialog();

    //打开的文件夹浏览对话框上的描述  
    dialog.Description = "请选择一个文件夹";
    //是否显示对话框左下角 新建文件夹 按钮,默认为 true  
    dialog.ShowNewFolderButton = false;
    //按下确定选择的按钮  
    if (dialog.ShowDialog() == DialogResult.OK)
    {
        //记录选中的目录  
        path = dialog.SelectedPath;
    }

    path = path + "\\点云合并文件.ply";

    StreamWriter sw = new StreamWriter(path);
    foreach (string str in list1)
    {
        sw.WriteLine(str); //将列表数据写入文件中
    }
    sw.Close();

    MessageBox.Show("合并完成!","提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
}

3. 小工具链接及使用方法

小工具已上传到百度云,有需要的可以下载

链接:https://pan.baidu.com/s/1NFRaLz9BXfnz_WuGJBtdCA
提取码:x1tm

打开exe文件,弹出一个窗体,上面只有一个按钮

在这里插入图片描述

点击按钮,出现另一个弹窗,选中需要合并的点云文件

在这里插入图片描述

点击“打开”,在合并完成后弹出保存文件的窗体,此时需要选择一个文件夹,合并后的新点云文件将会保存到这个文件夹下。

在这里插入图片描述

合并完成

在这里插入图片描述

联系我们

如果您对我们的服务有兴趣,请及时和我们联系!

服务热线:18288888888
座机:18288888888
传真:
邮箱:888888@qq.com
地址:郑州市文化路红专路93号