深度相机Kinect2.0三维点云拼接实验(一)

2023-11-12

摘要

  Kinect2.0是微软推出的一款RGB-D相机,它即支持普通相机的拍摄,也支持脉冲测量深度信息。本系列文章基于该传感器给出基本的环境搭建、原理讲解、点云数据捕捉、拼接等开发源码,当然也会总结经验帮大家排雷避坑。本小节,我们会介绍一下该传感器及其工作原理。

Kinect2.0简介

  本节我们讲解的重点就是下面这个传感器,叫Kinect2.0,从图片上我们可以隐约看到左侧有一个摄像头,那个是它的普通的RGB摄像头,工作的时候采回RGB图像,它的右边也有两个传感器,分别是光脉冲发射和接收,用来感知外界的深度信息,再往右还有红外传感器,可以红外成像(断电状态下看不到,上电后如果电脑上驱动安装成功即可看到)。我们实验中主要用的是它的RGB相机和由光脉冲发送+接收组成的深度相机。
Kinect2.0

工作原理

RGB相机成像原理

  相机将三维世界中的坐标点(单位为米)映射到二维图像平面(单位为像素)的过程能够用一个几何模型进行描述。这个模型有很多种,其中最简单的称为针孔模型。针孔模型是很常用且有效的模型,它描述了一束光线通过针孔之后,在针孔背面投影成像的关系。如下图所示,为相机成像的简化模型,设 O − x y z O-xyz Oxyz为相机坐标系,习惯上我们让 z z z轴指向相机前方, x x x向右, y y y向下。 O O O为摄像机的光心,也是针孔模型中的针孔。现实世界的空间点 P P P,经过小孔 O O O投影之后,落在物理成像平面 上,成像点为 P ′ P' P
在这里插入图片描述

下面对这个简化的模型进行几何建模,设 P P P点的坐标为 ( X , Y , Z ) T (X,Y,Z)^{T} (X,Y,Z)T ,设物理成像平面到小孔的距离为 f f f(焦距)。那么,根据上图右侧的相似三角形关系可得:

Z f = − X X ′ = − Y Y ′ (1) \frac{Z}{f}=-\frac{X}{X^{'}}=-\frac{Y}{Y^{'}} \tag{1} fZ=XX=YY(1)

其中的负号表示成像是倒立的,由于现实中的相机成像的过程中会做进一步的处理使倒立的图像处理为正常的图像,故上式可以做进一步的简化,即:
Z f = X X ′ = Y Y ′ (2) \frac{Z}{f}=\frac{X}{X^{'}}=\frac{Y}{Y^{'}} \tag{2} fZ=XX=YY(2)
整理一下,就可以得到:
{ X ′ = f X Z , Y ′ = f Y Z (3) \begin{cases} X'=f\frac{X}{Z}, \\ Y'=f\frac{Y}{Z} \end{cases} \tag{3} {X=fZX,Y=fZY(3)
上式给出了成像的空间关系,由于实际获取的是一个个的像素点,所以 P ′ P' P会进一步映射到像素坐标系 ,像素坐标系 O − u v O-uv Ouv的定义是:原点 O ′ O' O位于图像的左上角, u u u轴向右与 x x x轴平行, v v v轴向下与 y y y轴平行。像素坐标系与成像平面之间差了一个缩放系数和原点的平移,设像素坐标在 u u u轴上缩放了 α α α倍,在 v v v上缩放了 β β β倍,原点平移了 ( c x , c y ) T (c_x,c_y)^{T} (cx,cy)T 。那么 P ′ P' P的坐标与像素坐标 ( u , v ) T (u,v)^{T} (u,v)T的关系为:
{ u = α X ′ + c x v = β Y ′ + c y (4) \begin{cases} u=\alpha X' + c_x \\ v=\beta Y' + c_y \end{cases} \tag{4} {u=αX+cxv=βY+cy(4)
代入(3)并把 α f \alpha f αf合并为 f x f_x fx,把 β f \beta f βf合并成 f y f_y fy,得:
{ u = f x X Z + c x v = f y Y Z + c y (5) \begin{cases} u=f_x\frac{X}{Z} + c_x \\ v=f_y \frac{Y}{Z} + c_y \end{cases} \tag{5} {u=fxZX+cxv=fyZY+cy(5)
其中 f x f_x fx f y f_y fy的单位为像素,对(5)做进一步的整理,写成矩阵的形式为:
Z ( u v 1 ) = ( f x 0 c x 0 f y c y 0 0 1 ) ( X Y Z ) ≜ K P (6) Z \left( \begin{matrix} u\\ v\\ 1 \end{matrix} \right)= \left( \begin{matrix} f_x & 0 & c_x\\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{matrix} \right) \left( \begin{matrix} X\\ Y\\ Z \end{matrix} \right) \triangleq KP \tag{6} Zuv1=fx000fy0cxcy1XYZKP(6)
(6)中的 K K K称为相机的内参数矩阵,在进行图像拼接的时候,会用到内参数处理捕获的图像生成同一个世界坐标系下的三维点云,然后进行拼接。到此,介绍完了RGB相机的成像原理。

深度相机成像原理

  深度相机是在普通RGB相机的基础上又增加了脉冲光发射器和脉冲光接收器,使其能够主动测量相机正前方的深度信息,其测量的基本原理是飞行时间法(Time-of-Fight, TOF),即相机向目标发射脉冲光,然后根据发送到返回之间的光束飞行时间,确定物体离自身的距离。在测量深度之后,RGB-D相机通常按照生产时的各个相机摆放位置,自己完成深度与彩色图像素之间的配对,输出一一对应的彩色图和深度图。在同一个图像位置,读取到色彩信息和距离信息后,可以计算像素的3D相机坐标,即可生成点云(Point Cloud)数据。
  本文用到的传感器是Kinect2.0,利用上述的ToF原理采集数据,最后经过传感器内部处理可以得到RGB图像和描述深度信息的灰度图像。灰度图像存储的时候每个像素点的灰度值用16位的整型数据描述。在实际的编程中,会借助Open-CV库将采集的RGB图像以PNG格式的图片存储,16bit的灰度图像会以PGM格式的文件存储。

总结

  至此,我们把Kinect2.0的工作原理部分介绍完毕,后面的文章会为大家介绍环境搭建以及代码部分的编写。文章用于学习总结与交流,如有不妥或纰漏,欢迎大家指出!更多学习资料、源码、工具获取,请关注微信公众号 “24K纯学渣”

参考文献

《机器人SLAM十四讲》
Kinect2.0官方手册

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

深度相机Kinect2.0三维点云拼接实验(一) 的相关文章

  • Python 中的标量场可视化

    我需要在 Python 中可视化几个重叠的标量场 我发现mayavi图书馆做这种情节 问题是我不明白如何为标量字段自定义颜色图 我的想法是为每个字段设置一种颜色的阴影 我尝试采用一个例子 http docs enthought com ma
  • 如何在 Three.js 中从三角面获取多边形?

    我在网上查了一下是否有人遇到同样的问题 我正在使用 Three js 我有一个 3DObject 其中可能包含孔 面是三角形的 假设我想从上面看到它 我的目标是获得一个代表顶面周长的多边形 这对我来说意味着不再有三角面 而只有 1 个多边形
  • Unity3D:在 AA 解析后绘制粒子以提高性能

    我正在尝试评估 MSAA 对 Unity 中含有大量粒子的场景的影响 为此 我需要 使用 8x MSAA 绘制场景中的所有非粒子对象 使用上一个通道中解析的深度缓冲区来渲染所有 将非遮挡粒子系统转移到较小的渲染目标上 将 2 的颜色缓冲区与
  • 如何在 GTX 560 及更高版本上使用 OpenGL 进行立体 3D?

    我正在使用在 Windows 7 上运行的开源触觉和 3D 图形库 Chai3D 我重写了该库以使用 Nvidia nvision 执行立体 3D 我将 OpenGL 与 GLUT 一起使用 并使用 glutInitDisplayMode
  • GL_CULL_FACE使所有对象消失

    我正在尝试在 openGL3 3 中创建一些简单的多边形 我有两种类型的对象 具有以下属性 对象 1 10 个顶点 按顺序在下面列出 存储在GL ARRAY BUFFER并使用GL TRIANGLE FAN v x y z w v 0 0
  • 更改 3D 图形颜色 (matplotlib)

    我使用以下代码在 matplotlib 中绘制了 3D 图形 Previously defines lists of data to plot fig plt figure ax fig add subplot 111 projection
  • 在 RGL 中将立方体绘制到 3D 散点图中

    我正在尝试向 3D 散点图添加较小的立方体 网格 具有指定边长 我希望立方体位于原点 我该怎么做呢 我已经玩过cube3d 但我似乎无法将立方体正确定位 也无法使其成为网格 因此我可以看到它包含的数据点 这是我所拥有的 library rg
  • 如何挤出平面 2D 网格并赋予其深度

    我有一组共面 连接的三角形 即二维网格 现在我需要将其在 z 轴上挤出几个单位 网格由一组顶点定义 渲染器通过与三角形数组匹配来理解这些顶点 网格示例 顶点 0 0 0 10 0 0 10 10 0 0 10 0 所以这里我们有一个二维正方
  • 如何在 React Native 中渲染自定义 3D 对象

    我已经成功使用 Three js expo Three 和 expo gl 在 React Native 中配置了红色立方体的 3D 渲染 但我想让用户渲染他们自己可能拥有的自定义 3D 对象 obj 或 mtl 扩展名 但我不确定如何让他
  • 如何将平面上的 3D 点转换为 UV 坐标?

    我有一个 3d 点 定义为 x0 y0 z0 该点属于一个平面 定义为 a b c d normal a b c and ax by cz d 0 如何将 3d 点转换或映射为一对 u v 坐标 这一定是非常简单的事情 但我无法弄清楚 首先
  • 简单模式7公式/例子?

    我最近发现了利用 SNES 模式 7 的伪 3D 效果 并想尝试在 Godot 引擎中复制它 我尝试在网上查找 但所有内容要么以我无法理解的方式解释 要么以我不知道的编程语言解释 我还需要学习如何旋转该区域 并将精灵作为角色或敌人放入 但我
  • 不明确的 OpenGL 默认相机位置

    在我的Opengl程序中 在我应用透视投影矩阵之前 每当我绘制一些对象时 我都会在世界坐标系的原点处绘制它 但是几乎所有Opengl教程都指出相机 我的投影视图 位于原点朝向正 z 轴 这取决于您稍后如何处理投影矩阵中的 z 值 但是如果这
  • WPF 3D - 在复杂几何体上映射渐变画笔

    我想问是否有人知道如何在 WPF 3D 中的复杂对象上映射渐变画笔 结果应该类似于 matlab 中的 3D 图像 例如 3D 函数 假设您有一些想要可视化的 3 维数据 并且想要通过颜色区分某些级别的值 给定一个 GradientBrus
  • 3D 空间中两个盒子之间的交集

    我想为我的图形引擎实现一个碰撞检测系统 我不知道这是否是常见的方法 但我的想法是将任何实体对象 如网格或相机 绑定在 3D 盒子内 这会给我比球体更准确的结果 这个盒子由八个顶点定义 x0 min vertices x off parsin
  • 使用开源 3D 引擎从 Openstreetmap 数据渲染地图? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 从 Openstreetmap 数据渲染 3D 地图可能会很漂亮麻烦的 https gis stack
  • 在 R 中根据时间序列数据制作 3D 曲面

    我有一个大型数据集 我想从中制作 3D 表面 我希望 x 轴为日期 y 轴为时间 24 小时 z 轴 高度 为我的值 我是 R 初学者 所以越简单越好 http www quantmod com examples chartSeries3d
  • 计算任意网格的平面 UV 坐标

    我有从二维形状生成三角形网格的代码 因为在大多数情况下 这些形状在表面上的顶点分布不均匀 所以我在生成 UV 时遇到了问题 这样就不会导致纹理扭曲 任何人都可以推荐一些讨论平面网格上 UV 计算技术的文章 书籍 代码示例吗 谢谢 好的 让我
  • 在 R 中绘制 3D 数据

    我有一个 3D 数据集 data data frame x rep c 0 1 0 2 0 3 0 4 0 5 each 5 y rep c 1 2 3 4 5 5 data z runif 25 min data x data y 0 1
  • 在 3d 网格中转发(绘制)线

    我需要类似 Bresenham 算法的东西 但是 对于 3d 网格空间来说不完全是这样 我需要 3d 单元网格 边缘尺寸 1 0 从 S 点开始 前进到 K 点 接触 该线接触的所有单元格 即使只有边缘 点被触摸我需要触摸所有 8 个单元
  • 透视变换矩阵的计算

    给定 3D 空间中的一个点 如何计算齐次坐标中的矩阵 将该点投影到平面上z d 其中原点是投影中心 好吧 让我们尝试解决这个问题 扩展伊曼纽尔的答案 Assuming如果您的视图向量直接沿着 Z 轴 则所有尺寸都必须按视图平面距离的比例进行

随机推荐

  • CentOS8.4 配置本地yum源

    目录 挂载光盘 清除原仓库配置文件 配置本地仓库配置文件 查询本地已启用的仓库 尝试安装服务 此处以bind服务为例 易错点 下载链接 挂载光盘 root CentOS8 mkdir p mnt dvd root CentOS8 mount
  • 如何在IDEA中创建Web项目

    棒棒有言 也许我一直照着别人的方向飞 可是这次 我想要用我的方式飞翔一次 人生 既要淡 又要有味 凡事不必太在意 一切随缘 缘深多聚聚 缘浅随它去 凡事看淡点看开些 顺其自然 无意于得 就无所谓失 人生 看轻看淡多少 痛苦就远离你多少 本章
  • 强化学习12——动态规划与策略迭代和值迭代

    上一节我们说了马尔可夫决策过程 它是对完全可观测的环境进行描述的 也就是观测到的内容完整决定了决策所需要的特征 马尔可夫决策过程可以用方程组求解简单问题 但是对于复杂一点的问题 一般通过迭代的思想对其进行求解 动态规划是非常有效的求解马尔可
  • 计算着色器中线程的编号

    ID3D11DeviceContext Dispatch Method Execute a command list from a thread group Syntax void Dispatch in UINT ThreadGroupC
  • Rstudio与R的绑定和更新

    遇到新安装的R与Rstudio没有匹配或者想要更改R的版本 一些老的版本的安装包在新版R上可能不适用 可以如下操作 一 Rstudio与R的绑定 1 选择Tools里的Global Options选项 2 选择General更改R vers
  • webpack配置本地TypeScript编译环境和开启本地服务

    目录 1 创建一个文件夹 2 初始化一个package json文件对我们安装包进行记录 3 安装webpack 4 配置webpack config js文件 1 创建一个文件夹 2 初始化一个package json文件对我们安装包进行
  • pip安装pandas总是失败的解决办法

    先卸载numpy和pandas pip uninstall numpy pip uninstall pandas 再重新安装 按numpy pandas的顺序 1 pip install numpy i https pypi douban
  • CXF开发WebService客户端

    开发必备 1 apache cxf 2 2 6 2 spring ws 1 5 8 3 eclipse jee galileo SR1 win32 开发步骤 一 新建一个普通的java工程 名字叫WebService CXF Client
  • Leetcode刷题48-575. 分糖果(C++详细解法!!!)

    题目来源 链接 https leetcode cn com problems distribute candies 575 分糖果 1 问题描述 2 我的解决方案 3 大神们的解决方案 4 我的收获 4 1 set的用法 4 2 map容器
  • ubuntu 安装Android SDK,如何在Ubuntu12.1下安装Android SDK

    如何在Ubuntu12 1下安装Android SDK 在Ubuntu下 安装 Android SDK 有两种方式 1 为使用ADT Eclipse安装 这也是官方推荐的方式 适合使用Eclipse开发的开发者 2 直接安装Android
  • 跨行业数据挖掘过程标准及其在 Python 中的应用

    跨行业数据挖掘过程标准及其在 Python 中的应用 数据挖掘是一种从大量数据中提取有用信息的过程 它在各个行业中都有广泛的应用 为了规范数据挖掘过程 CRISP DM Cross Industry Standard Process for
  • PPP与PPPoe

    PPP 二层最常用的封装技术 PPP共定义了三个协议组件 分别是数据封装方式 链路控制协议 Link Control Protocol LCP 和网络层控制协议 Network Control Protocol NCP 数据封装方式定义了如
  • 详谈概率图模型(PGM)

    概率图 引言 1 概述 2 基本问题 2 1 模型表示 2 1 1 有向图模型 2 1 2 无向图模型 2 1 3 有向图和无向图之间的转化 2 2 学习问题 2 3 推断 引言 quad quad 机器学习是根据一些已观察到的证据 如训练
  • VMware vCenter 7.0U2A升级攻略VMware vCenter 7.0U3C攻略

    一 概述 写这篇文章是因为VMware 7 0U2A之前版本有个bug 用户可根据漏洞 CVE 2021 22005 进行提权443端口 直接访问vCenter 443管理界面 然后想着将VMware 7 0U2A升级至最新版VMware
  • 应急响应思路

    应急响应过程 目的 分析攻击时间 攻击操作 攻击结果 安全修复等并给出合理的解决方案 保护阶段 直接断网 保护现场 看是否能够恢复数据 分析阶段 对入侵过程进行分析 常见方法为指纹库搜索 日志时间分析 后门追查分析 漏洞检查分析等 复现阶段
  • AttributeError: module ‘seaborn‘ has no attribute ‘scatterplot‘

    我找到很多博客 说这是因为seaborn的版本不对 我就去升级seaborn了 发现仍然是报这个错误 经过排查 pip list发现里面有个叫做sns的包 版本是0 1 我是import seaborn as sns了 并不清楚这个sns包
  • 虚机固定IP---小黑日常超细教程

    前言 虚机重启后的ip段不变但是最后的数字有时候是随机的 如需要固定环境的ip则需要更改虚机的配置文件 目录 一 更改配置文件 二 查看自己虚机的网关 三 配置网络工作 四 配置公告的DNS服务 五 关闭防火墙 重启网络服务 一 更改配置文
  • 使用memtier_benchmark工具对Redis进行测试记录-20230330

    文章目录 一 概述 一 安装相关软件 1 安装redis server 2 安装memtier benchmark软件 3 redis的一些基本操作 二 测试步骤 1 准备redis数据 2 启动进程进行测试 3 参数含义解释 三 创建多个
  • 【华为OD机试 2023 B卷

    在线OJ 已购买本专栏用户 请私信博主开通账号 在线刷题 运行出现 Runtime Error 0Aborted 请忽略 华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一
  • 深度相机Kinect2.0三维点云拼接实验(一)

    文章目录 摘要 Kinect2 0简介 工作原理 RGB相机成像原理 深度相机成像原理 总结 参考文献 摘要 Kinect2 0是微软推出的一款RGB D相机 它即支持普通相机的拍摄 也支持脉冲测量深度信息 本系列文章基于该传感器给出基本的