深度相机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三维点云拼接实验(一) 的相关文章

  • 如何将 Blender 3D 动画导入 iPhone OpenGL ES?

    我正在尝试使用 OpenGL ES 在 iPhone 上制作动画 我能够在 Blender 3D 软件中制作动画 我可以将 Blender 导出为 obj 文件到 OpenGL 并且它可以在 iPhone 上运行 但我无法将我的动画作品从
  • glkView:drawInRect: 和 glkViewControllerUpdate: 之间的区别? OpenGL ES 2 - iOS

    在我的渲染循环中 这两种方法之间的目的应该有什么区别 苹果有话要说 关于更新 视图控制器调用其委托的 glkViewControllerUpdate 方法 您的代理应该更新不涉及将结果渲染到屏幕的帧数据 关于绘制矩形 GLKView 对象使
  • 无法加速像素修改的 BufferedImages

    很长一段时间 1 2个月 我一直在试图找到这个特定问题的答案 我无法让我的图像硬件加速 我一直在网上搜索 创建了自己的方法 用键盘敲击我的头 仍然感到疼痛 但没有成功 尽管我讨厌 Java SDK 以外的库 但我尝试了 LWJGL 和 JO
  • 操作系统如何在屏幕上绘制窗口?

    经过多年的计算机使用和编程 我意识到实际在屏幕上绘制的软件堆栈对我来说基本上是一个谜 我曾研究过一些嵌入式 LCD GUI 应用程序 我认为这为简化堆栈提供了一些线索 但对于 Windows 操作系统之类的东西的整体情况仍然模糊 据我所知
  • Python openAL 3D 声音

    我刚刚开始使用 python 正在制作音频操作程序 我正在尝试在我的 python 应用程序中使用 openAL 实现 3D 声音 但我只能让它工作 这是我的 3D 声音代码 from openal loaders import load
  • 使用四元数进行 OpenGL 旋转[重复]

    这个问题在这里已经有答案了 因此 我正在编写一个程序 其中对象以 spacesim 方式移动 以便学习如何在 3D 空间中平滑地移动对象 在对欧拉角进行了一番研究之后 它们似乎并不真正适合任意方向上的自由形式 3D 运动 因此我决定继续使用
  • 给定一个 4x4 齐次矩阵,我如何获得 3D 世界坐标?

    所以我有一个正在旋转然后再次平移和旋转的对象 我将这些翻译的矩阵存储为对象成员 现在 当我进行对象拾取时 我需要知道该对象的 3D 世界坐标 目前我已经能够像这样获得物体的位置 coords 0 finalMatrix 12 坐标 1 最终
  • 如何在 Android 上将 2D 图像转换为 3D? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我需要将 2D 图像显示为 3D 图
  • 实现3d索贝尔算子

    我目前正在研究从包含体素的 MRI 数据量中去除不均匀性 我想在这些体积上应用索贝尔运算符来找到梯度 我熟悉二维索贝尔掩模和二维图像的邻域 索贝尔面具 1 2 1 0 0 0 1 2 1 1 0 1 2 0 2 1 0 1 x y 的邻域
  • 从绘图 3d 图中抓取相机位置

    我正在绘制 3D 图形并想要调整相机位置 对我来说最好的方法是使用查看器 根据需要缩放和旋转场景 然后以 JSON 形式获取相机位置并将其放入我的脚本中 该脚本生成图片以默认实现相同的位置 根据这条推文 https twitter com
  • 如何在 JavaFX 中将 GUI 覆盖到 3D 场景上?

    我在 JavaFX 中有一个 3D 场景 需要在 3D 场景上覆盖 GUI 我尝试向场景添加按钮和文本 但它们始终作为 3D 对象出现在 3D 视图中 我环顾四周 没有找到该怎么做 唯一的解决方法是创建一个全新的窗口并将设置放在那里 但在这
  • 使用 3d 变换矩阵

    在人工智能课程中 我们有一个机器人 它的手臂有 7 个关节 每个关节可以向不同的方向旋转 我需要知道最后的结局在哪里 我一直在尝试进行 3d 矩阵乘法 它适用于一个关节 但一旦我添加另一个关节 它就与我使用 Java3D api 制作的模型
  • 3D 哪个更快? Perlin 噪声还是 Simplex 噪声?

    好吧 网上有很多 Perlin 噪声和 Simplex 噪声之间的比较 但我真的找不到一个对三个维度进行简单处理时间比较的地方 这是我最感兴趣的 我读过那个流行的PDF http webstaff itn liu se stegu simp
  • 3d 表面的凸包算法 z = f(x, y)

    我有一个以一组三元组 x i y i z i 形式给出的 3D 表面 其中 x i 和 y i 大致位于网格上 并且每个 x i y i 都有一个关联的 z i 值 典型的网格是20x20 我需要在给定的公差范围内找到哪些点属于曲面的凸包
  • Blender 与 Unity [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • DirectX Release 构建可以通过 VS2010 运行,但不能运行 exe

    我已经通过 Google 访问 Stack Overflow 几年了 但到目前为止还没有询问 回答任何问题 所以就到这里吧 基本上 我有一个在 DirectX 11 中设置绘图模型和地形的 3D 渲染框架 一切正常 通过 Visual St
  • 自动适合衣服的算法?

    想象一下 客户要求您设计一款软件 以满足一些相当粗略的规格 如下所示 1 它将面向时尚行业营销 2 用户将是 设计衣服和东西 的人 可能有一个特定的术语 但我没有想到 3 由于各种原因 能够快速制作原型设计并查看它们在模型上的外观会很有用
  • 如何创建热图来说明控制发散调色板中心颜色位置的网格差异?

    我有两个人脸 3D 网格 我希望使用热图来说明差异 我想使用红蓝发散色阶 我的数据可以查到here https github com Patricklv How to create heatmap illustraing 3D mesh d
  • 如何在 GTX 560 及更高版本上使用 OpenGL 进行立体 3D?

    我正在使用在 Windows 7 上运行的开源触觉和 3D 图形库 Chai3D 我重写了该库以使用 Nvidia nvision 执行立体 3D 我将 OpenGL 与 GLUT 一起使用 并使用 glutInitDisplayMode
  • 在球体边缘绘制点

    因此 来自 Flash 背景的我对一些简单的 2D 三角函数有很好的理解 在带有 I 圆的二维中 我知道使用给定角度和半径将项目放置在边缘上的数学 x cos a r y sin a r 现在 如果我在 3d 空间中有一个点 我知道球体的半

随机推荐

  • 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相机 它即支持普通相机的拍摄 也支持脉冲测量深度信息 本系列文章基于该传感器给出基本的