2012-02-11 12 views
5

Sto adattando un piano a un set di punti 3D con il metodo dei minimi quadrati. Ho già un algoritmo per farlo, ma voglio modificarlo per usare il minimo ponderato quadrato. Significato Ho un peso per ogni punto (il peso più grande, più vicino l'aereo dovrebbe essere al punto).Minimo quadrato ponderato: adattare un piano al set di punti 3D

L'algoritmo corrente (senza peso) si presenta come segue:

calcolare la somma:

for(Point3D p3d : pointCloud) { 
    pos = p3d.getPosition(); 
    fSumX += pos[0]; 
    fSumY += pos[1]; 
    fSumZ += pos[2]; 
    fSumXX += pos[0]*pos[0]; 
    fSumXY += pos[0]*pos[1]; 
    fSumXZ += pos[0]*pos[2]; 
    fSumYY += pos[1]*pos[1]; 
    fSumYZ += pos[1]*pos[2]; 
} 

che compensare le matrici:

double[][] A = { 
    {fSumXX, fSumXY, fSumX}, 
    {fSumXY, fSumYY, fSumY}, 
    {fSumX, fSumY, pointCloud.size()} 
}; 

double[][] B = { 
    {fSumXZ}, 
    {fSumYZ}, 
    {fSumZ} 
}; 

che risolvere Ax = B e 3 componenti della soluzione sono i coefficienti della pianura montata ...

S o, per favore, aiutami a modificarlo per usare i pesi? Grazie!

+4

CRONACA - se si può avere un sacco di punti (> dire 20) e/o le coordinate avere un grande offset, non mai calcolare le statistiche il modo in cui si sta facendo (prendendo le somme dei quadrati della posizione grezzo) - ha scarsa sensibilità agli errori numerici. Come minimo, è possibile sottrarre prima il valore medio delle coordinate X/Y/Z, quindi eseguire l'elaborazione, quindi aggiungere di nuovo gli offset. Esistono altri modi specifici per l'algoritmo, ma non capisco esattamente in che modo l'algoritmo utilizza i minimi quadrati, quindi non può aiutare di più. –

+0

Cosa intendi per offset? (scusa, non capisco in questo contesto). –

+2

Esempio rapido: punti p1 = (10001, 10002, 10003), p2 = (10005, 10006, 10007), p3 = (10009, 10004, 10008). Questi hanno valori medi di (10005, 10004, 10006). Quindi, offset (tradurre) le coordinate del punto per l'opposto di questa quantità per ottenere p1 '= (-4, -2, -3), p2' = (0,2,1), p3 '= (4,0, 2). Quindi fai i conti, quindi aggiungi l'offset. –

risposta

10

intuizione

Un punto x su un piano definito dalla normale n e un punto sul piano p obbedisce: n.(x - p) = 0. Se un punto non giace sul piano, n.(y -p) non sarà uguale a zero, quindi un modo utile per definire un costo è |n.(y - p)|^2. Questa è la distanza quadrata del punto y dall'aereo.

Con pesi uguali, si vuole trovare un n che minimizza l'errore quadratico totale quando sommando sui punti:

f(n) = sum_i | n.(x_i - p) |^2 

Ora, questo presuppone che sappiamo un certo puntop che giace sul piano. Possiamo facilmente calcolarne uno come centroide, che è semplicemente la media componente dei punti nella nuvola di punti e giacerà sempre sul piano dei minimi quadrati.

Soluzione

Definiamo una matrice M cui ogni riga è il ith punto x_i meno il baricentro c, siamo in grado di ri-scrittura:

f(n) = | M n |^2 

si dovrebbe essere in grado di convincere te stesso che questa versione di moltiplicazione della matrice è uguale alla somma dell'equazione precedente.

È quindi possibile prendere singular value decomposition di M, e il n si desidera è poi dato dal diritto singolare vettore di M che corrisponde al più piccolo valore singolare.

Per incorporare i pesi è sufficiente per definire un peso w_i per ogni punto. Calcolare c come media ponderata dei punti, e cambiare sum_i | n.(x_i - c) |^2 a sum_i | w_i * n.(x_i - c) |^2, e la matrice M in modo simile. Allora risolvi come prima.

+0

Avevi ragione dopo tutto, questo funziona bene. Grazie! –

2

Moltiplicare ogni termine in ciascuna somma per il peso corrispondente. Ad esempio:

fSumZ += weight * pos[2]; 
fSumXX += weight * pos[0]*pos[0]; 

Poiché pointCloude.size() è la somma di 1 per tutti i punti, deve essere sostituito con la somma di tutti i pesi.

+0

Ho pensato che dovrebbe essere sufficiente per moltiplicare ogni termine per il peso, ma non ero sicuro ... ci proverò e tornerò. Grazie. –

0

Iniziare dalla ridefinizione del calcolo dell'errore quadratico minimo. La formula cerca di minimizzare la somma dei quadrati di errori. Moltiplicare l'errore al quadrato con una funzione di due punti che diminuisce con la loro distanza. Quindi provare a minimizzare la somma ponderata degli errori al quadrato e ricavarne i coefficienti.