2013-03-13 2 views
4

Joint.Position.XJoint.Position.Y에서 얻은 값을 픽셀 단위로 변환하는 방법을 알고 있습니다.Kinect : Joint.Position.Z를 밀리미터 단위로 변환

void kinectSensor_SkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e) 
    { 
     using (SkeletonFrame skeletonFrame = e.OpenSkeletonFrame()) 
     { 
      if (skeletonFrame != null) 
      { 
       Skeleton[] skeletonData = new Skeleton[skeletonFrame.SkeletonArrayLength]; //conterrà tutti gli skeleton 

       skeletonFrame.CopySkeletonDataTo(skeletonData); 

       Skeleton playerSkeleton = (from s in skeletonData where s.TrackingState == SkeletonTrackingState.Tracked select s).FirstOrDefault(); 

       if (playerSkeleton != null) 
       { 
        Joint rightHand = playerSkeleton.Joints[JointType.HandRight]; 
        Joint leftHand = playerSkeleton.Joints[JointType.HandLeft]; 

        //EDIT: The following formulas used to convert X and Y coordinates in pixels are wrong. 
        //Please, see the answer for details 
        rightHandPosition = new float[] { (((0.5f * rightHand.Position.X) + 0.5f) * (640)), (((-0.5f * rightHand.Position.Y) + 0.5f) * (480)) }; 
        leftHandPosition = new float[] { (((0.5f * leftHand.Position.X) + 0.5f) * (640)), (((-0.5f * leftHand.Position.Y) + 0.5f) * (480)), leftHand.Position.Z }; 
       } 
      } 
     } 
    } 

지금, 내가하고 싶은 것은 (밀리미터) 실제 깊이를 얻을 수있다 Joint.Depth.Z를 사용 : 나는 그것을 할 수있는 예입니다. 앞의 예제를 참조하면, rightHandPositionleftHandPosition에 대해 두 개의 3D 배열을 얻고 싶습니다. 마지막 배열의 깊이는 깊이를 나타냅니다. rightHand.Position.ZleftHand.Position.Z에서 반환 된 값을 밀리미터 단위로 변환하기위한 올바른 공식은 무엇입니까?

편집 : 위의 코드에서 픽셀의 X 및 Y 좌표를 변환하는 데 사용되는 수식이 틀립니다. 제발, 제 대답을 읽어보십시오.

+1

Kinect의 작동 방식에 대해서는 알지 못하지만 게시 한 내용에서 조금 추론 할 수 있습니다. 귀하가 게시 한 것을 판단하여, rightHand (leftHand). Position은 0에서 1로 정규화 된 3D {x, yz,} 값을 제공합니다. 따라서 3D 좌표가 있습니다. 규모를 조정하고 번역해야 할 필요가 있습니다. 0..1 범위 커버리지는 무엇입니까? Kinect가 스캔 한 것의 경계 상자라고 가정합니다. 그 정보를 어딘가에서 쿼리 할 수 ​​있습니까? 그렇다면 각 차원 시간 (끝점 - 시작점)을 곱하고 시작점을 추가하십시오. –

+0

나는 때때로이 값이 1보다 큰 Z에 대한 값을 받기 때문에이 질문을 던졌다. 그게 문제 야.하지만 제안 해 주셔서 감사합니다. –

+0

'Position.Z'에 의해 반환 된 값은 미터 단위입니다. –

답변

8

나는 Joint.Position.XJoint.Position.Y이 -1과 1 사이에 국한되지 않는다는 것을 깨달았습니다.이 잘못된 정보는 인터넷에 널리 퍼져 있기 때문에 이것이 나 자신에게 대답하는 이유입니다. Evil Closet Monkey으로

위 코멘트에 언급 한의 official documentation는 "골격 공간 좌표 미터로 표현된다"고 말했다. 또한 Windows 용 Kinect 팀 구성원 인 this post에 의해 확인되었습니다.

는 X, Y 및 Joint.Position.X, Joint.Position.YJoint.Position.Z 얻을 Z 좌표를 변환하기 위해, 밀리미터, 당신은 단순히 전환이없는과 (또는 당신은 또한 미터에서 일할 수 1000 이러한 값을 분할해야 함을 의미 필요한).

0

앞에서 언급했듯이 위치는 미터로 표시됩니다. 단순히 밀리미터 단위로 미터를 변환하기 위해 1000을 곱하십시오. Conversion According To Google

+0

댓글이어야합니다. –