简体   繁体   English

将深度映射到RGB空间

[英]Map Depth to RGB Space

I'm using the KinectPV2 library which is great but very poorly documented. 我正在使用KinectPV2库,该库虽然很棒,但是文档却很少。

With reference to the example "MapDepthToColor" copied below I'm trying to retrieve the depth for each RGB pixel. 参考下面复制的示例“ MapDepthToColor”,我试图检索每个RGB像素的深度。

Having managed to tweak the original example to map the Depth to RGB space I'm left with a strange duplicated edge (see bottom left image). 在设法调整了原始示例以将Depth映射到RGB空间后,我剩下了一个奇怪的重复边缘(请参见左下图)。

Can someone point out what's going on? 有人可以指出发生了什么吗?

/*
Thomas Sanchez Lengeling.
<a href="http://codigogenerativo.com/" target="_blank" rel="nofollow">http://codigogenerativo.com/</a>

KinectPV2, Kinect for Windows v2 library for processing

Color to fepth Example,
Color Frame is aligned to the depth frame
*/

import KinectPV2.*;

KinectPV2 kinect;

int [] depthZero;

//BUFFER ARRAY TO CLEAN DE PIXLES
PImage depthToColorImg;

void setup() {
  size(1024, 848, P3D);

  depthToColorImg = createImage(512, 424, PImage.RGB);
  depthZero    = new int[ KinectPV2.WIDTHDepth * KinectPV2.HEIGHTDepth];

  //SET THE ARRAY TO 0s
  for (int i = 0; i < KinectPV2.WIDTHDepth; i++) {
    for (int j = 0; j < KinectPV2.HEIGHTDepth; j++) {
      depthZero[424*i + j] = 0;
    }
  }

  kinect = new KinectPV2(this);
  kinect.enableDepthImg(true);
  kinect.enableColorImg(true);
  kinect.enablePointCloud(true);

  kinect.init();
}

void draw() {
  background(0);

  float [] mapDCT = kinect.getMapDepthToColor(); // Size: 434,176 (512*424)

  //get the raw data from depth and color
  int [] colorRaw = kinect.getRawColor(); // Size: 2,073,600 (1920*1080)

  int [] depthRaw = kinect.getRawDepthData(); // 434176

  //clean de pixels
  PApplet.arrayCopy(depthZero, depthToColorImg.pixels);

  int count = 0;
  depthToColorImg.loadPixels();
  for (int i = 0; i < KinectPV2.WIDTHDepth; i++) {
    for (int j = 0; j < KinectPV2.HEIGHTDepth; j++) {

      //incoming pixels 512 x 424 with position in 1920 x 1080
      float valX = mapDCT[count * 2 + 0];
      float valY = mapDCT[count * 2 + 1];


      //maps the pixels to 512 x 424, not necessary but looks better
      int valXDepth = (int)((valX/1920.0) * 512.0);
      int valYDepth = (int)((valY/1080.0) * 424.0);

      int  valXColor = (int)(valX);
      int  valYColor = (int)(valY);

      if ( valXDepth >= 0 && valXDepth < 512 && valYDepth >= 0 && valYDepth < 424 &&
        valXColor >= 0 && valXColor < 1920 && valYColor >= 0 && valYColor < 1080) {
        float col = map(depthRaw[valYDepth * 512 + valXDepth], 0, 4500, 0, 255);
        //color colorPixel = colorRaw[valYColor * 1920 + valXColor]; // This works as intended
        color colorPixel = color(col); // This doesn't
        depthToColorImg.pixels[valYDepth * 512 + valXDepth] = colorPixel;
      } 
      count++;
    }
  }
  depthToColorImg.updatePixels();

  image(depthToColorImg, 0, 424);
  image(kinect.getColorImage(), 0, 0, 512, 424);
  image(kinect.getDepthImage(), 512, 0);

  text("fps: "+frameRate, 50, 50);
}

当前错误的结果

我在这里发布了针对此问题的解决方案: https : //forum.processing.org/two/discussion/comment/95494#Comment_95494

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM