Я экспериментирую с API kinect, и я пытаюсь (и не могу) добиться следующего:
начиная я получаю данные скелета от kinect и вычисляю расстояние правой руки пользователя от kinect
mRightHandPosition = skeletonFrame.SkeletonData[i].SkeletonPositions[NUI_SKELETON_POSITION_HAND_RIGHT];
distance = sqrt(pow(mRightHandPosition.x, 2) + pow(mRightHandPosition.y, 2) + pow(mRightHandPosition.z, 2));
Я преобразовываю данные скелета правой руки в данные глубины, чтобы получить положение руки на изображении (глубина/цвет).
FLOAT curRightX = 0, curRightY = 0;
Vector4 pixelInSkeletonSpace;
NuiTransformSkeletonToDepthImage(mRightHandPosition, &curRightX, &curRightY, cDepthResolution);
получив положение пикселя руки, я хочу преобразовать этот пиксель обратно в данные скелета и снова вычислить расстояние объекта в этом пикселе (руке) от kinect. Я бы предположил, что это должно дать мне примерно то же расстояние, что и раньше (конечно, с небольшой погрешностью), но это не так. Вот что я делаю:
//the position of the depth pixel in the mLockedRect.pBits array
//i have set the depth sensor resolution to 320x240
int pixelPosition = 2 * ((int)curRightX + (int)curRightY * 320);
USHORT p;
//convert the two consecutive bytes to USHORT
p = (((unsigned short)mLockedRect.pBits[pixelPosition]) << 8) | mLockedRect.pBits[pixelPosition + 1];
//get the pixel in skeleton space
pixelInSkeletonSpace = NuiTransformDepthImageToSkeleton(LONG(curRightX), LONG(curRightY), p, cDepthResolution);
//calculate again the distance (which turns out completely wrong)
distance = sqrt(pow(pixelInSkeletonSpace.x, 2) + pow(pixelInSkeletonSpace.y, 2) + pow(pixelInSkeletonSpace.z, 2));
я пропустил что-то очевидное? заранее спасибо