计算机视觉
图像处理

Kinect运用OpenNI产生点云

点云数据是由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函数:

  1. 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转为实际坐标空间的xy值;围观OpenNI的源码,ConvertProjectToRealWorld函数实现是通过单位换算得到的:

  1. 获得field of view(视角)值:获取horizontal和vertical的的视角值,即Kinect水平和垂直视角;
  2. 单位换算比例:α表示水平视角角度值 、β表示垂直视角角度值,换算关系RealWorldXtoZ=2tan(α/2)  RealWorldYtoZ = 2tan(β/2),即得到了depth map的宽度值w/高度值h与距离d的比值
  3. 求出实际的xy值:NormalizedX = x / outputMode.nXRes – 0.5,即深度图像左侧在x轴负方向上,右侧在x轴正方向上;同样NormalizedY = 0.5 – y / outputMode.nYRes,上侧在y轴正方向上,下侧在y轴负方向上

最后x =  NormalizedX  * Z * RealWorldXtoZ    y  =  NormalizedX  * Z * RealWorldXtoZ

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
欲使用 ConvertProjectiveToRealWorld函数须将projective下(x,y,z)值保存:XnPoint3D *projectivePointCloud = new XnPoint3D [pointNumber]  再将depth map的(x,y)索引对应的像素值保存到projectivePointCloud  ,定义XnPoint3D *realWorldPointCloud = new XnPoint3D [pointNumber] ,利用ConvertProjectiveToRealWorld(pointNumber, projectivePointCloud , realWorldPointCloud )完成Projective到RealWorld的数据转换。
最后就可以利用OpenGL将realWorldPointCloud的点云 进行绘制了…
部分代码如下:
最后看看OpenGL下点云显示效果:..(*^__^*) ..

现在数据还是原始数据,比较粗糙,准备继续研究怎么将数据过滤平滑,让显示更好,呵呵,本身要做的事确是怎么识别手,跟踪手势,当然这是我最终目标了,

代码下载:

!!温馨提示: 此处需要评论本文后才能查看.

转载注明来源:CV视觉网 » Kinect运用OpenNI产生点云

分享到:更多 ()
扫描二维码,给作者 打赏
pay_weixinpay_weixin

请选择你看完该文章的感受:

3不错 0超赞 0无聊 0扯淡 0不解 0路过

评论 3

评论前必须登录!

 

  1. #3

    很强!!!

    mutouren5个月前 (12-05)
  2. #2

    qqqqqqq强强强强

    qqqww111个月前 (05-16)
  3. #1

    111确实不错!

    n3480042951年前 (2018-03-31)