Matrice di proiezione da 3d a 2d
-
02-07-2019 - |
Domanda
Ho 3 punti in uno spazio 3D di cui conosco le posizioni esatte. Supponiamo che siano: (x0, y0, z0)
, (x1, y1, z1)
e (x2, y2, z2)
.
Inoltre ho una telecamera che guarda questi 3 punti e conosco le posizioni 2D di quei tre punti sul piano di visualizzazione della telecamera. Ad esempio, (x0, y0, z0)
sarà (x0 ', y0')
e (x1, y1, z1)
sarà essere (x1 ', y1')
e (x2, y2, z2)
sarà (x2 ', y2')
dal punto della videocamera di vista.
Qual è il modo più semplice per trovare la matrice di proiezione che proietterà quei punti 3D in punti 2D sul piano di visualizzazione della telecamera. Non sappiamo nulla sulla posizione della videocamera.
Soluzione
Questo ti dà due serie, ognuna di tre equazioni in 3 variabili:
a*x0+b*y0+c*z0 = x0'
a*x1+b*y1+c*z1 = x1'
a*x2+b*y2+c*z2 = x2'
d*x0+e*y0+f*z0 = y0'
d*x1+e*y1+f*z1 = y1'
d*x2+e*y2+f*z2 = y2'
Usa semplicemente qualsiasi metodo per risolvere equazioni simultanee sia più semplice nella tua situazione (non è nemmeno difficile risolverle "manualmente"). Quindi la tua matrice di trasformazione è solo ((a, b, c) (d, e, f)).
...
In realtà, questo è troppo semplificato e presuppone che una videocamera sia puntata sull'origine del sistema di coordinate 3D e senza prospettiva.
Per la prospettiva, la matrice di trasformazione funziona più come:
( a, b, c, d ) ( xt )
( x, y, z, 1 ) ( e, f, g, h ) = ( yt )
( i, j, k, l ) ( zt )
( xv, yv ) = ( xc+s*xt/zt, yc+s*yt/zt ) if md < zt;
ma la matrice 4x3 è più limitata di 12 gradi di libertà poiché dovremmo avere
a*a+b*b+c*c = e*e+f*f+g*g = i*i+j*j+k*k = 1
a*a+e*e+i*i = b*b+f*f+j*j = c*c+g*g+k*k = 1
Quindi dovresti probabilmente avere 4 punti per ottenere 8 equazioni per coprire le 6 variabili per la posizione e l'angolo della telecamera e 1 in più per il ridimensionamento dei punti di vista 2D poiché saremo in grado di eliminare il "centro" coordinate (xc, yc).
Quindi, se hai 4 punti e trasformi i tuoi punti di vista 2D in modo che siano relativi al centro del display, puoi ottenere 14 equazioni simultanee in 13 variabili e risolverle.
Sfortunatamente, sei delle equazioni non sono equazioni lineari. Fortunatamente, tutte le variabili in quelle equazioni sono limitate ai valori compresi tra -1 e 1, quindi è ancora probabilmente possibile risolvere le equazioni.
Altri suggerimenti
La tua fotocamera ha (almeno) 7 gradi di libertà - 3 per la posizione, 3 per l'orientamento e 1 per FOV. Sono sicuro che qualcuno mi correggerà se sbaglio, ma non sembra che 3 punti siano sufficienti per una soluzione completa.
Per una soluzione generalizzata a questo problema, cerca "Visualizza correlazione" in Graphics Gems II.
Quello che stai cercando si chiama algoritmo di stima della posa. Dai un'occhiata all'implementazione POSIT in OpenCV: http://opencv.willowgarage.com /documentation/c/calib3d_camera_calibration_and_3d_reconstruction.html#posit
Avrai bisogno di quattro o più punti e potrebbero non trovarsi sullo stesso piano.
Un tutorial per questa implementazione è qui: http://opencv.willowgarage.com/wiki/Posit
Attenzione però: nell'esercitazione viene usata una finestra quadrata, quindi tutte le coordinate della vista sono nell'intervallo -1, -1 a 1,1. Questo porta a supporre che dovrebbero essere nel sistema di coordinate della fotocamera (prima della correzione delle proporzioni). Questo non è il caso, quindi se usi una finestra con ad es. un rapporto di formato 4: 3, le coordinate di input devono essere comprese nell'intervallo -1.3333, -1 a 1.3333,1.
A proposito, se i tuoi punti devono si trovano sullo stesso piano, allora puoi anche guardare l'algoritmo CameraCalibration da OpenCV, ma questo è più complicato da configurare e richiede più punti come input . Tuttavia ti fornirà anche le informazioni sulla distorsione e i parametri intrinseci della tua fotocamera.
Non credo che ci siano abbastanza informazioni per trovare una soluzione definitiva. Senza conoscere la posizione della videocamera e senza conoscere il piano di visualizzazione, esiste un numero infinito di matrici in grado di risolvere questo problema.