首页 > 代码库 > Kienct与Arduino学习笔记(2) 深度图像和真实世界坐标系中的深度图

Kienct与Arduino学习笔记(2) 深度图像和真实世界坐标系中的深度图

转载请注明出处:http://blog.csdn.net/lxk7280


首先,要接触一下KinectOrbit这个摄像机库,这篇文章中有这个库的下载网址和简单的介绍:http://blog.csdn.net/lxk7280/article/details/38184355。将下载得到的文件放到相应的Processing的一个子文件夹后,即可使用。

   KinectOrbit库下的鼠标和键盘的操作方法:
1.右键拖拽:摄像机摇拍。
2.左键拖拽:绕对象旋转。
3.滚动:缩放操作。
4.P键保存,O键退出。再次运行程序后,会以上次保存的试点为开始,视点的参数储存在数据文件夹下的一个名为:“orbitSet_0.csv”的文件里,如果该文件被删除,则以默认值为开始。

    先附上三张这次的效果图:
1.近距离视角


因为Kinect的深度范围和视野角度范围如下:
顏色與深度1.2 ~ 3.6 公尺
骨架追蹤1.2 ~ 3.6 公尺
視野角度水平 57 度、垂直 43 度
我的部分身体在Kinect的深度摄像头所能拍摄到的范围之外,因此在图片中没有显示出来。

2.中等距离视角


很明显能看到我背后的桌子和我的手臂在后面的大大的投影。

3.远距离视角




代码:
第一步:导入自己需要用到的三个库
import processing.opengl.*;
import SimpleOpenNI.*;
import kinectOrbit.*;
第二步:定义对象myOrbit和kinect
KinectOrbit myOrbit;
SimpleOpenNI kinect;
第三步:初始化对象,启动深度摄像头
void setup(){
    size(800,600,OPENGL);
    myOrbit = new KinectOrbit(this,0);
    kinect = new SimpleOpenNI(this);
    kinect.enableDepth();
}
第四步:在3D渲染下,绘点云和视锥(即在屏幕上可见的3D区域。kinect视锥意思为kinect在空间中可以看到的区域。)
void draw(){
    kinect.update();
    background(0);
    
    myOrbit.pushOrbit(this);
    drawPointCloud();
    kinect.drawCamFrustum();
    myOrbit.popOrbit(this);
}
第五步:完成绘点云函数
void drawPointCloud(){
  int[] depthMap = kinect.depthMap();
  int steps = 3;
  int index;
  PVector realWorldPoint;
  
  stroke(255);
  for(int y=0;y < kinect.depthHeight();y += steps){
    for(int x=0;x < kinect.depthWidth();x += steps){
      stroke(kinect.depthImage().get(x,y));
      index = x + y * kinect.depthWidth();
      if(depthMap[index] > 0){
        realWorldPoint = kinect.depthMapRealWorld()[index];
        point(realWorldPoint.x,realWorldPoint.y,realWorldPoint.z);
      }
    }
  } 
}