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]
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.0 | 2155617 | 12 | 874 |
71.7 | 744213 | 7 | 817 |
52.7 | 535893 | 6 | 680 |
支持的大小
官方给出可以查看一千万个点
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文件时,解析不了,不推荐使用