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

摘要

  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官方手册

  • 0
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用Kinect2.0获取点云的过程可以通过以下步骤实现。首先,需要搭建相应的开发环境,包括安装Windows系统和Visual Studio 2019等软件。可以参考\[2\]中提供的源码和项目模板进行环境搭建。接下来,需要使用Kinect2.0相机进行点云图像的捕获。Kinect2.0是一款RGB-D相机,支持普通相机的拍摄和脉冲测量深度信息。可以参考\[1\]中提供的开发源码,了解Kinect2.0的原理和使用方法。在代码中,可以通过调用相应的函数获取相机的深度信息和RGB图像。最后,可以根据需要对获取的点云数据进行处理和拼接,实现三维点云的应用。 #### 引用[.reference_title] - *1* *2* [深度相机Kinect2.0三维点云拼接实验(四)](https://blog.csdn.net/qq_42144047/article/details/123449528)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Kinect2.0点云数据获取](https://blog.csdn.net/weixin_42651748/article/details/112053649)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值