Corrispondenza del profilo in una nuvola di punti


14

Una nuvola di punti viene generata utilizzando una funzione casuale uniforme per (x,y,z). Come mostrato nella figura seguente, si sta studiando un piano ( profilo ) intersecante piatto che corrisponde come il migliore (anche se non quello esatto) a un profilo target, cioè dato nell'angolo in basso a sinistra. Quindi la domanda è:

1- Come trovare una tale corrispondenza del dato target 2D point mapattraverso point cloudconsiderando le seguenti note / condizioni?
2- Quali sono quindi le coordinate / orientamenti / grado di somiglianza ecc.?

Nota 1: Il profilo di interesse potrebbe essere ovunque con qualsiasi rotazione lungo gli assi e potrebbe anche avere una forma diversa, ad esempio un triangolo, un rettangolo, un quadrangolo ecc., A seconda della posizione e dell'orientamento. Alla seguente dimostrazione viene mostrato solo un semplice rettangolo.

Nota 2: un valore di tolleranza potrebbe essere considerato come la distanza dei punti dal profilo. Per dimostrarlo per la figura seguente supponiamo che una tolleranza di 0.01volte la dimensione più piccola (~1)lo sia tol=0.01. Pertanto, se rimuoviamo il resto e proiettiamo tutti i punti rimanenti sul piano del profilo in esame, saremo in grado di verificarne la somiglianza con il profilo di destinazione.

Nota 3: è possibile trovare un argomento correlato in Riconoscimento dei punti .

inserisci qui la descrizione dell'immagine


@Developer Off topic ma quale software stai usando per generare quei grafici?
Spacey,

1
@Mohammad Uso Python+ MatPlotLibper fare le mie ricerche e generare grafici, ecc.
Sviluppatore

@Developer Fantastico - è tramite Python, ma cosa significano 'Python shell ala Matlab'?
Spacey,

Come vengono archiviate le nuvole di punti? Come un insieme di coordinate per il centro di ciascun punto o come un set di dati volumetrico che ha valori diversi da zero nelle coordinate attorno ai punti?
endolito il

@endolith Tutti i punti hanno coordinate associate come P:{x,y,z}. Sono davvero punti senza dimensioni. Con una certa approssimazione, tuttavia, potrebbero essere discretizzati in una dimensione di un pixel come array 3D. Possono incorporare anche altri attributi (come pesi, ecc.) Sulle coordinate.
Sviluppatore

Risposte:


4

Ciò richiederà sempre molto calcolo, specialmente se si desidera elaborare fino a 2000 punti. Sono sicuro che esistono già soluzioni altamente ottimizzate per questo tipo di pattern-matching, ma per trovarle devi capire come si chiama.

Dato che stai parlando di una nuvola di punti (dati sparsi) anziché di un'immagine, il mio metodo di correlazione incrociata non si applica (e sarebbe anche peggio dal punto di vista computazionale). Qualcosa come RANSAC probabilmente trova una corrispondenza rapidamente, ma non ne so molto.

Il mio tentativo di soluzione:

ipotesi:

  • Vuoi trovare la migliore corrispondenza, non solo una partita libera o "probabilmente corretta"
  • La corrispondenza avrà una piccola quantità di errore a causa del rumore nella misurazione o nel calcolo
  • I punti sorgente sono complanari
  • Tutti i punti di origine devono esistere nel target (= qualsiasi punto non corrispondente è una mancata corrispondenza per l'intero profilo)

Quindi dovresti essere in grado di prendere molte scorciatoie squalificando le cose e diminuendo i tempi di calcolo. In breve:

  1. scegli tre punti dalla fonte
  2. cerca tra punti target, trovando gruppi di 3 punti con la stessa forma
  3. quando viene trovata una corrispondenza di 3 punti, controlla tutti gli altri punti nel piano che definiscono per vedere se sono una corrispondenza ravvicinata
  4. se viene rilevata più di una corrispondenza di tutti i punti, scegliere quella con la somma più piccola dell'errore delle distanze 3D

Più dettagliato:

pick a point from the source for testing s1 = (x1, y1)
Find nearest point in source s2 = (x2, y2)
d12 = (x1-x2)^2 + (y1-y2)^2
Find second nearest point in source s3 = (x3, y3)
d13 = (x1-x3)^2 + (y1-y3)^2
d23 = (x2-x3)^2 + (y2-y3)^2

for all (x,y,z) test points t1 in target:
    # imagine s1 and t1 are coincident
    for all other points t2 in target:
        if distance from test point > d12:    
            break out of loop and try another t2 point
        if distance ≈ d12:
            # imagine source is now rotated so that s1 and s2 are collinear with t1 and t2
            for all other points t3 in target:
                if distance from t1 > d13 or from t2 > d23:
                    break and try another t3
                if distance from t1 ≈ d13 and from t2 ≈ d23:
                    # Now you've found matching triangles in source and target
                    # align source so that s1, s2, s3 are coplanar with t1, t2, t3
                    project all source points onto this target plane 
                    for all other points in source:
                        find nearest point in target
                        measure distance from source point to target point
                        if it's not within a threshold:
                            break and try a new t3
                        else:
                            sum errors of all matched points for this configuration (defined by t1, t2, t3)

Qualunque configurazione abbia l'errore meno quadrato per tutti gli altri punti è la migliore corrispondenza

Poiché stiamo lavorando con 3 punti di test vicini più vicini, è possibile semplificare la corrispondenza dei punti target controllando se si trovano entro un certo raggio. Se stiamo cercando un raggio di 1 da (0, 0), ad esempio, possiamo squalificare (2, 0) in base a x1 - x2, senza calcolare la distanza euclidea effettiva, per accelerare un po '. Ciò presuppone che la sottrazione sia più veloce della moltiplicazione. Esistono ricerche ottimizzate basate anche su un raggio fisso più arbitrario .

function is_closer_than(x1, y1, z1, x2, y2, z2, distance):
    if abs(x1 - x2) or abs(y1 - y2) or abs(z1 - z2) > distance:
        return False
    return (x1 - x2)^2 + (y1 - y2)^2 + (z1 - z2)^2 > distance^2 # sqrt is slow

d=(x1x2)2+(y1y2)2+(z1z2)2

(20002)

In realtà, poiché dovrai calcolare tutti questi comunque, sia che tu trovi corrispondenze o meno, e poiché ti preoccupi solo dei vicini più vicini per questo passaggio, se hai la memoria è probabilmente meglio pre-calcolare questi valori usando un algoritmo ottimizzato . Qualcosa come una triangolazione di Delaunay o Pitteway , in cui ogni punto del bersaglio è collegato ai vicini più vicini. Conservali in una tabella, quindi cercali per ogni punto quando cerchi di adattare il triangolo sorgente a uno dei triangoli target.

Ci sono molti calcoli coinvolti, ma dovrebbe essere relativamente veloce poiché funziona solo sui dati, che è scarso, invece di moltiplicare molti zeri insignificanti come la correlazione incrociata dei dati volumetrici. Questa stessa idea funzionerebbe per il caso 2D se prima trovassi i centri dei punti e li memorizzassi come un insieme di coordinate.


1
La prima parte della tua risposta è in realtà un metodo a forza bruta che cerca punti vicini (contando rispetto ad una soglia) attorno a tutti i possibili piani attraverso la nuvola di punti. È estremamente ad alta intensità di calcolo, ad esempio, per soli 2000 punti sarà richiesto un numero di 2.662.668.000.000 (Formula) di calcolo della distanza!
Sviluppatore

@Developer: Sì, ci vorranno molti calcoli, soprattutto se hai migliaia di punti. Sì, per 2000 punti, se non trovi alcun aereo, finiresti per fare 2.658.673.998.000 calcoli. Presumibilmente , tuttavia, si troverebbero degli aerei, il che ridurrebbe il tempo perché si ferma non appena trova abbastanza punti. Ma comunque, ci stavo pensando e probabilmente ho un'idea migliore, e cambierò la risposta.
endolito il

1
Hai assolutamente capito perfettamente il punto. Solo per aggiungere che i criteri di arresto non possono essere applicati anche dopo aver trovato un piano adatto mentre potrebbe esserci una corrispondenza molto migliore, quindi tutti i possibili piani devono essere controllati. Ho già implementato questa idea e ho scoperto che, anche con l'aiuto di Fortrannumeri superiori ai 500punti, sarà impossibile avere esperienze con il PC.
Sviluppatore

2

Vorrei aggiungere la descrizione @ mirror2image sulla soluzione alternativa accanto a RANSAC, potresti prendere in considerazione l'algoritmo ICP (punto iterativo più vicino), una descrizione può essere trovata qui !

Penso che la prossima sfida nell'uso di questo ICP sia quella di definire la propria funzione di costo e la posa iniziale del piano di destinazione rispetto ai dati del punto nuvola 3d. Un approccio pratico consiste nell'introdurre un po 'di rumore casuale nei dati durante l'iterazione per evitare la convergenza nei falsi minimi. Questa è la parte euristica immagino che tu debba progettare.

Aggiornare:

I passaggi in forma semplificata sono:

  1. Trova il punto più vicino per ciascun punto di input.
  2. Calcola la trasformazione dall'input alla destinazione, quindi sposta i punti di input utilizzando la trasformazione.
  3. Calcola la funzione di somiglianza (ad es. La distanza per ciascun punto di input rispetto al punto target della coppia corrispondente).
  4. Controllare le condizioni di arresto.

Iterate il passaggio 1-4.

C'è una biblioteca disponibile che puoi prendere in considerazione qui ! (Non l'ho ancora provato), c'è una sezione sulla parte di registrazione (compresi altri metodi).


Grazie per il link e il suggerimento. Tali idee utili ci aiutano sempre come ricercatori alle prime armi a imparare le cose più rapidamente. Apprezzo sempre più spiegazioni.
Sviluppatore
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.