Sto cercando di ottenere una stima di posa globale da un'immagine di quattro fiduciali con posizioni globali note utilizzando la mia webcam.Stima di posa della telecamera (OpenCV PnP)
Ho controllato molte domande di stackexchange e alcuni documenti e non riesco a trovare una soluzione corretta. I numeri di posizione che ottengo sono ripetibili ma in nessun modo linearmente proporzionali al movimento della fotocamera. Per tua informazione sto usando C++ OpenCV 2.1.
At this link is pictured i miei sistemi di coordinate e i dati di test utilizzati di seguito.
% 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]
Finora, qualcuno può vedere niente di sbagliato con questi numeri? Lo apprezzerei se qualcuno li controllasse ad esempio MatLAB (il codice sopra è m-file friendly).
Da questo punto, non sono sicuro di come ottenere la posa globale da rMat e tVec. Da quello che ho letto in this question, per ottenere la posa da RMAT e TVEC è semplicemente:
position = transpose(rMat) * tVec % matrix multiplication
Tuttavia ho il sospetto da altre fonti che ho letto non è così semplice.
Per ottenere la posizione della telecamera in coordinate del mondo reale, cosa devo fare? Siccome non sono sicuro che questo sia un problema di implementazione (comunque molto probabilmente un problema di teoria) mi piacerebbe per qualcuno che ha usato con successo la funzione solvePnP in OpenCV per rispondere a questa domanda, anche se qualsiasi idea è ben accetta!
Grazie mille per il vostro tempo.
si è dimenticato di invertire TVEC. Quindi il modo giusto per farlo è -transpose (rMat) * tVec – Vlad