Joint.Position.X
및 Joint.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
를 사용 : 나는 그것을 할 수있는 예입니다. 앞의 예제를 참조하면, rightHandPosition
및 leftHandPosition
에 대해 두 개의 3D 배열을 얻고 싶습니다. 마지막 배열의 깊이는 깊이를 나타냅니다. rightHand.Position.Z
및 leftHand.Position.Z
에서 반환 된 값을 밀리미터 단위로 변환하기위한 올바른 공식은 무엇입니까?
편집 : 위의 코드에서 픽셀의 X 및 Y 좌표를 변환하는 데 사용되는 수식이 틀립니다. 제발, 제 대답을 읽어보십시오.
Kinect의 작동 방식에 대해서는 알지 못하지만 게시 한 내용에서 조금 추론 할 수 있습니다. 귀하가 게시 한 것을 판단하여, rightHand (leftHand). Position은 0에서 1로 정규화 된 3D {x, yz,} 값을 제공합니다. 따라서 3D 좌표가 있습니다. 규모를 조정하고 번역해야 할 필요가 있습니다. 0..1 범위 커버리지는 무엇입니까? Kinect가 스캔 한 것의 경계 상자라고 가정합니다. 그 정보를 어딘가에서 쿼리 할 수 있습니까? 그렇다면 각 차원 시간 (끝점 - 시작점)을 곱하고 시작점을 추가하십시오. –
나는 때때로이 값이 1보다 큰 Z에 대한 값을 받기 때문에이 질문을 던졌다. 그게 문제 야.하지만 제안 해 주셔서 감사합니다. –
'Position.Z'에 의해 반환 된 값은 미터 단위입니다. –