深度相机Kinect2.0三维点云拼接实验(三)
概要
Kinect2.0是微软推出的一款RGB-D相机,它即支持普通相机的拍摄,也支持脉冲测量深度信息。本系列文章基于该传感器给出基本的环境搭建、原理讲解、点云数据捕捉、三维点云拼接等开发源码,当然也会总结经验帮大家排雷避坑。本小节介绍相机外部参数相关的理论,为后续文章打基础。
刚体空间旋转的描述
在深度相机Kinect2.0三维点云拼接实验(一)的式(6)中, P P P是在相机坐标系下的坐标,由于拼接的两幅图像是相机不同的姿态进行获取的,所以在进行拼接的时候需要通过相机的姿态信息把图像变换到同一坐标系下进行处理,所以需要一种数据格式用来描述相机坐标系的变换。描述相机在三维空间运动的数据格式有很多种比如:旋转矩阵、旋转向量、欧拉角、四元数等。这里讨论计算机易于存储的四元数格式和易于计算的旋转矩阵格式以及它们之间的相互变换,为之后的点云拼接作铺垫。
旋转矩阵
旋转矩阵是在乘以一个向量的时候有改变向量的方向但不改变大小的效果并保持了手性的矩阵。由于推导过程比较繁琐,这里我们直接给出三维空间内绕xyz三个轴旋转时的旋转矩阵,如下图所示:
如果是反向旋转,就是相应旋转矩阵的逆矩阵,由于旋转矩阵是正交矩阵,也就是相应的旋转矩阵的转置矩阵。坐标系的正向旋转实际就是该坐标系里的向量绕相应的轴做反向旋转,根据上面的结论,也就是三个向量的旋转矩阵的转置矩阵。坐标系的反向旋转时正向旋转下的转置,与向量绕轴正向旋转一样。
PS: 旋转矩阵的推导,推荐3维旋转矩阵推导与助记这篇文章讲的很棒!
欧拉角
欧拉角也是一种表示三维旋转的描述方法,欧拉角的计算需要借助旋转矩阵,它的描述方式是按照绕三个轴的旋转的角度进行表示,设绕 x , y , z x,y,z x,y,z轴的旋转角度分别为 α , β , γ \alpha,\beta,\gamma α,β,γ,假设描述一个刚体旋转按照 X Y Z XYZ XYZ次序的一组欧拉角为 ( α 0 , β 0 , γ 0 ) T (\alpha_{0}, \beta_{0}, \gamma_{0})^T (α0,β0,γ0)T,同理,别的次序也一样,一共有六种次序,即:XYX、XYZ、YXZ、YXY、ZXY、ZYX。一般我们确定下描述的次序,那么就可以用三个角度来描述刚体的旋转。
四元数
旋转矩阵用矩阵的方式描述旋转便于计算机运算,但是如果按照旋转矩阵存储则会显得冗余,考虑到单位复数可以描述二维平面的旋转,那么在三维空间中可以用类似于复数的形式描述旋转,即单位四元数,它只有四个数即可描述刚体的旋转信息,所以非常适合计算机存储。四元数的格式为:
q
⃗
=
w
+
x
i
+
y
j
+
z
k
\vec{q} = w+xi+yj+zk
q=w+xi+yj+zk
假设某个旋转绕单位向量 n ⃗ = ( x 0 , y 0 , z 0 ) T \vec{n}= (x_0,y_0,z_0)^T n=(x0,y0,z0)T进行了角度为 的旋转,那么用四元数可以表示为:
q ⃗ = ( c o s θ 2 , n x s i n θ 2 , n y s s i n θ 2 , n z s i n θ 2 ) T \vec{q} = (cos\frac{\theta}{2},n_xsin\frac{\theta}{2},n_yssin\frac{\theta}{2},n_zsin\frac{\theta}{2})^T q=(cos2θ,nxsin2θ,nyssin2θ,nzsin2θ)T
刚体空间平移的描述
刚体空间的平移可以用方向+距离的方式进行描述,在 O − x y z O-xyz O−xyz空间中,用一个向量 n ⃗ = ( x 0 , y 0 , z 0 ) \vec{n}= (x_0,y_0,z_0) n=(x0,y0,z0)的方向表示平移的方向,用它的模长表示平移的距离,即距离 L = x 0 2 + y 0 2 + z 0 2 L=\sqrt{{x_0}^2+{y_0}^2+{z_0}^2} L=x02+y02+z02。
总结
获取相机外部参数的传感器有很多,如里程计、陀螺仪等,只有获取相机外参我们才知道拍摄的角度,这在后面的图像拼接非常重要。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?