2017-06-20 9 views
0

現在、Kinect V2を使用してある場所から別の場所に奥行き画像データを転送しています。私はC#を使用してKinect V2から奥行き画像を抽出することができます。今、私はこのデータをリモートユーザに送信して、リモートユーザがリモートユーザの3D Viewを見ることができるようにしたいと考えています。誰もチュートリアルや役に立つポインタを持っていますか? Kinect V2ポイントクラウドデータをリモートユーザに送信

あなたは

+0

あなたは、3D enviroinmentの点群を送信しますか? – MIRMIX

+0

環境内の人々の3Dビデオ(深度データ付き)を送信したいと思います。遠隔地のユーザーがこの3Dビデオ(奥行き情報付き)を人の人に見ることができるように – khadkaboy

答えて

0

あなたが管理し、ライブストリーミングを作成するためのOpenKinect-for-Processingライブラリを使用することができますありがとうございました。 Kinectv2のビデオをフレームに保存(または直接生成)することができます。 OpenCVライブラリメソッドを使用すると、Kinectv2出力フレームからビデオファイルを生成できます。 OpenKinect-for-Processingは、ユーザフレンドリーで使いやすいブラウザで、ブラウザ上で動作します。クイックチュートリアルでは、linkを確認して、この小さな壁を見てください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

ありがとう。処理はJavaベースの環境です。現在、C#を使用しているUnity3Dに取り組んでいます。私はそれをUnity3Dと統合することはできないだろうと思う。どう思いますか? – khadkaboy

+0

処理コードの出力をある場所に保存し、それをC#コードへの入力として処理することができます。 – MIRMIX

関連する問題