Kinect 2 Несовместимое чтение FloorClipPlane

Я успешно реализовал плоскость отсечения пола, чтобы измерить расстояние от левой ноги до пола, что довольно точно. У меня проблема в том, что по мере того, как я удаляюсь от камеры (т.е. ось Z левой ноги увеличивается), расстояние до пола меняется (увеличивается).

Примечание. Ни пол, ни подставка для Kinect не наклонены.

Я протестировал его с Kinect 1 и получил тот же результат. Высота головы объекта (ось Y) также изменяется по мере того, как я удаляюсь или приближаюсь к камере. Неважно, наклонена камера или находится в пределах прямой видимости. значение D в уравнении FloorClipPlane показывает постоянное число во время теста.

                    A = bodyFrame.FloorClipPlane.X;
                    B = bodyFrame.FloorClipPlane.Y;
                    C = bodyFrame.FloorClipPlane.Z;
                    D = bodyFrame.FloorClipPlane.W;


        distanceLeftFoot = A * leftFootPosX + B * leftFootPosY + C * leftFootPosZ + D;

Просто чтобы вы знали, у меня есть сопоставление координат между глубиной и цветом. Не уверен, что это как-то связано с проблемой.


person cicsosoft    schedule 05.11.2015    source источник
comment
code double divisor = Math.Sqrt(leftFootPosX * leftFootPosX + leftFootPosY * leftFootPosY + leftFootPosZ * leftFootPosZ); float test=Convert.ToSingle(divisor); distanceLeftFoot = (A * leftFootPosX + B * leftFootPosY + C * leftFootPosZ + D)/ test; Я тоже забыл упомянуть об этом   -  person cicsosoft    schedule 05.11.2015


Ответы (1)


FloorClipPlane выражается в нормальной форме гессиана, как объяснено в документы. В частности, ваши значения A, B и C искажают единичный вектор от начала координат камеры (центр Kinect) до плоскости пола, так что он создает перпендикулярное пересечение с плоскостью пола. D — величина этого вектора (расстояние от начала камеры до плоскости пола).

Даже если вы думаете, что пол плоский, а Kinect параллелен земле, у вас есть проблема искажения перспективы, которая означает, что положение тела (измеряемое в глубине пространства) будет меняться по мере того, как вы будете приближаться и удаляться.

Чтобы исправить это, вам нужно предоставить в качестве входных данных как ваши значения 3D-координат, так и плоскость пола, которые затем вернут вам то, что вы хотите, измеренное расстояние от плоскости пола до сустава:

1

// j is your joint - left foot or any other joint
float x = j.Position.X;
float y = j.Position.Y;
float z = j.Position.Z;
float distance = (Math.Abs((x * floorPlane.X) + (y * floorPlane.Y) + (z * floorPlane.Z) + floorPlane.W))/((float)Math.Sqrt((Math.Pow(floorPlane.X,2)) + (Math.Pow(floorPlane.Y, 2)) + (Math.Pow(floorPlane.Z, 2))));

Я надеюсь, это поможет вам. Не могу более подробно рассказать, какое влияние может оказать ваше отображение от глубины к цвету, не видя, что вы конкретно делаете.

person stoves    schedule 10.08.2016