2009-07-02 19 views
5

Ho un problema di matematica 3D che non riesco a risolvere.Proiezione 3D (triangolo) inversa

Ho dati di 3 punti. Il dato è una (2D) coordinata su un piano, che galleggia da qualche parte nello spazio 3D. Conosco anche la coordinata (2D) della proiezione. Che risulta nella seguente matrice di dati:

[[[x1,y1], [px1,py1], 
[[x2,y2], [px2,py2], 
[[x3,y3], [px3,py3]] 

Dove normale (x1 ecc) coordina rappresentano le coordinate nel piano e l'altro (px1 etc.) per le coordinate proiettate.

Quello che mi piacerebbe fare è proiettare un nuovo Coordinata 2D ([x4, y4]).

.

Quello che ho provato finora:

Naturalmente è necessario un occhio per la proiezione, in modo che ho impostato a [xe, ye, -1]. Il xe e voi siete conosciuti. (Si tratta di foto di riferimento, quindi ho appena posizionato l'occhio al centro della foto.)

Sotto l'occhio ho posizionato la superficie di proiezione (z = 0). Che dà le seguenti coordinate di proiezione:

[[[x1,y1], [px1,py1,0], 
[[x2,y2], [px2,py2,0], 
[[x3,y3], [px3,py3,0]] 

non posso fare lo stesso per le coordinate sul piano, dal momento che non so nulla di quel piano.

Ho anche pensato che potevo fare una formula parametrizzata delle linee che correvano dall'occhio attraverso le coordinate di proiezione. Per linea1 che sarebbe:

line1x = xe+(px1-xe)*t1 
line1y = ye+(py1-ye)*t1 
line1z = -1+t1 // = -1+(0--1)*t1 

Conosco anche la distanza tra i punti in 3D. È lo stesso del 2D. Ciò significa che la distanza tra point1 e point2 sarebbe sqrt ((x1-x2)^2 + (y1-y2)^2).

Conosco anche la distanza tra le linee (riga1 e linea2) in qualsiasi momento. Questo è sqrt ((line1x-line2x)^2 + (line1y-line2y)^2 + (line1z-line2z)^2).

Tuttavia, non so davvero come andare da qui ... O anche se questa è la strada giusta da percorrere.

.

Spero che tu capisca cosa voglio essere in grado di fare e che tu possa aiutarmi.

Grazie in anticipo!

+0

Stai dicendo che ti sono dati tre punti (xn, yn) che vengono proiettati su un piano in punti (pxn, pyn) - e vuoi capire come mappare un nuovo punto (x4, y4) sul aereo? –

+0

Sì, buongiorno, questo è quello che sto dicendo. Tuttavia, quando uso il termine "piano" nella mia domanda, intendo il piano su cui si trovano i punti (xn, yn) (che ritengo sia significativo quando cerco di mappare il quarto punto). Dispiace per la confusione. –

+0

Hai tre punti su un piano (xn, yn) proiettati sul piano di proiezione (pxn, pyn). Questa è anche una proiezione centrale (prospettica), quindi tutti i punti sono proiettati attraverso i raggi da un singolo punto. Vuoi sapere come invertire la proiezione: cioè, se ti viene dato un punto proiettato (px4, py4) come ottenere (x4, y4)?Quello che non capisco è che i tuoi punti originali non hanno alcuna coordinata z di sorta. Perché sono solo x/y - conosci la coordinata z o queste coordinate x/y all'interno del sistema di coordinate del piano ...? –

risposta

1

Scrivi

(x4,y4,1) = A1*(x1,y1,1) + A2*(x2,y2,1) + A3*(x3,y3,1), 

solving per A1, A2, A3. Quindi

(xp4,yp4) = A1*(px1,py1) + A2*(px2,py2) + A3*(px3,py3). 

1a modifica.

(A1, A2, A3) è la soluzione del sistema lineare Mat * (A1, A2, A3) = (x4, y4,1).

 (x1 x2 x3) 
Mat = (y1 y2 y3) 
     ( 1 1 1) 

Questo può essere risolto in modi diversi. Ad esempio utilizzando le regole Cramer's.

2nd edit.

I numeri 1 inseriti non sono coordinate Z, ma estensioni omogenee delle coordinate di input (che devono essere coordinate euclidee). (A1, A2, A3) sono coordinate omogenee nella base formata dai vertici del triangolo.

3rd edit.

La corrispondenza tra il piano 3D e il piano di proiezione è una trasformazione proiettiva. Può essere definito come una matrice 3x3 T che opera su coordinate omogenee nel piano di input (x, y, 1) (nel sistema di coordinate) e produce le coordinate (u, v, t) nel piano di proiezione. Quindi px = u/te py = v/t.

Se un punto ha coordinate omogenee (A1, A2, A3) nella base formata da tre punti del piano di input (non sulla stessa linea), la sua proiezione ha le stesse coordinate omogenee nella base proiettata.

Mi è sembrato abbastanza chiaro 1 ora fa, ma ora sto iniziando a dubitare: forse è necessario un ulteriore paio di punti per avere un'unica soluzione al problema ... Se riesci a trovarlo, hai uno sguardo al libro "Algebraic Projective Geometry" di JG Semple e G.T. Kneebone.

+0

Sembra che potrebbe essere vero ... Ma come faccio a determinare A1, A2 e A3? Grazie! –

+0

Non capisco come sia possibile risolvere questo problema senza un occhio ... La posizione dell'occhio cambierebbe la proiezione, non è vero? –

+0

Se ti posizioni nel sistema di coordinate del piano iniziale, hai perso il piano di proiezione. Non penso che possa essere risolto così facilmente. –

0

Non capisco davvero il problema? Stai cercando di localizzare un oggetto nello spazio 3d che sai si trova su un piano (un muro o un pavimento per esempio) e l'unico input che hai sono 3 punti (di cui conosci le distanze tra nello spazio 3d) da una macchina fotografica?

In questo caso si avranno 3 equazioni come questa dove coordinate locali sono le coordinate punti nello spazio oggetti (fornisce la distanza nota tra i punti) e il mondo è la posizione degli oggetti nello spazio 3d.

cameraCoordinates = world*view*projection*localCoordinates 

Questo produrrà un sistema di equazioni con 6 sconosciuta (rotazione e la posizione in 3d) e 6 equazioni (2 per ogni punto). Sarà comunque non lineare quindi devi risolverlo usando metodi numerici. Prova il metodo Newton Rapson.

2

C'è una funzione Proiezione, che può trasformare i punti in modo che Proiezione ([x1, y1]) = [px1, py1], Proiezione ([x2, y2]) = [px2, py2], Proiezione ([x3 , y3]) = [px3, py3]. Se ho capito bene, l'autore vuole sapere come trovare questa funzione di proiezione, in modo che possa trasnform [x4, y4] in [px4, py4].

Dal momento che abbiamo a che fare con gli aerei qui, la funzione di proiezione si presenta così:

Proj([ix, iy]) : 
    return [ax*ix + bx*iy + cx, 
      ay*iy + by*iy + cy]; 

Utilizzando che possiamo fare 2 sistemi di equazioni da risolvere.

Il primo
x1 * ax + y1 * bx + cx = PX1
x2 * ax + y2 * bx + cx = PX2
x3 * ax + y3 * bx + cx = px3

Risolvendo per ascia, bx e cx ci

ax = (px1 * (y3 - y2) - px2*y3 + px3*y2 + (px2 - px3) * y1)/
    (x1 * (y3 - y2) - x2*y3 + x3*y2 + (x2 - x3) * y1) 
bx = - (px1 * (x3 - x2) - px2*x3 + px3*x2 + (px2 - px3) * x1)/
    (x1 * (y3 - y2) - x2*y3 + x3*y2 + (x2 - x3) * y1) 
cx = (px1 * (x3*y2 - x2*y3) + x1 * (px2*y3 - px3*y2) + (px3*x2 - px2*x3) * y1)/
    (x1 * (y3 - y2) - x2*y3 + x3*y2 + (x2 - x3) * y1) 

dà la seconda x1 * ay + y1 * da + cy = PY1
x2 * ay + y2 * di + cy = PY2
x3 * ay + y3 * da + cy = PY3

Risolvendo per ay, da e cy ci dà

ay = (py1 * (y3 - y2) - py2*y3 + py3*y2 + (py2 - py3) * y1)/
    (x1 * (y3 - y2) - x2*y3 + x3*y2 + (x2 - x3) * y1) 
by = - (py1 * (x3 - x2) - py2*x3 + py3*x2 + (py2 - py3) * x1)/
    (x1 * (y3 - y2) - x2*y3 + x3*y2 + (x2 - x3) * y1) 
cy = (py1 * (x3*y2 - x2*y3) + x1 * (py2*y3 - py3*y2) + (py3*x2 - py2*x3) * y1)/
    (x1 * (y3 - y2) - x2*y3 + x3*y2 + (x2 - x3) * y1) 

Nota : Ho usato this tool per risolvere i sistemi di equazione.

+0

Wow, grazie per la risposta esauriente, tuttavia, penso che questa soluzione sia un po 'losca dato che il metodo che usi non è in realtà correlato alla proiezione. Non c'è, per esempio, nessun occhio. Pertanto dubito che funzionerà correttamente ... Ciononostante, lo proverò sicuramente. Ti farò sapere se ha funzionato. Grazie! –

+0

Questa soluzione non ti darà un occhio o alcuna informazione sul piano del triangolo originale, ma dovrebbe risolvere il tuo problema. –

+0

+1 per indicare un ottimo strumento – PiotrK

0

Un "bit" in ritardo qui, ma la risposta più alta non tiene conto dello spazio 3D del problema. Abbiamo un problema di proiezione prospettica, con tre punti su un piano (in realtà qualsiasi 3 punti 3D) proiettati (come nella geometria proiettiva) sulla superficie di una telecamera.

Non è possibile fornire una soluzione univoca a questo problema (esistono più soluzioni). Il problema generale di trovare una posizione e una posa della telecamera dati 3 punti 3D e le loro rispettive proiezioni in prospettiva 2D possono essere risolti usando l'algoritmo P3P (Perspective-3-Point) dall'originale RANSAC paper, che offre quattro possibili soluzioni possibili (con il punti di fronte alla telecamera).

Data la posa della telecamera, è banale calcolare la proiezione di ulteriori punti del piano.