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