【入門】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()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM