KinectFusion

1、资料
Kinect有两篇论文,一篇《KinectFusion: Real-Time Dense Surface Mapping and Tracking》偏向学术,另一篇《KinectFusion:Real-time 3D Reconstruction and Interaction Using a Moving Depth Camera》偏向工程实践。
还有官方的PPT,讲的更清楚。
付兴银在泡泡机器人上讲《KinectFusion和ElasticFusion三维重建方法》
官方资料
https://blog.****.net/kiara_wei/article/details/70145640
《随机蕨编码在三维重建中的应用——刘洋》中第四章引言有kinectFusion的介绍及改进,及论文引用。
2、CUDA
CUDA可以理解为NVIDIA GPU的c/c++开发套件。
一个线程(thread)处理一个图像的像素或TSDF Volume中一列体素。线程是最小的执行单位。
许多线程组成线程束(warp),每个warp的活跃线程在任意时刻执行相同的指令,但线程的数据可能不同。一般一个warp内含32个thread。一个warp应避免分支指令,尽量执行同样的操作。
多个线程组织为一个block,一个block中的线程共享一片shared memory,线程数目上限一般为512或1024,维度为1-3.
显存(global memory),全局访问(包含CPU),片外,不加指定默认存储在这里,容量大,速度慢(相对)
Shared memory,片内,每个block都有自己的仅同一个block下的线程可以访问的shared memory,容量大,速度快(相对)
KinectFusion
3、 程序在CPU 上,但CPU调用GPU,所以CPU理解为主机,GPU理解为设备端。数据从CPU到GPU需要“上传”,数据从GPU到CPU需要“下载”,CUDA中提供了API
KinectFusion
__host__只能在CPU上调用、运行的函数,就是普通写的函数,CUDA中不加前缀默认为__host__属性;__global__可以在CPU上调用,GPU上运行的函数,__device__只能在GPU上调用和运行的函数,host__不能调用__deviceglobal__和__device__能调用__device
KinectFusion
4、流程
kinectFusion首先由图像估计点云和法线,再根据当前的点云、法线和上一帧的点云、法线估计R、T,然后surface reconstruction,最后融合。Kinectfusion主要用深度图,彩色图是用来做表面文理的。
KinectFusion
KinectFusion第一步是做金字塔,彩色图像的金字塔,深度图的金字塔,深度图金字塔还要双边滤波去噪点,然后计算深度图金字塔每一层的顶点和法线。
计算顶点就是根据图像像素和相机内参计算在相机坐标系下的点。
计算法线,采用计算点左右上下的四个点,连线做叉乘。
KinectFusion
KinectFusion
求位姿采用ICP方法,对金字塔每一层从顶层到底层均要迭代计算,每一层计算过程一样,下面红色框内是每一层的步骤。顶层计算得到的位姿粗糙,但可以作为下一层计算的初始值。
计算考虑每一帧和上一帧之间的移动很小
point-to-plane的清晰推导在B站的计算机视觉life中《KinectFusionLib代码详解下》
KinectFusion
kinectFusion的点云模型存在于显存,由于显存空间有限,使得kinectFusion支持的建模受限。
5、kinectFusion有许多实现,包括OpenCV4和PCL、KinectFusionLib。KinectFusionlib运用许多新的C++的新特性,看着舒服。KinectFusionlib只是一个库,需要搭配kinectFusionAPP使用。
kinectFusionlib中的CUDA文件先通过nvcc编译成一个中间库,KinectFusionlib中的C++(CPU)文件通过g++编译成另一个库,通过kinectFusionlib把两个连在一起形成一个库,KinectFusionAPP中的C++文件(CPU)通过g++编译,最有KinectFusionAPP调用kinectFusionlib库和KinectFusionAPP中的C++文件(CPU),很多算法都是这样,CUDA单独编译成一个库,然后调用。
KinectFusionApp:https://github.com/chrdiller/KinectFusionApp
KinectFusionLib:https://github.com/chrdiller/KinectFusionLib
KinectFusionLib代码注释:https://github.com/DreamWaterFound/KinectFusionAppLib_comments