深度相机Kinect2.0三维点云拼接实验(一)
摘要
Kinect2.0是微软推出的一款RGB-D相机,它即支持普通相机的拍摄,也支持脉冲测量深度信息。本系列文章基于该传感器给出基本的环境搭建、原理讲解、点云数据捕捉、拼接等开发源码,当然也会总结经验帮大家排雷避坑。本小节,我们会介绍一下该传感器及其工作原理。
Kinect2.0简介
本节我们讲解的重点就是下面这个传感器,叫Kinect2.0,从图片上我们可以隐约看到左侧有一个摄像头,那个是它的普通的RGB摄像头,工作的时候采回RGB图像,它的右边也有两个传感器,分别是光脉冲发射和接收,用来感知外界的深度信息,再往右还有红外传感器,可以红外成像(断电状态下看不到,上电后如果电脑上驱动安装成功即可看到)。我们实验中主要用的是它的RGB相机和由光脉冲发送+接收组成的深度相机。
工作原理
RGB相机成像原理
相机将三维世界中的坐标点(单位为米)映射到二维图像平面(单位为像素)的过程能够用一个几何模型进行描述。这个模型有很多种,其中最简单的称为针孔模型。针孔模型是很常用且有效的模型,它描述了一束光线通过针孔之后,在针孔背面投影成像的关系。如下图所示,为相机成像的简化模型,设
O
−
x
y
z
O-xyz
O−xyz为相机坐标系,习惯上我们让
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=−X′X=−Y′Y(1)
其中的负号表示成像是倒立的,由于现实中的相机成像的过程中会做进一步的处理使倒立的图像处理为正常的图像,故上式可以做进一步的简化,即:
Z
f
=
X
X
′
=
Y
Y
′
(2)
\frac{Z}{f}=\frac{X}{X^{'}}=\frac{Y}{Y^{'}} \tag{2}
fZ=X′X=Y′Y(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
O−uv的定义是:原点
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}
Z⎝⎛uv1⎠⎞=⎝⎛fx000fy0cxcy1⎠⎞⎝⎛XYZ⎠⎞≜KP(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官方手册
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?