Point Cloud 点云

Point Cloud

点云

什么是点云

点云是一些坐标系统中的一组数据点。在三维坐标系中,这些点通常由X,Y和Z坐标定义,并且通常用于表示物体的外表面。每个点都有他的位置信息,即在三维中的X,Y,Z,这是必须要有的,其余像颜色信息,光照强度,类别标签、法向量、灰度值等信息,这些信息可有可无,根据自身来定。

点云通常用于捕捉现实世界中的物体、场景或环境的形状和表面细节。这些点可以通过激光扫描、结构光扫描、立体视觉等技术来获取。点云数据可以用来进行三维建模、计算物体的体积和表面积、识别物体、环境重建、机器人导航、虚拟现实和增强现实应用等。

点云的特性

点云是目标表面特性的海量点集合,点云越密集,反映的图像细节和信息就越多

点云数据是怎么样来的

  • 激光扫描仪:利用激光测距的原理,记录被测物体表面大量的密集的点的三维坐标、反射率和纹理等信息,可快速复建出被测目标的三维模型。激光扫描仪可以分为星载、机载、地面、移动等类型

  • 深度相机:通过近红外激光器把具有结构特征的光线投影到物体上,通过红外摄像头采集得到深度信息。深度相机的优点是成本低、计算量小、主动光源,夜晚也可用,但观测范围和距离有限。常见的深度相机有微软的 Kinect 系列、Intel 的 realsense 系列、苹果12pro以上pro系列等。

  • 双目相机:使用两个相机从不同位置获取物体的两幅图像,通过计算对应点的位置偏差,使用三角原理计算点的三维坐标。双目相机的优点是成本低、室内室外都适用,但对环境光敏感,且基线限制了测量范围

  • 光学相机多视角重建:给出多幅图像及其图像特征点的对应集合,估计 3D 点的位置和摄像机姿态(运动)。这种方法的优点是成本低,使用高精度相机和更稳定的平台(有 GPS/IMU)可以进行高精度测量,但计算量大。

点云的用处

  • 测绘:点云可以用于获取地形、建筑物、桥梁、隧道等的三维模型,进行精确的测量、分析和可视化。 点云还可以用于生成数字高程模型(DEM),用于土方计算、检测地质灾害等。

  • 电力:点云可以用于电力线路的巡检和管理,通过激光雷达扫描电力设施,获取其三维结构和状态信息,进行故障诊断、安全评估和维修规划。

  • 建筑:点云可以用于建筑设计、施工和监测,通过对现场或既有建筑进行三维扫描,获取其准确的尺寸和形态,进行建模、仿真和优化。 点云还可以用于文化遗产的保护和修复,通过对古建筑或文物进行三维重建,保存其历史价值。

  • 工业:点云可以用于工业制造、质量检测和逆向工程,通过对产品或零件进行三维扫描,获取其表面特征和几何参数,进行对比、分析和改进。 点云还可以用于机器人导航和操作,通过对环境进行三维感知,实现自主定位、规划和控制。

  • 汽车:点云可以用于汽车行业的研发、测试和评估,通过对汽车或道路进行三维扫描,获取其外观、性能和安全性等信息,进行设计、仿真和优化。 点云还可以用于自动驾驶技术的开发和应用,通过对周围环境进行三维感知,实现障碍物检测、轨迹规划和决策控制。

  • 游戏:点云可以用于游戏开发和增强现实(AR)技术的创作和体验,通过对真实场景或虚拟物体进行三维扫描,获取其真实感和交互性等效果,进行渲染、动画和融合。

  • 刑侦:点云可以用于刑事侦查和法医分析的辅助和证据,通过对案发现场或尸体进行三维扫描,获取其详细的情况和特征,进行重现、比对和推理。

点云的格式

  • pts:这是最简单的点云格式,只包含点的三维坐标(x,y,z),可以是整型或浮点型,每行一个点,用空格分隔。

  • LAS:这是激光雷达数据(LiDAR)的格式,除了点的三维坐标外,还包含了颜色、强度、类别、时间等属性信息,是一种开放的格式标准,可以被不同的硬件和软件提供商使用。

  • PCD:这是 PCL 库(Point Cloud Library)的官方格式,支持 n 维点类型扩展机制,可以存储点的多种属性信息,有文本和二进制两种形式。

  • xyz:这是一种文本格式,包含了点的三维坐标和法向量(x,y,z,nx,ny,nz),每行一个点,用空格分隔。

  • pcap:这是一种通用的数据流格式,常用于 Velodyne 公司出品的激光雷达采集数据,以二进制形式保存。

点云的表示

一般的点云表示格式为[N, M],其中N是点的个数,M可以类比成图像中的通道数,如果点云只有x,y,z三个信息,那么M=3。

假设下面这个物体有10000个点,只有单纯的坐标信息,那么它的形状大小[10000,3],如果它显示颜色(RGB),那么它的形状大小为[10000,6]

img

Unity实现点云

Point Cloud Free Viewer

作为Unity插件如何实现导入

默认格式

脚本默认处理的是.off的格式,想要处理其他数据,得将其他数据转.off格式

计算机渲染之后,会以数据的形式储存.off

这里有个模型转换网址

https://imagetostl.com/cn/convert/file/obj/to/off

导入过程
  • 创建一个空对象命名为Scripts,将脚本PointCloudManager.cs添加至此对象的组件。

  • 将脚本EnablePointSize.cs添加至Main Camera的组件。

  • 在脚本PointCloudManager.cs的参数栏填写点云数据文件路径(路径从工程的Asset文件夹算起,利用插件自带的测试点云文件,此路径应填写为/PointCloud/xyzrgb_manuscript),设置缩放系数(设置为0.25比较合适)

  • 选择顶点着色器VertexColor。组件设置如下

  • 在Script文件夹内创建一个新脚本CameraController.cs,用来操控Main Camera的视角,便于浏览整个点云。

测试效果

导入后 ,可以看出多少个点

 

会在Resources 下生成对应名称的文件夹里面有它的源文件,还会生成个预制体在PointCloudMeshes下

测试数据

大小/mb点数时间/s运行内存/mb
99.0215561712874
71.77442137817
52.75358936680

支持的大小

官方给出可以查看一千万个点

Point Cloud Viewer and Tools

这个是Point Cloud Free Viewer升级款

可以支持更多格式,处理更多数据

支持的格式更多支持:XYZ,XYZRGB,CGO,ASC,CATIA ASC,PLY(ASC),LAS,PTS

插件的使用

给了两个编辑器插件

第一个是将点云转化为二进制文件,将数据保存在二进制格式中可以快速阅读

第二个是将点云转化为Unity网格,将点云数据分为规则的Unity网格-无网格重建,只有点网格

第一个插件主要是来查看点云

把需要查看的文件导入里面即可,然后点击Convert to Binary会生成二进制文件(bin),把它保存在于PointCloudViewerSampleData文件夹中

打开PointCloud-BinaryLoaderV1场景,这是插件里自带的场景可以直接在里面操作。

选择刚刚保存bin文件的路径,选择点云的材质,推荐使用PointCloudColorSizeDX11v2-Example-YourOwnData这个(注意这个材质大小最好还是默认,要调的话往小的调,大的会使Unity崩)

点击运行后可以查看到点云文件了(如果看不见把相机里的背景改成白色)

这套插件给了三个查看场景 插件给出的是

- DX11 点云查看器(在 v2 格式中达至 1.78 亿个点)。新:v3 格式带有优化的点砖片LOD 系统,4.32亿点已经过测试)

在官方给的视频里可以支持一千亿个点

第二个插件是让点云变成网格

文件格式还是支持官方给的那几个,将文件拖入里面,材质选择BrightBlue-Example 点击Covert to Meshes后可以转化为预制体,可以在场景里直接看到其网格

保存网格

如果想保存网格,这里有个脚本可以保存

using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
​
public class NewBehaviourScript 
{
    [MenuItem("CONTEXT/MeshFilter/Save Mesh...")]
    public static void SaveMeshInPlace (MenuCommand menuCommand) {
        MeshFilter mf = menuCommand.context as MeshFilter;
        Mesh m = mf.sharedMesh;
        SaveMesh(m, m.name, false, true);
    }
​
    [MenuItem("CONTEXT/MeshFilter/Save Mesh As New Instance...")]
    public static void SaveMeshNewInstanceItem (MenuCommand menuCommand) {
        MeshFilter mf = menuCommand.context as MeshFilter;
        Mesh m = mf.sharedMesh;
        SaveMesh(m, m.name, true, true);
    }
​
    public static void SaveMesh (Mesh mesh, string name, bool makeNewInstance, bool optimizeMesh) {
        string path = EditorUtility.SaveFilePanel("Save Separate Mesh Asset", "Assets/", name, "asset");
        if (string.IsNullOrEmpty(path)) return;
        
        path = FileUtil.GetProjectRelativePath(path);
​
        Mesh meshToSave = (makeNewInstance) ? Object.Instantiate(mesh) as Mesh : mesh;
        
        if (optimizeMesh)
            MeshUtility.Optimize(meshToSave);
        
        AssetDatabase.CreateAsset(meshToSave, path);
        AssetDatabase.SaveAssets();
    }
​
}
​

脚本保存后

这里多了个Save Mesh

点击就可以保存了

Pcx

这是一个自定义的导入器和渲染器,可以在Unity中处理点云数据。它支持PLY二进制小端格式,并提供了两种渲染方法:点(点原始)和磁盘(几何着色器)。

下载地址 GitHub - keijiro/Pcx: Point cloud importer & renderer for Unity

只能导入它案例上带的素材,这是它给出的操作方法

PCX插件支持三种类型的点云容器:Mesh,ComputeBuffer和Texture。

Mesh:点云被存储在一个Mesh对象中,可以用标准的MeshRenderer组件来渲染。建议使用PCX插件中包含的自定义着色器(Point Cloud/Point和Point Cloud/Disk)。 ComputeBuffer:点云被存储在一个PointCloudData对象中,它使用ComputeBuffer来存储点数据。它可以用PointCloudRenderer组件来渲染。 Texture:点云被烘焙到Texture2D对象中,可以用作Visual Effect Graph中的属性贴图。 PCX插件支持两种类型的渲染方法:Point(点原始)和Disk(几何着色器)。

Point:当使用Point Cloud/Point着色器时,点云被渲染为点原始。点的大小可以通过材质属性来调整。这些大小属性只在一些平台上支持;它可能在OpenGLCore和Metal上工作,但在D3D11/12上不工作。当PointCloudRenderer中的点大小设置为零时,也使用这种方法。 Disk:当使用Point Cloud/Disk着色器或PointCloudRenderer时,点云被渲染为小圆盘。这种方法需要几何着色器支持。

这个插件有弊端只能支持PLY小端二进制格式

我导入普通的ply文件时,解析不了,不推荐使用

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值