【入门】3D视觉库


对比几个三维重建系统

wechat: OpenMVG源码阅读小记

1. PCL

github

PCL(Point Cloud Library),是在吸收了前人点云相关研究基础上建立起来的大型跨平台开源C++编程库,它实现了大量点云相关的通用算法和高效数据结构,涉及到点云获取、滤波、分割、配准、检索、特征提取、识别、追踪、曲面重建、可视化等。支持多种操作系统平台,可在Windows、Linux、Android、Mac OS X、部分嵌入式实时系统上运行。如果说OpenCV是2D信息获取与处理的结晶,那么PCL就在3D信息获取与处理上具有同等地位,PCL是BSD授权方式,可以免费进行商业和学术应用。

PCL起初是ROS(Robot Operating System)下由来自于慕尼黑大学(TUM - Technische Universität München)和斯坦福大学(Stanford University)Radu博士等人维护和开发的开源项目,主要应用于机器人研究应用领域,随着各个算法模块的积累,于2011年独立出来,正式与全球3D信息获取、处理的同行一起,组建了强大的开发维护团队,以多所知名大学、研究所和相关硬件、软件公司为主,可参考图1。截止目前,发展非常迅速,不断有新的研究机构等加入,在Willow Garage, NVidia, Google (GSOC 2011), Toyota, Trimble, Urban Robotics, Honda Research Institute等多个全球知名公司的资金支持下,不断提出新的开发计划,代码更新非常活跃,至今在不到一年的时间内从1.0版本已经发布到1.7.0版本。

随着加入组织的增多,PCL官方目前的计划是继续加入很多新的功能模块和算法的实现,包括当前最新的3D相关的处理算法,如基于PrimeSensor 3D设备,微软Kinect或者华硕的XTionPRO智能交互应用等,详细读者可以参考官方网站每期的新闻,而且也计划进一步支持使用CUDA 和OpenCL等基于GPU的高性能计算的技术。笔者相信在近几年内会有更多的人和组织加入到这个项目中来,共享开源PCL带来的各自领域的成果。

PCL算法tree

1.1. PCL的结构和内容

对于3D点云处理来说,PCL完全是一个的模块化的现代C++模板库。其基于以下第三方库:Boost、Eigen、FLANN、VTK、CUDA、OpenNI、Qhull,实现点云相关的获取、滤波、分割、配准、检索、特征提取、识别、追踪、曲面重建、可视化等。

PCL利用OpenMP、GPU、CUDA等先进高性能计算技术,通过并行化提高程序实时性。K近邻搜索操作的构架是基于FLANN (Fast Library for Approximate Nearest Neighbors)所实现的,速度也是目前技术中最快的。PCL中的所有模块和算法都是通过Boost共享指针来传送数据的,因而避免了多次复制系统中已存在的数据的需要,从0.6版本开始,PCL就已经被移入到Windows,MacOS和Linux系统,并且在Android系统也已经开始投入使用,这使得PCL的应用容易移植与多方发布。

从算法的角度,PCL是指纳入了多种操作点云数据的三维处理算法,其中包括:过滤,特征估计,表面重建,模型拟合和分割,定位搜索等。每一套算法都是通过基类进行划分的,试图把贯穿整个流水线处理技术的所有常见功能整合在一起,从而保持了整个算法实现过程中的紧凑和结构清晰,提高代码的重用性、简洁可读。在PCL中一个处理管道的基本接口程序是:

  • 创建处理对象:(例如过滤、特征估计、分割等);
  • 使用setInputCloud通过输入点云数据,处理模块;
  • 设置算法相关参数;
  • 调用计算(或过滤、分割等)得到输出。

为了进一步简化和开发,PCL被分成一系列较小的代码库,使其模块化,以便能够单独编译使用提高可配置性,特别适用于嵌入式处理中:

  • libpcl filters:如采样、去除离群点、特征提取、拟合估计等数据实现过滤器;
  • libpcl features:实现多种三维特征,如曲面法线、曲率、边界点估计、矩不变量、主曲率,PFH和FPFH特征,旋转图像、积分图像,NARF描述子,RIFT,相对标准偏差,数据强度的筛选等等;
  • libpcl I/O:实现数据的输入和输出操作,例如点云数据文件(PCD)的读写;
  • libpcl segmentation:实现聚类提取,如通过采样一致性方法对一系列参数模型(如平面、柱面、球面、直线等)进行模型拟合点云分割提取,提取多边形棱镜内部点云等等;
  • libpcl surface:实现表面重建技术,如网格重建、凸包重建、移动最小二乘法平滑等;
  • libpcl register:实现点云配准方法,如ICP等;
  • libpclkeypoints:实现不同的关键点的提取方法,这可以用来作为预处理步骤,决定在哪儿提取特征描述符;
  • libpcl range:实现支持不同点云数据集生成的范围图像。

为了保证PCL中操作的正确性,上述提到的库中的方法和类包含了单位和回归测试。这套单元测试通常都是由专门的构建部门按需求编译和验证的。当某一部分测试失败时,这些特定部分的各自作者就会立即被告知。这彻底地保证了代码测试过程出现的任何变故,以及新功能或修改都不会破坏PCL中已经存在的代码。

1.2. 教程

csdn: PCL点云处理算法汇总

1.3. Python-PCL

github

Python对PCL的绑定。目前最新版本是v0.3,但自2019-06月份后就没再更新了。

apt install python3-pcl

2. Open3D

github

PCL甚至没有靠谱的python wrapper,唯一一个开源的已经很久没有维护了。在3D显示或者点云处理中,效率是很重要的。此时一个由Intel发布的Open3D出现了。

Open3D 是一个可以支持 3D 数据处理软件快速开发的开源库。Open3D 前端公开了一组用 C++ 和 Python 写成的精心挑选的数据结构和算法,后端高度优化并设置为并行。Open3D可以在不同的平台上设置,并以最少的工作量进行编译。Open3D的代码非常整洁,可以通过明确的代码审查机制来维护。

其核心特性包括:

  • 3D数据结构
  • 3D数据处理算法
  • 场景重建
  • Surface alignment(表面对齐?)
  • 3D可视化
  • 基于物理的渲染(PBR)
  • C++和python代码接口

安装:可以直接通过 pip install open3d 安装,依赖于:

  • jupyter
  • scipy
  • sklearn
  • pybind11

3. 其他软件

3.1. openMVG

github

常见的多视图三维重建管线:

  1. 重建稀疏点云-Structure from Motion(Sfm)
  2. 重建稠密点云-Multi-View Stereo(MSV)
  3. 重建表面-Surface Generation(SG)
  4. 纹理映射-Texture Mapping(TM)

我们知道,照相机/摄像机的原理是将一个三维场景或物体投影到二维平面上,过去是胶片,现在是经过感光元件再记录到存储器。降维的过程通常不可避免地会存在信息的损失,而所谓的重建(Reconstruction),顾名思义就是要从获取到的二维图像中复原原始三维场景或物体。

三维重建的流程大致如下:首先,通过多角度拍摄或者从视频中提取得到一组图像序列,将这些图像序列作为整个系统的输入;随后,在多视角的图像中,根据纹理特征提取出稀疏特征点(称为点云),通过这些特征点估计相机位置和参数;在得到相机参数并完成特征点匹配后,我们就可以获得更稠密的点云(这些点可以附带颜色,从远处看就像还原了物体本身一样,但从近处能明显看出它们只是一些点);最后根据这些点重建物体表面,并进行纹理映射,就还原出三维场景和物体了。

概括起来就是:图像获取->特征匹配->深度估计->稀疏点云->相机参数估计->稠密点云->表面重建->纹理映射。

3.2. openMVS

一般配合openMVG使用。

3.3. MeshLab

homepage

github

gitee

csdn: meshlab简单实践

cnblog: meshlab常用功能

MeshLab 是一个开源、可移植和可扩展的三维几何处理系统,主要用于交互处理和非结构化编辑三维三角形网格。该系统发布于2005年年底,旨在提供一整套三维扫描、编辑、清洗、拼合、检查、呈现和转换网格数据的工具。

MeshLab is mostly based on the open source C++ mesh processing library VCGlib developed at the Visual Computing Lab of ISTI - CNR. VCG can be used as a stand-alone large-scale automated mesh processing pipeline, while MeshLab makes it easy to experiment with its algorithms interactively.

底层基于 VCGlib 图像库进行处理,实际上,VCGlib与MeshLab是同一个组织开发的。

3.4. MeshLabXML

github

gitee

MLX, or MeshLabXML, is a Python (2.7 or 3) scripting interface to MeshLab, the open source system for processing and editing 3D triangular meshes.

Under the hood, MLX generates XML filter scripts that can then be executed headless with the meshlabserver executable or run in the MeshLab GUI. It can also parse some of MeshLab's output, such as the results of the measure_geometry and measure_topology functions.

安装:

pip install meshlabxml

示例程序:

首先需要保证环境变量

import os
meshlabserver_path = 'C:\\Program Files\\VCG\\MeshLab'
os.environ['PATH'] = meshlabserver_path + os.pathsep + os.environ['PATH']

Create an orange cube and apply some transformations:

import meshlabxml as mlx

orange_cube = mlx.FilterScript(file_out='orange_cube.ply', ml_version='2016.12')
mlx.create.cube(orange_cube, size=[3.0, 4.0, 5.0], center=True, color='orange')
mlx.transform.rotate(orange_cube, axis='x', angle=45)
mlx.transform.rotate(orange_cube, axis='y', angle=45)
mlx.transform.translate(orange_cube, value=[0, 5.0, 0])
orange_cube.run_script()
posted @ 2020-12-29 14:04  brt2  阅读(832)  评论(1编辑  收藏  举报