2012-01-30 27 views
5

Ho una domanda molto bella & per voi. Ho bisogno di allineare due mesh usando un algoritmo molto veloce. Dato mesh1 e mesh2 voglio scoprire come devo ruotare e ruotare mesh1 per essere nella stessa posizione di mesh2. Inizialmente l'ho fatto usando i momenti di inerzia delle due mesh, ma l'algoritmo non funziona se la seconda mesh è simile alla prima ma con alcune parti mancanti. In altre parole, prendi due maglie identiche e da una di esse taglia le stesse parti.come allineare due mesh

Mi piacerebbe scrivere il codice in C perché ho bisogno di eseguirlo su macchine multipiattaforma (linux/win) e farlo in un modo molto veloce: deve essere inserito in un algoritmo GA.

Le due mesh sono in formato STL (stereolitografia) (binario o ascii) ma forse possono essere utili utilizzando un altro tipo di formato di file.

Avete qualche idea su come eseguire questa roba?

aggiornamento domanda:

prima di tutto voglio ringraziare voi ragazzi molto per tutti i vostri suggerimenti. Ho scaricato un PCL di installazione sul mio computer e ho compilato con successo l'algoritmo ICP (tutorial), tratto dal sito Web PCL. Ma ora ho alcune domande a riguardo, forse perché per me è una cosa nuova di zecca. qual è il significato dell'output di matrice 4x4 per il fitness? Dovrei aspettarmi una matrice rotazionale e un vettore traslazionale ..

Spero che qualcuno di voi possa aiutarmi. Se avete bisogno di altre informazioni si prega di chiedere.

+0

Quindi, in pratica, si desidera un algoritmo che calcoli la trasformatrice che trasforma mesh1 il più vicino possibile su mesh2? Inoltre: l'unico modo in cui la mesh viene modificata è la rimozione di parti o i vertici possono essere spostati e aggiunti? – Nobody

+0

@Nobody Sto calcolando la matrice di trasformazione confrontando i momenti di inerzia dei due corpi, ma qualsiasi altra cosa che mette mesh1 su mesh2 è ok. In conclusione, ho bisogno di trovare la posizione più vicina di mesh1 rispetto a mesh2 che fornisce il valore di distanza minimo tra i due. – Nicholas

+1

Per chi (come me) si imbatte in questo molto più tardi, è utile notare che ICP è più efficace quando la correlazione è alta e la differenza è bassa perché ICP tende a stabilirsi in soluzioni impropri se deve spostare una nuvola/mesh troppo lontano per arrivare a quello giusto. Questo è il motivo per cui in genere viene eseguita una sorta di fase di corrispondenza delle feature approssimativa, per ottenere la trasformazione nelle giuste vicinanze. Da quel momento, ICP è eccellente per perfezionare la registrazione. – Matt

risposta

4

Point Cloud Library ha diverse risorse che potresti trovare utili. Come dice @ Throwback1986, ICP è un eccellente algoritmo per l'allineamento della geometria. Pcl offre anche altri algoritmi di allineamento, spesso più veloci, basati sull'identificazione e sulla corrispondenza delle caratteristiche di interesse in due pezzi di geometria. La biblioteca trova molto utilizzo nelle comunità di robotica, che come te sono molto attente alle prestazioni.

Pcl è scritto in C++. Pur non essendo portatili come quelli lineari, offrono istruzioni di installazione per Windows, alcuni * nix sapori e mac os. L'ho visto funzionare anche su iOS e Android. Controlla il tutorials.

+0

Grazie per avermi dato questo link. È una libreria molto interessante. Ho provato ad usare alcuni tutorial ma sfortunatamente non fa il miracolo che mi aspettavo :). Funziona solo per piccole differenze, spero di poter unire questi codici con il metodo della mia inerzia approssimativa. Qualche altro buon suggerimento? – Nicholas

+0

Prova a cercare la mailing list di pcl, e se non trovi nulla, posta una domanda! Gli sviluppatori sono piuttosto reattivi. Un'idea sarebbe quella di seminare ICP con una tecnica basata su best-guess basata sui momenti intertati, e quindi iterare da lì per un allineamento preciso. Quella matrice di trasformazione 4x4 ha la matrice di rotazione incorporata, come nell'angolo in alto a sinistra. La quarta colonna contiene la matrice di traduzione. (nota che la riga in basso contiene tre 0) – yurbles

3

Iterative Closest Point (ICP) è un modo di registrare (allineare) nuvole di punti 3D con trasformazioni rigide. (Si può applicare anche alle maglie.)

Ecco una buona introduzione: http://www.cs.duke.edu/courses/spring07/cps296.2/scribe_notes/lecture24.pdf

Ecco una sintesi ragionevole: students.asl.ethz.ch/upl_pdf/314-report.pdf

Ecco un'implementazione MATLAB: http://www.mathworks.com/matlabcentral/fileexchange/12627-iterative-closest-point-method

Ecco alcune potenziali ottimizzazioni: http://www.cs.princeton.edu/~smr/papers/fasticp/

+1

Ho fatto qualche ricerca su questo argomento. Sto trovando il codice MATLAB molto utile, anche se penso che questo [link] (http://www.mathworks.com/matlabcentral/fileexchange/16766) sia migliore del tuo, perché ha anche il codice sorgente cpp! Ti dirò al più presto qualsiasi nuovo sviluppo in questo e penso di pubblicare qui la soluzione che otterrò. – Nicholas