Szacowanie położenia kamery (OpenCV PnP)

Próbuję uzyskać globalną ocenę pozy z obrazu czterech fiducjalistów o znanych pozycjach globalnych za pomocą mojej kamery internetowej.

Sprawdziłem wiele pytań na temat stackexchange i kilka artykułów i nie mogę znaleźć poprawnego rozwiązania. Numery pozycji, które wydostałem, są powtarzalne, ale w żaden sposób nie są liniowo proporcjonalne do ruchu kamery. FYI Używam C ++ OpenCV 2.1.

Na tym łączu jest zdjęcie moje układy współrzędnych i dane testowe użyte poniżej.

% Input to solvePnP():
imagePoints =     [ 481, 831; % [x, y] format
                    520, 504;
                   1114, 828;
                   1106, 507]
objectPoints = [0.11, 1.15, 0; % [x, y, z] format
                0.11, 1.37, 0; 
                0.40, 1.15, 0;
                0.40, 1.37, 0]

% camera intrinsics for Logitech C910
cameraMat = [1913.71011, 0.00000,    1311.03556;
             0.00000,    1909.60756, 953.81594;
             0.00000,    0.00000,    1.00000]
distCoeffs = [0, 0, 0, 0, 0]

% output of solvePnP():
tVec = [-0.3515;
         0.8928; 
         0.1997]

rVec = [2.5279;
       -0.09793;
        0.2050]
% using Rodrigues to convert back to rotation matrix:

rMat = [0.9853, -0.1159,  0.1248;
       -0.0242, -0.8206, -0.5708;
        0.1686,  0.5594, -0.8114]

Jak dotąd,czy ktoś może zobaczyć coś złego w tych liczbach? Byłbym wdzięczny, gdyby ktoś sprawdził je na przykład w MatLAB (powyższy kod jest przyjazny dla plików m).

Od tego momentu nie jestem pewien, jak uzyskać globalną pozę od rMat i TVec. Z tego, co przeczytałemto pytanie, aby uzyskać pozę od rMat i TVec jest po prostu:

position = transpose(rMat) * tVec   % matrix multiplication

Podejrzewam jednak, że z innych źródeł, które przeczytałem, nie jest to takie proste.

Aby uzyskać pozycję kamery w rzeczywistych współrzędnych, co muszę zrobić? Ponieważ nie jestem pewien, czy jest to problem z implementacją (choć najprawdopodobniej jest to problem teoretyczny), chciałbym, aby ktoś, kto z powodzeniem użył funkcji resolvePnP w OpenCV, odpowiedział na to pytanie, chociaż wszelkie pomysły są również mile widziane!

Dziękuję Ci bardzo za Twój czas.

questionAnswers(3)

yourAnswerToTheQuestion