Kamera-pose-Schätzung (OpenCV PnP)

Ich versuche, ein globaler pose-Schätzung von einem Bild von vier bestimmten Merkmalen ermittelt, die mit bekannten globalen Positionen mit meiner webcam.

Ich habe viele stackexchange Fragen und ein paar Papiere, und ich kann nicht scheinen, um eine korrekte Lösung. Die position zahlen, die ich tun, um wiederholbar sind, aber in keiner Weise Linear proportional zu der Bewegung der Kamera. FYI ich bin mit C++, OpenCV 2.1.

Unter diesem link abgebildet ist, meine Koordinatensystemen und den test verwendeten Daten unten.

% 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]

So weit, kann jeder sehen, nichts falsch mit diesen zahlen? Ich würde es schätzen, wenn jemand überprüfen würden Sie zum Beispiel MatLAB (code oben ist m-Datei freundlich).

Ab diesem Punkt bin ich nicht sicher, wie man die Globale pose aus rMat und tVec.
Von dem, was ich gelesen habe diese Frage, um die pose aus rMat und tVec ist einfach:

position = transpose(rMat) * tVec   % matrix multiplication

Aber ich vermute aus anderen Quellen, die ich gelesen habe ist es nicht so einfach.

, Um die position der Kamera in der realen Welt-Koordinaten, was muss ich tun?
Als ich bin nicht sicher, ob dies eine Implementierung problem (aber wahrscheinlich ein Theorie-problem) ich würde gerne für jemanden, der hat die solvePnP Funktion erfolgreich in OpenCV um diese Frage zu beantworten, obwohl alle Ideen sind auch willkommen!

Danken Ihnen sehr für Ihre Zeit.

  • haben Sie vergessen, inverse tVec. Also der richtige Weg, dies zu tun ist -transponieren(rMat) * tVec
InformationsquelleAutor Gouda | 2013-04-28
Schreibe einen Kommentar