特征点检测与匹配
SIFT,SURF,ORB等特征检测算法。LineMod:针对纹理少的场景。
基于图像的渲染(IBR, Image-based Rendering)
IBR 主要利用一组预先捕获的图像来生成新视角的图像,而不是依赖于详细的三维模型。这种技术特别适用于那些难以用传统三维建模方法表示的场景,这依赖于图像重投影和视图插值技术。
运动恢复结构(SFM, Structure from Motion)
SfM不要求实时性,对重建场景的精度要求更高;而SLAM要求实时性,对相机定位要求较高,但是对场景的稠密性要求比较低。
SfM可以用于恢复相机的内参、外参以及场景点云。
一些SFM工具:
传统的多视图几何内容已经基本被彻底研究透彻了。一些主流的离线视觉三维重建商业和开源的框架问世时间:
商用 :
· Photoscan(现在称为Agisoft Metashape)的首个版本于2010年发布。
· ContextCapture 是由Bentley Systems开发的软件,首个版本发布于2015年。
· Inpho 是由Trimble开发的软件,发布时间比较早,但具体时间可能因版本而异。Trimble公司在2008年收购了Inpho公司,因此在此之前的版本应该是由Inpho公司发布的。
· Pix4D是一家提供专业无人机图像处理软件的公司,其软件可用于生成高质量的地图和模型。Pix4D软件的首个版本于2011年发布。
开源:
· openmvg 是2012年发布,应该是最早的且最具有代表性的三维重建框架。
· colmap是2016年发布的,一问世便处于巅峰位置,目前来看,仍然是处于incremental sfm 的榜首。
· 除了openmvg和colmap ,还有ODM、opensfm、theiasfm、alicevision等这些都差不多在colmap问世的前后时间。
目前来看,开源的大多数NeRF/3D GS框架的输入几乎都是colmap的SFM的结果(并不是NeRF/3D GS的输入必须是Colmap,也可以是vslam的结果也可以是一些商业软件的结果),使用colmap的原因很简单:开源SOTA且容易安装。
同时定位与制图(SLAM, Simultaneous Localization and Mapping)
SLAM同时定位与制图。定位的概念很好理解,如果一个机器人来到陌生的环境,它需要知道自己在哪儿,数学上来说就是知道自己的坐标,机器人如果在移动,就需要时刻的坐标更新。制图的意思是指对周围环境的了解,对周围环境的了解能帮助你更好地定位自己。
制图分为稀疏制图(sparse mapping)和稠密建图(dense mapping)。稀疏制图表示你对周围的环境只有部分的了解,而稠密建图则表示你对周围的环境的每一个点都清楚。
多视角立体(MVS, Multi-View Stereo)
多视角立体视觉(Multiple View Stereo, MVS)是对立体视觉的推广,能够在多个视角(从外向里)观察和获取景物的图像,并以此完成匹配和深度估计。
某种意义上讲,SLAM/SFM其实和MVS是类似的,只是前者是摄像头运动,后者是多个摄像头视角去观察一个物体。也可以说,SLAM/SFM像是在环境里面“穿行”,而MVS更像在环境外“旁观”。
逆渲染(Inverse Rendering)
逆渲染的目标: 图像->相机+几何+材质+光照+...等自然场景信息。三维重建可以算是逆渲染的一个子任务。逆渲染还在其他子任务,如光照估计,材质估计,位姿估计等。
深度估计(Depth Estimation)
深度估计可以认为是逆渲染中的一个子任务。先做深度估计再做
可微渲染(Differentiable Rendering)
可微渲染是逆渲染的一种解决方式。
可微渲染是可以微分求导的渲染过程,分为正向和逆向的过程。正向过程和传统渲染相同,输入模型和参数得到一张图片,逆向是像素对场景参数求导数。可微渲染不仅需要得到渲染结果,还要得到渲染结果(像素值)对输入参数的导数。传统的渲染方法不可微,所以可微渲染往往是基于某种传统渲染模型,通过引入新的技术,使得我们可以得到渲染结果对输入的导数。
主流的可微渲染方法往往基于以下两类思想,一类是使用近似的方法,求得近似导数用于反向传播;另一类是改编传统渲染模型,让像素对顶点可导。
上述第 1 类方法不改变传统渲染的正向过程,虽然传统渲染方法天然不可微,但使用近似的方法,能求得近似导数用于反向传播。 这类方法的核心在于如何更好地近似渲染过程的导数,使得导数在某种观点下是一种有效的近似,或是使得导数对优化输入有着指导意义。为了使得导数对优化输入有着指导意义,有时导数会和应用相关,会根据损失函数的不同而不同。
对于上述第 2 类方法,由于传统渲染方法天然不可微,需要对其进行改编,使得改编后的渲染方法依然拥有渲染的能力,渲染结果不发生较大变化,但其过程完全可微,可以求得精确导数。这类方法通常改编其中光栅化的步骤,因为这一步从连续空间映射到离散空间,是导致传统渲染不可微的原因。
· 相机标定入门详解与Python-OpenCV实现
· 相机棋盘格标定python-cv2的实现