2017-06-20 89 views
0

我目前使用Kinect V2將深度圖像數據從一個位置傳輸到另一個遠程位置。我能夠使用C#從Kinect V2中提取深度圖像。現在我希望能夠將此數據發送給遠程用戶,以便遠程用戶可以查看遠程用戶的3D視圖。有沒有人有任何教程或任何有用的指針?將Kinect V2點雲數據發送給遠程用戶

謝謝

+0

你要發送的3D環境評價的點雲? – MIRMIX

+0

我想發送環境中人員的3D視頻(包含深度數據)。這樣遠程用戶可以看到這個3D視頻(包含深度數據)的人 – khadkaboy

回答

0

可以使用OpenKinect-for-Processing庫管理和創建的流媒體直播。您可以保留來自Kinectv2的視頻(或直接生成)視頻。通過使用OpenCV庫方法,您可以從Kinectv2輸出幀生成視頻文件。 OpenKinect for-Processing是用戶友好且易於使用的庫,可在您的瀏覽器上運行。對於快速教程,你可以檢查這個link,並通過這個小的youtube tutorial

現在你可以開始編輯這個代碼示例:

// Daniel Shiffman 
// Kinect Point Cloud example 

// https://github.com/shiffman/OpenKinect-for-Processing 
// http://shiffman.net/p5/kinect/ 

import org.openkinect.freenect.*; 
import org.openkinect.processing.*; 

// Kinect Library object 
Kinect kinect; 

// Angle for rotation 
float a = 0; 

// We'll use a lookup table so that we don't have to repeat the math over and over 
float[] depthLookUp = new float[2048]; 

void setup() { 
    // Rendering in P3D 
    size(800, 600, P3D); 
    kinect = new Kinect(this); 
    kinect.initDepth(); 

    // Lookup table for all possible depth values (0 - 2047) 
    for (int i = 0; i < depthLookUp.length; i++) { 
    depthLookUp[i] = rawDepthToMeters(i); 
    } 
} 

void draw() { 

    background(0); 

    // Get the raw depth as array of integers 
    int[] depth = kinect.getRawDepth(); 

    // We're just going to calculate and draw every 4th pixel (equivalent of 160x120) 
    int skip = 4; 

    // Translate and rotate 
    translate(width/2, height/2, -50); 
    //rotateY(a); 

    // Nested for loop that initializes x and y pixels and, for those less than the 
    // maximum threshold and at every skiping point, the offset is caculated to map 
    // them on a plane instead of just a line 
    for (int x = 0; x < kinect.width; x += skip) { 
    for (int y = 0; y < kinect.height; y += skip) { 
     int offset = x + y*kinect.width; 

     // Convert kinect data to world xyz coordinate 
     int rawDepth = depth[offset]; 
     PVector v = depthToWorld(x, y, rawDepth); 

     stroke(255); 
     pushMatrix(); 
     // Scale up by 200 
     float factor = 200; 
     translate(v.x*factor, v.y*factor, factor-v.z*factor); 
     // Draw a point 
     point(0, 0); 
     popMatrix(); 
    } 
    } 

    // Rotate 
    a += 0.015f; 
} 

// These functions come from: http://graphics.stanford.edu/~mdfisher/Kinect.html 
float rawDepthToMeters(int depthValue) { 
    if (depthValue < 2047) { 
    return (float)(1.0/((double)(depthValue) * -0.0030711016 + 3.3309495161)); 
    } 
    return 0.0f; 
} 

// Only needed to make sense of the ouput depth values from the kinect 
PVector depthToWorld(int x, int y, int depthValue) { 

    final double fx_d = 1.0/5.9421434211923247e+02; 
    final double fy_d = 1.0/5.9104053696870778e+02; 
    final double cx_d = 3.3930780975300314e+02; 
    final double cy_d = 2.4273913761751615e+02; 

// Drawing the result vector to give each point its three-dimensional space 
    PVector result = new PVector(); 
    double depth = depthLookUp[depthValue];//rawDepthToMeters(depthValue); 
    result.x = (float)((x - cx_d) * depth * fx_d); 
    result.y = (float)((y - cy_d) * depth * fy_d); 
    result.z = (float)(depth); 
    return result; 
} 
+0

謝謝。 Processing是一個基於Java的環境。我目前正在使用C#的Unity3D。我想我將無法將其與Unity3D集成。你怎麼看? – khadkaboy

+0

您可以在某處繼續輸出處理代碼,然後將其作爲C#代碼的輸入進行處理。 – MIRMIX