KinectFusion

1.KinectFusion

笔记来源:
论文地址:KinectFusion: Real-time 3D Reconstruction and Interaction Using a Moving Depth Camera*
项目地址:github/KinectFusion
[1] 截断符号距离 | TSDF, Truncated Signed Distance Function

本篇对KinectFusion处理流程进行简要了解
KinectFusion功能:使用深度图进行实时三维重建


大致流程:
创建体素网格,第一帧相机在世界坐标系,根据第一帧的

1.1 Depth Map Conversion


从深度图中计算3D坐标点


从深度图中计算法向量


为什么偏导就是点的法向量?
这个问题在笔者之前的博客中有介绍,为什么曲面函数的偏导数可以表示其曲面的法向量?

通过内参矩阵的逆将相机像素平面二维点转到相机空间三维点
pixel: u = ( x , y ) depth: D i ( u ) 3D vertex in camera’s coordinate space: v i ( u ) = D i ( u ) K − 1 [ u , 1 ] ,This results in a single vertex map V i \text{pixel:}\bold{u}=(x,y)\\ ~\\ \text{depth:}D_i(\bold{u})\\ ~\\ \text{3D vertex in camera's coordinate space:} \text{v}_i(\bold{u})=D_i(\bold{u})K^{-1}[\bold{u},1],\text{This results in a single vertex map} \text{V}_i\\ pixelu=x,y depthDi(u) 3D vertex in camera’s coordinate spacevi(u)=Di(u)K1[u,1]This results in a single vertex mapVi
相机空间中每个顶点的法向量
normal vectors for each vertex: n i ( u ) = ( v i ( x + 1 , y ) − v i ( x , y ) ) × ( v i ( x , y + 1 ) − v i ( x , y ) ) ,This results in a single vertex map N i ~\\ \text{normal vectors for each vertex:}\bold{n}_i(\bold{u})=( \text{v}_i(x+1,y)-\text{v}_i(x,y))×(\text{v}_i(x,y+1)-\text{v}_i(x,y)),\text{This results in a single vertex map} \text{N}_i\\  normal vectors for each vertexni(u)=(vi(x+1,y)vi(x,y))×(vi(x,y+1)vi(x,y))This results in a single vertex mapNi
通过外参矩阵或旋转矩阵将相机空间中的顶点和每个顶点的法向量转到世界坐标系下
camera pose at time  i : T i = [ R i ∣ t i ] vertex and normal can be converted into global coordinates: v i g ( u ) = T i v i ( u ) 、 n i g ( u ) = R i n i ( u ) \text{camera pose at time}\ i:\bold{T}_i=[\bold{R}_i|\bold{t}_i]\\ ~\\ \text{vertex and normal can be converted into global coordinates:}\bold{v}_i^g(\bold{u})=\bold{T}_i\bold{v}_i(\bold{u})、\bold{n}_i^g(\bold{u})=\bold{R}_i\bold{n}_i(\bold{u}) camera pose at time iTi=[Riti] vertex and normal can be converted into global coordinatesvig(u)=Tivi(u)nig(u)=Rini(u)

1.2 Camera Tracking


该步骤生成的3D点用作ICP求解位姿R,t

第一帧时相机坐标系在世界坐标系的原点,相机平面像素点由内参矩阵得到一组3D点,第二帧也由内参矩阵得到一组3D点,这两组3D点进行ICP得到第二帧到世界坐标系的旋转矩阵 R 1 R_1 R1和平移向量 t 1 t_1 t1,后续帧重复这个操作(第n帧包含了前n-1帧的所有点,依次累积)最终世界坐标系中就会有融合各个帧得到的一组点云


两组点云ICP的第一步需要找到两组点云之间的匹配点(或者说是重合的部分)
两组点云依靠这个重合部分进行融合

两组点云依靠重合部分进行融合

文章中用于点云匹配的算法
将前一帧的点(包含前面所有点)投影到当前帧的目的是寻找前一帧和当前帧的匹配点,通过匹配点ICP得以求解获得位姿





1.3 Volumetric Integration

通过ICP得到位姿后,我们把每一帧对应的相机坐标系内的体素都转换到了世界坐标系中,每次转换都会对世界坐标系内体素进行更新


论文中提到使用SDF的变体将全局 3D 顶点集成到体素中,指定与实际表面的相对距离。这些值在表面前为正,在表面后为负,表面界面由zero-crossing定义,值在此改变符号

下图来自: 截断符号距离 | TSDF, Truncated Signed Distance Function
SDF计算方式:camera 到 每个 voxel 的距离减去voxel对应的深度

将volume slice (xy plane) 中的每个体素转换到3D位置,而后将这些转换到当前帧(相机坐标系下)用于raycasting后并显示


1.4 Raycasting



Listing 3 Raycasting to extract the implicit surface, composite virtual 3D graphics, and perform lighting operations.1: for each pixel u ∈ output image in parallel do# For each pixel in the output image, a ray will be cast from the camera's origin through the pixel, # in parallel, meaning each pixel is processed simultaneously.2: raystart ← back project [u, 0]; convert to grid pos# Compute the starting position of the ray by back-projecting the pixel's coordinates (u, 0) from image space# to the 3D grid (volume) space. This represents the position on the near clipping plane.3: raynext ← back project [u, 1]; convert to grid pos# Compute a second point on the ray by back-projecting the pixel's coordinates (u, 1) from image space# to 3D grid space. This represents a position further along the viewing direction (typically on the far clipping plane).4: raydir ← normalize (raynext − raystart)# Calculate the direction of the ray by subtracting the starting point from the next point # and normalizing the resulting vector.5: raylen ← 0# Initialize the ray length, which will be used to keep track of how far along the ray we have traveled in the 3D grid.6: g ← first voxel along raydir# Determine the first voxel in the 3D grid that the ray intersects. This will be the starting voxel for ray traversal.7: m ← convert global vertex to grid pos# Convert the closest global vertex (from the known surface) to the grid position. This is used to determine# if we need to continue ray traversal or stop and shade the pixel.8: mdist ← ||raystart − m||# Calculate the distance from the starting point of the ray to the nearest vertex.# This distance is used to decide if the ray has reached the surface.9: while voxel g within volume bounds do# While the ray is within the boundaries of the volume (i.e., inside the 3D grid):# This loop traverses the grid along the ray direction.10: raylen ← raylen + 1# Increment the ray length as the ray moves from one voxel to the next.11: gprev ← g# Store the current voxel position before moving to the next one.# This is necessary for detecting zero crossings (surface intersections).12: g ← traverse next voxel along raydir# Move to the next voxel along the ray's direction.13: if zero crossing from g to gprev then# Check if there is a zero crossing between the TSDF values of the current voxel and the previous voxel.# A zero crossing indicates that the ray has intersected with the surface.14: p ← extract trilinear interpolated grid position# Extract the exact intersection point within the grid by performing trilinear interpolation.# This provides a more accurate position of the surface intersection.15: v ← convert p from grid to global 3D position# Convert the interpolated grid position to a global 3D position.# This gives the exact 3D coordinates of the surface point in the world space.16: n ← extract surface gradient as ∇tsdf(p)# Compute the surface normal at the intersection point by calculating the gradient of the TSDF (∇tsdf).# The gradient points in the direction of the steepest increase in the TSDF value, representing the surface normal.17: shade pixel for oriented point (v, n) or# Shade the pixel using the 3D position (v) and the surface normal (n).# This involves computing the pixel's color based on lighting, material properties, and viewing direction.18: follow secondary ray (shadows, reflections, etc)# Optionally, trace secondary rays to account for shadows, reflections, refractions, etc.# This step can enhance the realism of the rendered image by simulating advanced lighting effects.19: if raylen > mdist then# If the ray length exceeds the distance to the nearest vertex (mdist),# this implies that the ray has traveled past the expected surface point without finding a zero crossing.20: shade pixel using inputted maps or# If no zero crossing was detected, use pre-computed maps (e.g., depth maps or normal maps) to shade the pixel.# This fallback ensures that the pixel still gets shaded even if the ray doesn't directly hit the surface.21: follow secondary ray (shadows, reflections, etc)# Optionally, continue with secondary ray tracing for additional effects like shadows and reflections, as in step 18.

1.4 总结一下上述过程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/414635.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

工业储能柜内部运行状态监测装置

工商业储能是用户侧储能的主要应用之一,其核心场景包括峰谷套利、需(容)量管理、应急备电、动态增容和需求侧响应。为了实现这些功能并确保储能系统的安全、可靠与经济运行,储能集成厂家必须关注多个方面,其中储能设备…

WPF ToolkitMVVM IOC IServiceConllection

用微软自带的 IOC 需要安装 using Microsoft.Extensions.DependencyInjection; using System.Configuration; using System.Data; using System.Windows;namespace WpfApp3 {/// <summary>/// Interaction logic for App.xaml/// </summary>public partial class…

BITCN合集(BITCN 、BITCN-GRU、BITCN-BIGRU、BITCN-LSTM、BITCN-BILSTM、BITCN-SVM)

BITCN合集&#xff08;BITCN 、BITCN-GRU、BITCN-BIGRU、BITCN-LSTM、BITCN-BILSTM、BITCN-SVM&#xff09; BITCN合集&#xff08;BITCN 、BITCN-GRU、BITCN-BIGRU、BITCN-LSTM等&#xff09;代码获取戳此处代码获取戳此处代码获取戳此处 BITCN&#xff08;双向时间卷积神经网…

uniapp引入最新版Animate.css及使用示例

亲测可用,不好用请移至评论区揍我 动画库官网:https://animate.style/ cdn地址:https://cdnjs.cloudflare.com/ajax/libs/animate.css/4.1.1/animate.min.css(截至目前最新版为:v4.1.1) 1. 将css下载后导入项目static目录中 2. 重要!修改下载的css文件内容 文件内容如…

vue脚手架路由快速入门

这里写目录标题 路由 router路由插件的引用离线在线CDN 单独路由使用案例项目中如何定义路由1\安装路由2\创建路由文件router.js以及创建相关文件3\应用插件main.js4\实现切换<router-link></router-link>5\展示位置 <router-view></router-view> 嵌套…

在线绘制哑铃图(dumbbell chart)展示基因拷贝数变异(CNV)

导读&#xff1a; 哑铃图的名称来源于其形状&#xff0c;它看起来像一个哑铃&#xff0c;有两个圆形的“重量”在两端&#xff0c;通过一根“杆”连接。常用于展示两个或多个数据集之间的差异。本文介绍了如何使用哑铃图展示基因的拷贝数变异。 Journal of Translational Medi…

UDP简单聊天室创建

目录 一. 服务端模块实现 二. 处理聊天消息模块实现 三. 调用服务端模块实现 四. 客户端模块实现 五. 效果展示 本文介绍了如何用UDP创建一个简单的聊天室。 一. 服务端模块实现 服务端仍然沿用我们前面的思想&#xff08;高内聚低耦合&#xff09;&#xf…

C语言小tip之函数递归

hello&#xff0c;各位小伙伴们今天我们来学习一下函数递归。 什么是函数递归呢&#xff1f;简单来说就是函数自己来调用自己。函数递归的主要思想是把大事化小&#xff0c;递归包含两层方面&#xff1a;1、递推 2、回归 在使用函数递归的时候要注意包含两个限制条件&#…

Linux 软硬连接

1. 硬链接 实际上并不是通过文件名来找到磁盘上的文件&#xff0c;而是通过inode。在linux中可以让多个文件名对应于同一个 inode&#xff0c;而这种方式就是建立硬链接。硬链接是文件系统中的一种链接类型&#xff0c;它创建了文件的一个额外的目录项&#xff0c;但不占用额外…

全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用

SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型&#xff0c;它综合考虑了土壤-水分-大气以及植被间的相互作用&#xff1b;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程&#xff0c;使其能够精确的模拟土壤中水分的运动&#xff0c;而且耦合了W…

EmguCV学习笔记 C# 7.1 角点检测

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。 教程VB.net版本请访问…

Ubuntu22.04安装 docker和docker-compose环境

Docker简介 Docker 是一个开源的应用容器引擎&#xff0c;它使开发者能够打包他们的应用以及依赖包到一个可移植的容器中&#xff0c;然后发布到任何流行的 Linux 机器上&#xff0c;也可以实现虚拟化。容器是完全使用沙箱机制&#xff0c;相互之间不会有任何接口&#xff08;…

蓝色炫酷碎粒子HTML5导航源码

源码介绍 蓝色炫酷碎粒子HTML5导航源码&#xff0c;源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面&#xff0c;重定向这个界面 效果预览 源码获取 蓝色炫酷碎粒…

Halcon提取边缘线段lines_gauss 算子

Halcon提取边缘线段lines_gauss 算子 edges_color_sub_pix和edges_sub_pix两个算子使用边缘滤波器进行边缘检测。还有一个常用的算子lines_gauss算子&#xff0c;也可以用于提取边缘线段&#xff0c;它的鲁棒性非常好&#xff0c;提取出的线段类型是亚像素精度的XLD轮廓。其原…

LLM训练、精调与加速:大型语言模型的高效开发与应用策略

创作不易&#xff0c;您的关注、点赞、收藏和转发是我坚持下去的动力&#xff01; 大家有技术交流指导、论文及技术文档写作指导、项目开发合作的需求可以私信联系我 LLM&#xff08;大型语言模型&#xff09;的训练、精调和加速是当前人工智能研究和应用中的重要话题。下面将…

JVM垃圾判定算法

垃圾收集技术是Java的一堵高墙。Java堆内存中存放着几乎所有的对象实例&#xff0c;垃圾收集器在对堆内存进行回收前&#xff0c;第一件事情就是要确定这些对象中哪些还存活&#xff0c;哪些已经死去&#xff08;即不可能再被任何途径使用的对象&#xff09;。也就是判定垃圾。…

【学习笔记】卫星通信NTN 3GPP标准化进展分析(五)- 3GPP Release19 研究计划

一、引言&#xff1a; 本文来自3GPP Joern Krause, 3GPP MCC (May 14,2024) Non-Terrestrial Networks (NTN) (3gpp.org) 本文总结了NTN标准化进程以及后续的研究计划&#xff0c;是学习NTN协议的入门。 【学习笔记】卫星通信NTN 3GPP标准化进展分析&#xff08;一&#xff…

第二证券:大洗牌!头部券商营收、净利集体下滑

前十券商营收团体下滑&#xff0c;银河证券跌幅最小 新股IPO数量锐减129家至44家&#xff0c;国内证券市场股票基金交易量日均规划 同比下降 6.83%……关于证券公司而言&#xff0c;本年上半年可谓多重要素叠加冲击&#xff0c;成果下滑难以避免。于大多数证券公司而言&#x…

Vue(三)内置指令v-text、html、cloak、once、pre;自定义指令的三种方式、Vue生命周期

文章目录 1. 内置指令1.1 v-text、v-html指令1.2 v-cloak指令1.3 v-once指令1.4 v-pre指令 2. 自定义指令(directives)2.1 函数式2.2 对象式2.3 注意点 3. 生命周期3.1 挂载流程3.2 更新流程3.3 销毁流程 1. 内置指令 1.1 v-text、v-html指令 v-text与v-html都是向所在的节点…

EPLAN中部件库的导入和使用方法

EPLAN中部件库的导入和使用方法 如下图所示,点击工具-----部件------管理, 在弹出的窗口中点击附加------导入, 找到自己需要导入的文件,后缀名为EDZ,点击打开, 如下图所示,勾选"更新已有数据集并添加新建数据集",点击确定, 如下图所示,正在导