点云数据是由depthmap得到,利用OpenNI中depthgenerator node获取depth map,再将depth map转为real world的坐标值。
OpenNI的depth map的像素值代表的是实际空间位置到Kinect所在平面的深度值,即到该Kinect平面的距离,单位为mm;
利用DepthGenerator 中GetDepthMap或者getMetaData均可获得深度图像的像素值;GetMetaData函数是将像素值填充到DepthMetaData的对象中,GetDepthMap是直接读取像素值。
XnPoint3D是保持类型为float的x、y、z的结构,为将像素值转为点云,须利用DepthGenerator的ConvertProjectToRealWorld函数:
XnStatus ConvertProjectiveToRealWorld (XnUInt32 nCount, const XnPoint3D aProjective[], XnPoint3D aRealWorld[]) const
其中nCount表示点数数目,aProjective表示投影坐标下所有(x,y,z)的值,aRealWorld表示实际空间坐标值,该坐标系的坐标原点是:depth map的中心投影到Kinect所在平面上的点。x-y平面即为Kinect所在平面:
z轴方向代表了Kinect镜头所对方向。OpenNI获得的深度值即为实际坐标空间的z值,也就是通过ConvertProjectToRealWorld函数是不改变z值得,x,y是depth map的索引位置(x:为column y:为row),须将x,y转为实际坐标空间的x,y值;围观OpenNI的源码,ConvertProjectToRealWorld函数实现是通过单位换算得到的:
- 获得field of view(视角)值:获取horizontal和vertical的的视角值,即Kinect水平和垂直视角;
- 单位换算比例:α表示水平视角角度值 、β表示垂直视角角度值,换算关系RealWorldXtoZ=2tan(α/2) RealWorldYtoZ = 2tan(β/2),即得到了depth map的宽度值w