none
[Kinect] カラーマップ座標系→深度の取得方法について RRS feed

  • 質問


  •  毎度お世話になります、yiwata8004です。
     ご拝読ありがとうございます。

     現在、体に張り付けたマーカーの座標を取得するためにKinect+OpenCVを用いています。
     X,Y座標は求められるのですがZ座標(Kinectからの距離)が正しく求められません。

     以下の処理でどこか間違っているところはございますでしょうか?
     また、上記の処理をKinectイベント(30fps)内で行っていますが、次の1.の処理がどうしても時間
     を要するため他のやり方がもしあれば提案して頂けると幸いです。

    【手順】
     1.MapColorFrameToDepthSpace()を呼び出してDepthFrameData[]からDepthSpacePoint[]を取得
     2.マーカーの(X,Y)座標と1.で取得したDepthSpacePoint[]よりマーカーが該当するDepthFrameData[]
      のインデックスを取得
     3.2.で算出したインデックスのDepthFrameDataを返す

     ※DepthFrameData[]:算出済みの深度データ(512x424)
      DepthSpacePointのサイズはFull HD(1920x1080)

     開発環境:VS2013(WPF[C#])
          Kinect V2 + SDK(最新版)
          OpenCV(2.4.10.20150604)

     以上、よろしくお願いします。

    • 移動 星 睦美 2015年8月24日 6:10 .NET Framework 全般 から
    2015年8月22日 23:55

回答


  •  星さん
     
     yiwata8004です。
     早速のレスポンス有難う御座います。

     教えて頂いた海外サイトを拝見しました。
     お陰様であれから見つけた数少ないV2に関する他のサイトも参考にしながら、やり方が大きく外れて
     いない事が確認できました。
     ・・・が、いざ試すと明らかに周りに深度の差がない領域でほぼ静止状態にも関わらず深度が不安定
     (-Infinityも発生)&誤差(50~80㎝)が生じてしまいます。※誤差というより他の場所の深度を抽出している模様

    【手順】
     1. MapColorFrameToDepthSpace()を用いて算出済のDepthFrameData[]よりDepthSpacePoint[]を取得
     2. 1920x1080上にてマーカー座標(x,y)とした時、1.で取得したDepthSpacePoint[]より深度座標は、
       depthX = DepthSpacePoint[x + y * 1920].X;
       depthY = DepthSpacePoint[x + y * 1920].Y;
     3. 2.より深度のインデックスを求めて深度を算出
      深度 = DepthFrameData[depthX + depthY * 512];

     ※DepthFrameData[] :ushort型の算出済み深度データ(512x414)
      DepthSpacePoint[]:DepthSpacePoint型のカラーデータ(1920x1080)

     これまで丸数日間費やして考えていますが、原因が皆目見当がつきません…orz

     今後、Kinectに関する新たな質問は海外のサイトで行おうと思います。

     色々と有難うございました。

     

    • 回答としてマーク 星 睦美 2015年8月26日 5:47
    2015年8月25日 14:10

すべての返信

  • yiwata8004 さん、投稿ありがとうございます。フォーラム オペレーターの星 睦美です。

    日本語のMSDN フォーラムにはKinect 向けのフォーラム カテゴリがないため、ユーザーからの情報が集まりにくいかもしれません。
    英語のMSDN フォーラムにはKinect に関するフォーラムがありますので情報の収集にお役立ていただければ幸いです。

    ・Kinect for Windows SDKs フォーラム(英語)
    http://social.msdn.microsoft.com/Forums/en-US/home?category=kinectsdks

    私のほうでも上記の英語のフォーラムで関連がありそうなスレッドを検索してみました。もし何かyiwata8004 さんの参考になれば幸いです。

    ・Color point to depth Point and vice-versa
    https://social.msdn.microsoft.com/Forums/en-US/89aa1133-96e5-471b-b5c5-7ac919e9239d/color-point-to-depth-point-and-viceversa?forum=kinectv2sdk


    フォーラム オペレーター 星 睦美 - MSDN Community Support

    2015年8月24日 6:43

  •  星さん
     
     yiwata8004です。
     早速のレスポンス有難う御座います。

     教えて頂いた海外サイトを拝見しました。
     お陰様であれから見つけた数少ないV2に関する他のサイトも参考にしながら、やり方が大きく外れて
     いない事が確認できました。
     ・・・が、いざ試すと明らかに周りに深度の差がない領域でほぼ静止状態にも関わらず深度が不安定
     (-Infinityも発生)&誤差(50~80㎝)が生じてしまいます。※誤差というより他の場所の深度を抽出している模様

    【手順】
     1. MapColorFrameToDepthSpace()を用いて算出済のDepthFrameData[]よりDepthSpacePoint[]を取得
     2. 1920x1080上にてマーカー座標(x,y)とした時、1.で取得したDepthSpacePoint[]より深度座標は、
       depthX = DepthSpacePoint[x + y * 1920].X;
       depthY = DepthSpacePoint[x + y * 1920].Y;
     3. 2.より深度のインデックスを求めて深度を算出
      深度 = DepthFrameData[depthX + depthY * 512];

     ※DepthFrameData[] :ushort型の算出済み深度データ(512x414)
      DepthSpacePoint[]:DepthSpacePoint型のカラーデータ(1920x1080)

     これまで丸数日間費やして考えていますが、原因が皆目見当がつきません…orz

     今後、Kinectに関する新たな質問は海外のサイトで行おうと思います。

     色々と有難うございました。

     

    • 回答としてマーク 星 睦美 2015年8月26日 5:47
    2015年8月25日 14:10