2011-08-16 5 views
8

Sto lavorando in OpenCV ma non penso che ci sia una funzione per questo. Posso trovare una funzione per trovare trasformazioni affini, ma le trasformazioni affini includono il ridimensionamento e voglio solo considerare la rotazione + la traduzione.allineare un set di punti 2D con un altro utilizzando solo traslazione e rotazione

Immaginate di avere due serie di punti in 2D - diciamo che ogni set ha esattamente 50 punti.

E.g. imposta A = {x1, y1, x2, y2, ..., x50, y50}

set B = {x1 ', y1', x2 ', y2', ..., x50 ', y50'}

Voglio trovare la combinazione di rotazione e traduzione che si avvicina al set di mappatura A sul set B. Immagino che definirei "più vicino" come minimizza la distanza media tra i punti in A e i punti corrispondenti in BIe, minimizza la media distanza tra (x1, y1) e (x1 ', y1'), ecc.

Immagino che potrei usare la forza bruta per verificare tutte le traduzioni e le rotazioni possibili, ma questo sarebbe estremamente inefficiente. Qualcuno sa un modo più semplice?

Grazie!

+0

Esiste una corrispondenza uno a uno tra i punti? Sono davvero lo stesso punto e hai solo bisogno di trovare la trasformazione? – phkahler

risposta

6

Questo problema ha una soluzione molto elegante in termini di decomposizione del valore singolare della matrice di prossimità (distanze tra coppie di punti). Il nome di questo è il orthogonal Procrustes problem, dopo la leggenda greca su un compagno che offriva ai viaggiatori un letto adatto a chiunque.

La soluzione deriva dal trovare la matrice ortogonale più vicina a una determinata matrice (non necessariamente ortogonale).

+1

grazie. Ho trovato la stessa soluzione in giro per il tempo in cui hai postato la tua risposta: http://en.wikipedia.org/wiki/Procrustes_analysis – Andrew

+2

@Andrew: È un'applicazione pulita/sorprendente di SVD, mi sembra. La soluzione di Peter Schonemann era motivata da un'applicazione per testare le metriche in psicologia/scienze sociali. Per essere sicuri che intendi escludere i riflessi (al contrario delle traduzioni e delle rotazioni), è necessario un piccolo ritocco dei valori singolari. – hardmath

0

Il modo in cui lo farei in Excel è creare un paio di colonne che rappresentano i punti. Celle che rappresentano rotazione/traduzione di un set (non è necessario ruotare e tradurre entrambi). Quindi le colonne che rappresentano quegli stessi punti ruotati/tradotti.
Quindi un'altra colonna per la distanza tra i punti dei punti ruotati/tradotti.
Quindi una cella della somma delle distanze tra i punti. Infine, utilizzare il Risolutore per ottimizzare le celle di rotazione e di traduzione.

+0

grazie per la tua risposta. Sono stato in grado di fare ciò che mi serviva calcolando il punto medio di ogni set per calcolare la traduzione, e poi usando questa pagina per capire l'angolo di rotazione http://en.wikipedia.org/wiki/Procrustes_analysis – Andrew

0

Se si corregge qualche rotazione è possibile ottenere una risposta utilizzando ternary search. Esegui la ricerca in xe per ogni x testato eseguilo in y per ottenere il valore migliore. Questo ti darà la risposta corretta poiché la funzione (somma delle distanze corrispondenti) è convessa (questo può essere provato osservando che la restrizione della funzione a qualsiasi linea è una funzione convessa unidimensionale, e l'ultimo è un fatto standard: il la somma di diverse funzioni convesse è convessa). Invece di forza bruta oltre l'angolo, posso proporre un tale metodo basato sulla ricerca ternaria. Scegli un passo non molto grande S. Calcola la funzione bersaglio per ogni angolo in (0, S, 2S, ...). Quindi, se S è abbastanza piccolo, possiamo escludere alcuni segmenti (iS, (i + 1) S) dalla considerazione. Vale a dire quelli con valori relativamente grandi di funzione con gli angoli iS e (i + 1) S. Essendo implementato con attenzione questo può dare una risposta e può farlo più velocemente della forza bruta.

+1

grazie per la tua risposta . Sono stato in grado di fare ciò che mi serviva calcolando il punto medio per ogni set per calcolare la traduzione, e quindi usando questa pagina per calcolare l'angolo di rotazione http: //en.wikipedia.org/wiki/Procrustes_analysis – Andrew

+0

Non otterrai alcuna buona approssimazione alla risposta utilizzando il punto medio anche in caso unidimensionale. Ad esempio: un set (0, 2, 100) con media 34, un altro è (0, 50, 100) con media 50. Dopo lo spostamento otterrai (16, 18, 116) e risultato di 16 + 32 + 16 = 64. Ma se non ti muovi ne prenderai solo 48. E persino ruotare sull'aereo non aiuterà qui. –

+0

@SergeyBankevich: l'utilizzo della media come traduzione riduce al minimo la distanza media ** quadrata **, che tende ad essere più preziosa della distanza media – Eric