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.csdn.net/kiara_wei/article/details/70145640
《随机蕨编码在三维重建中的应用——刘洋》中第四章引言有kinectFusion的介绍及改进,及论文引用。
2、CUDA
CUDA可以理解为NVIDIA GPU的c/c++开发套件。
一个线程(thread)处理一个图像的像素或TSDF Volume中一列体素。线程是最小的执行单位。
许多线程组成线程束(warp),每个warp的活跃线程在任意时刻执行相同的指令,但线程的数据可能不同。一般一个warp内含32个thread。一个warp应避免分支指令,尽量执行同样的操作。一个warp分享的是相同的指令。
多个线程组织为一个block,一个block中的线程共享一片shared memory,线程数目上限一般为512或1024,维度为1-3.
显存(global memory),全局访问(包含CPU),片外,不加指定默认存储在这里,容量大,速度慢(相对)
Shared memory,片内,每个block都有自己的仅同一个block下的线程可以访问的shared memory,容量大,速度快(相对)
在这里插入图片描述
3、 程序在CPU 上,但CPU调用GPU,所以CPU理解为主机,GPU理解为设备端。数据从CPU到GPU需要“上传”,数据从GPU到CPU需要“下载”,CUDA中提供了API
在这里插入图片描述
__host__只能在CPU上调用、运行的函数,就是普通写的函数,CUDA中不加前缀默认为__host__属性;__global__可以在CPU上调用,GPU上运行的函数,__device__只能在GPU上调用和运行的函数,host__不能调用__deviceglobal__和__device__能调用__device
在这里插入图片描述
4、流程
kinectFusion首先由图像估计点云和法线,再根据当前的点云、法线和上一帧的点云、法线估计R、T,然后surface reconstruction,最后融合。Kinectfusion主要用深度图,彩色图是用来做表面文理的。
在这里插入图片描述
KinectFusion第一步是做金字塔,彩色图像的金字塔,深度图的金字塔,深度图金字塔还要双边滤波去噪点,然后计算深度图金字塔每一层的顶点和法线。
计算顶点就是根据图像像素和相机内参计算在相机坐标系下的点。
计算法线,采用计算点左右上下的四个点,连线做叉乘。
在这里插入图片描述
在这里插入图片描述
求位姿采用ICP方法,对金字塔每一层从顶层到底层均要迭代计算,每一层计算过程一样,下面红色框内是每一层的步骤。顶层计算得到的位姿粗糙,但可以作为下一层计算的初始值。
计算考虑每一帧和上一帧之间的移动很小
point-to-plane的清晰推导在B站的计算机视觉life中《KinectFusionLib代码详解下》
在这里插入图片描述
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
6、位姿估计时,将当前帧以位姿初始值,转换到上一帧的视角下,计算数据关联。
7、相机在volume前面
在这里插入图片描述
8、TSDF值
在这里插入图片描述
9、raycast
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值