2016-05-12 28 views
2

Unity3Dのシーンで、私はKinectV2の深さ情報を512 x 424で取得しています。これをリアルタイムで512にもなるメッシュに変換していますしたがって、ピクセルデータ(深さ)と頂点(メッシュ)の比率は1:1です。Microsoft Kinect V2 +ユニティ3Dデプス=ワーピング

私の最終目標は、「Microsoft Kinect Studio v2.0」の「モニタ3Dビュー」シーンを深さで作成することです。

私はそれがポイントクラウドの面でうまく機能しています。しかし、私のユニティーシーンには大きな歪みがあります。私はそれが私の数学などにダウンしているかもしれませんが

しかし私はUnityデモkinectのための同じケースが開発キットで提供されていることに気付きました。

ここに明白な何かが欠けているのではないでしょうか?私の各ピクセル(またはこの場合は頂点)は、1行1列にマッピングされます。

シーンにレンダリングする前にデプスフレームからデータを処理する必要があるかどうかわかりません。または、私の部屋の真の表現を得るために逃したいくつかの追加のステップがある場合?このように見えるので、ちょっと球形の効果が今追加されています。

enter image description here

これら2枚の画像は私の部屋のトップダウンショットです。緑色の線は私の壁を表しています。

左側の画像はUnityシーンのKinectで、右側はMicrosoft Kinect Studio内です。色の違いを無視すると、左(Unity)が歪んでいるのに対し、右は線形で完璧です。

特に私が座っている部屋のレイアウトは分かりません:/ Side view too。あなたは左にワーピングを見ることができますか?右側の画像に正しく表示されているように、緑の線を参考にしてください。実際の部屋ではまっすぐです。

enter image description here

良いアイデアを得るために、私のビデオをチェックアウト: https://www.youtube.com/watch?v=Zh2pAVQpkBM&feature=youtu.be

コードのC#

正直に言うと非常にシンプルに。私は、Kinect SDKから直接深度データを取得し、それをZ軸の点群メッシュに配置しています。

//called on application start 
void Start(){ 

    _Reader = _Sensor.DepthFrameSource.OpenReader(); 
    _Data = new ushort[_lengthInPixels]; 
    _Sensor.Open(); 
} 

//called once per frame 
void Update(){ 

    if(_Reader != null){ 

     var dep_frame = _Reader.AcquireLatestFrame(); 
     dep_frame.CopyFrameDataToArray(_Data); 
     dep_frame.Dispose(); 
     dep_frame = null; 

     UpdateScene(); 
    } 
} 

//update point cloud in scene 
void UpdateScene(){ 

    for(int y = 0; y < height; y++){ 

     for(int x = 0; x < width; x++){ 

      int index = (y * width) + x; 
      float depthAdjust = 0.1; 
      Vector3 new_pos = new Vector3(points[index].x, points[index].y, _Data[index] * depthAdjust; 
      points[index] = new_pos; 
     } 
    } 
} 

のKinect APIは、ここで見つけることができます: https://msdn.microsoft.com/en-us/library/windowspreview.kinect.depthframe.aspx

が、おかげで任意のアドバイスをお願い申し上げます!

+0

どのような症状があなたの見て、多分それの周りに集中コードを見て参考になります。 フレームデータを配列に処理し、表示しているビットマップ/イメージに正しく適用する必要があります。 – Sean

+0

@Seanありがとう、私は私のOPに写真を追加しました。 –

答えて

2

Edward Zhangのおかげで、私は間違っていたことを理解しました。

DepthFrameをCameraSpaceにマッピングするためにCoordinateMapperを使用する必要がある場所で、深度ポイントを正しく投影しないのは私にとっては難点です。

現在のところ、私のコードは、遠近法の奥行きカメラを使用するのではなく、直交する深度を想定しています。私はちょうどこれを実現するために必要な:

https://msdn.microsoft.com/en-us/library/windowspreview.kinect.coordinatemapper.aspx

//called once per frame 
void Update(){ 

    if(_Reader != null){ 

     var dep_frame = _Reader.AcquireLatestFrame(); 
     dep_frame.CopyFrameDataToArray(_Data); 
     dep_frame.Dispose(); 
     dep_frame = null; 

     CameraSpacePoint[] _CameraSpace = new CameraSpacePoint[_Data.Length]; 
     _Mapper.MapDepthFrameToCameraSpace(_Data, _CameraSpace); 

     UpdateScene(); 
    } 
} 

//update point cloud in scene 
void UpdateScene(){ 

    for(int y = 0; y < height; y++){ 

     for(int x = 0; x < width; x++){ 

      int index = (y * width) + x; 

      Vector3 new_pos = new Vector3(_CameraSpace[index].X, _CameraSpace[index].Y, _CameraSpace[index].Z; 
      points[index] = new_pos; 
     } 
    } 
} 
関連する問題