Domanda

Ciao fanatici della matematica, ho un problema che mi assilla da un po'.E' per un progetto personale.

Ho tre punti:rosso, verde e blu.Sono posizionati su un foglietto di cartone in modo tale che il punto rosso sia in basso a sinistra (0,0), il punto blu sia in basso a destra (1,0) e il punto verde sia in alto a sinistra.Immagina di fare un passo indietro e scattare una foto della carta da un'angolazione.Se dovessi trovare il centro di ciascun punto nell'immagine (diciamo che le unità sono i pixel), come troveresti il ​​vettore normale della faccia della carta nell'immagine (relativo alla fotocamera)?

Ora alcune cose che ho raccolto su questo problema:

  1. I punti (nella "vita reale") sono sempre ad angolo retto.Nella foto, sono ad angolo retto solo se la fotocamera è stata ruotata attorno al punto rosso lungo un "asse" (l'asse è la linea creata dai punti rosso e blu o rosso e verde).
  2. Ci sono punti solo su un lato della carta.Quindi, sai che non ne guarderai mai il retro.
  3. La distanza della scheda dalla fotocamera è irrilevante.Se conoscessi la profondità di ogni punto, sarebbe molto più semplice (solo un semplice prodotto incrociato, no?).
  4. La rotazione della carta è irrilevante per quello che sto cercando.Nel ritoccare che ho fatto per cercare di capirlo, alla fine la rotazione può essere trovata con l'aiuto del vettore normale.Non mi è noto se la rotazione sia o meno una parte (o un prodotto della) ricerca del vettore normale.

Spero che ci sia qualcuno là fuori che l'ha fatto o che sia un genio della matematica.Ho due miei amici qui che mi aiutano e finora non abbiamo avuto successo.

È stato utile?

Soluzione

l'ho risolto nella mia vecchia versione di MathCAD:

alt text

Modificare:Testo errato nello screenshot di MathCAD:"Conosciuto: G E B Sono perpendicolare gli uni agli altri"

In MathCAD ho dimenticato il passaggio finale della creazione del prodotto incrociato, che copierò e incollerò qui dalla mia risposta precedente:

Ora abbiamo risolto lo XYZ dei punti G e B tradotti, la tua domanda originale voleva la normale dell'aereo.

Se incrociato G X B, otterremo il vettore normale ad entrambi:

        | u1  u2  u3 |
g x b = | g1  g2  g3 |
        | b1  b2  b3 |  

      = (g2b3 - b2g3)u1 + (b1g3 - b3g1)u2 + (g1b2 - b1g2)u3

Tutti i valori sono noti, collegali (non scriverò la versione con G3 e B3 sostituiti, poiché è troppo lungo e brutto per essere utile.

Ma in termini pratici, penso che dovrai risolverlo numericamente, aggiustando Gz E Bz in modo da adattarsi al meglio alle condizioni:

G · B = 0

E

|G| = |B|

Poiché i pixel non sono algebricamente perfetti.

Esempio

Usando un'immagine degli astronauti dell'Apollo 13 che allestivano uno dei contenitori quadrati di idrossido di litio del modulo di comando per lavorare nel LEM, ho individuato gli angoli:

alt text

Usandoli come base per un piano X-Y:

alt text

ho registrato le posizioni dei pixel utilizzando Photoshop, con la X positiva a destra e la Y positiva in basso (per mantenere attiva la regola della Z della mano destra "in" la foto):

G = (79,5, -48,5, grz)

B = (-110,8, -62,8, bz)

Inserendo le due formule iniziali in Excel e utilizzando il pacchetto di strumenti di analisi per "minimizzare" l'errore regolando Gz E Bz, ha prodotto due valori Z:

G = (79.5, -48.5, 102.5)

B = (-110.8, -62.8, 56.2)

Il che mi permette poi di calcolare altri valori interessanti.

La lunghezza di G E B in pixel:

|G| = 138.5

|B| = 139.2

Il vettore normale:

G X B = (3710, -15827, -10366)

L'unità normale (lunghezza 1):

tuN = (0.1925, -0.8209, -0.5377)

Ridimensionamento normale alla stessa lunghezza (in pixel) di G E B (138.9):

Normale = (26,7, -114,0, -74,7)

Ora che ho il normale che ha la stessa lunghezza di G E B, li ho tracciati sulla stessa immagine:

alt text

penso che avrai un nuovo problema:distorsione introdotta dall'obiettivo della fotocamera.I tre punti non sono perfettamente proiettati sul piano fotografico bidimensionale.C'è una distorsione sferica che rende le linee rette non più dritte, rende le lunghezze uguali non più uguali e rende le normali leggermente fuori dalla norma.

La ricerca Microsoft dispone di un algoritmo per capire come correggere la distorsione della fotocamera:

Una nuova tecnica flessibile per la calibrazione della fotocamera

Ma va oltre le mie capacità:

Proponiamo una nuova tecnica flessibile per calibrare facilmente una fotocamera.È adatto per l'uso senza una conoscenza specializzata della geometria 3D o della visione artificiale.La tecnica richiede solo che la fotocamera osservi un modello planare mostrato ad alcuni (almeno due) orientamenti diversi.La fotocamera o il motivo planare possono essere spostati liberamente.Il movimento non deve essere noto.La distorsione radiale del cristallino è modellato.La procedura proposta è costituito da una soluzione in forma chiusa, seguito da un raffinamento non lineare basato sulla probabilità massima criterio.Entrambe le simulazioni al computer e dati reali sono stati utilizzati per testare la tecnica proposta, e molto buona sono stati ottenuti risultati.Confrontato con tecniche classiche che utilizzano attrezzature costose come due o tre piani ortogonali, la proposta la tecnica è facile da usare e flessibile.Avanza la visione computerizzata 3D uno passaggio da ambienti di laboratorio a uso del mondo reale.

Hanno un'immagine di esempio, dove puoi vedere la distorsione:

alt text
(fonte: microsoft.com)

Nota

  • non sai se stai vedendo la "parte superiore" del cartone o il "fondo", quindi la normale potrebbe essere specchiata verticalmente (cioèz = -z)

Aggiornamento

Guy ha trovato un errore nelle formule algebriche derivate.Ripararlo porta a formule che, non credo, hanno una semplice forma chiusa.Ciò non è poi così grave, poiché comunque non può essere risolto esattamente;ma numericamente.

Ecco uno screenshot di Excel in cui inizio con le due regole conosciute:

G · B = 0

E

|G| = |B|

Scrivendo il secondo come differenza (un importo "errore"), puoi quindi sommarli entrambi e utilizzare quel valore come numero per avere il risolutore di Excel minimizzare:

alt text

Ciò significa che dovrai scrivere il tuo risolutore numerico iterativo.sto fissando il mio Metodi numerici per ingegneri libro di testo dell'università;so che contiene algoritmi per risolvere equazioni ricorsive senza forma chiusa semplice.

Altri suggerimenti

Dai suoni di esso, si hanno tre punti di p 1 , p 2 e p 3 la definizione di un piano, e si desidera trovare il vettore normale al piano.

Rappresentando i punti come vettori dall'origine, per un vettore normale sarebbe
n = ( p 2 - p 1 ) x ( p 3 - p 1 )
(Dove x è il prodotto incrociato dei due vettori)

Se si desidera che il vettore per puntare verso l'esterno dalla parte anteriore di carta, poi ala la regola della mano destra, impostare
p 1 = red (in basso a sinistra) dot
p 2 = blu (in basso a destra) puntino
p 3 = verde (in alto a sinistra) dot

@ Ian Boyd ... Mi è piaciuta la tua spiegazione, solo mi sono bloccato nel passaggio 2, quando hai detto che per risolvere per b z . Si aveva ancora b z nella sua risposta, e non credo che si dovrebbe avere b z nella vostra rispondere ...

b z dovrebbe essere +/- radice quadrata di g x 2 + g < sub> y 2 + g z 2 - b x 2 - b y 2

Dopo aver fatto io, ho trovato molto difficile sostituire b z nella prima equazione quando risolto per g z , perché quando sostituendo b z , si dovrebbe ora ottenere:

  

g z = - (g x b x + g y b y ) / sqrt (g x 2 + g y 2 + g z 2 - b x 2 - b y 2 )

La parte che rende questo difficile è che v'è g z nella radice quadrata, quindi bisogna separare e combinare la g z insieme, e risolvere per g z che ho fatto, solo non credo che il modo in cui ho risolto era corretta, perché quando ho scritto il mio programma per calcolare g z per me, ho usato il tuo g x e g Y i valori per vedere se la mia risposta abbinato con il vostro, e non ha fatto.

Così mi chiedevo se potesse dare una mano, perché ho veramente bisogno di ottenere questo a lavorare per uno dei miei progetti. Grazie!

Il solo pensiero in piedi qui.

I tuoi ingressi efficaci sono il rapporto apparente RB / RG [+], l'angolo apparente BRG, e l'angolo che (diciamo) RB fa con il vostro schermo coordinare asse y (Mi sono perso qualcosa). È necessario i componenti del normale (eh!) Vettore normalizzato, che credo sia solo due valori indipendenti (anche se si sono lasciati con un'ambiguità fronte-retro se la carta è vedere attraverso). [++]

Così sto indovinando che questo è possibile ...

Da qui in lavoro sul presupposto che l'angolo apparente di RB è sempre 0, e possiamo ruotare la soluzione finale intorno all'asse z tardi.

Iniziare con la carta posizionata parallelamente al piano di visualizzazione e orientato in modo "naturale" (cioè si superiore vs inferiore e sinistra rispetto giuste assegnazioni sono rispettati). Possiamo raggiungere tutte le posizioni interessanti della carta ruotando dalla \theta intorno all'asse x iniziale (per -\pi/2 < \theta < \pi/2), poi ruotando di circa \phi iniziale y (per -\pi/2 < \phi < \pi/2). Si noti che abbiamo conservato la direzione apparente del vettore RB.

Il passo successivo calcola il rapporto apparente e l'angolo apparente dopo in termini di \theta e \phi e capovolgere il risultato. [+++]

Il normale sarà R_y(\phi)R_x(\theta)(0, 0, 1) per R_i la matrice di rotazione attorno all'asse primitivo i.

[+] Le lunghezze assolute non contano, perché appena ti dice la distanza carta.

[++] Un altro presupposto:. Che la distanza dalla scheda per visualizzare aereo è molto più grande rispetto alla dimensione della scheda

[+++] Qui la proiezione si utilizza da spazio a tre d per le materie del piano di visualizzazione. Questa è la parte più difficile, ma non qualcosa che possiamo fare per voi, se non dici quello di proiezione che si sta utilizzando. Se si utilizza una vera fotocamera, allora questa è una proiezione prospettica ed è coperto in sostanza, tutti i libri sulla grafica 3D.

a destra, il vettore normale non cambia dalla distanza, ma la proiezione del cartone su un quadro non il cambiamento di distanza (semplice: se si dispone di un piccolo cartone, non cambia nulla. Se si dispone di un cartone 1 miglio di larghezza e 1 miglio e si ruota in modo che da un lato è più vicino e l'altro lato più lontano, il lato vicino è amplificato e dall'altra parte accorciato sull'immagine. Si può vedere che subito che un rettangolo non rimanga un rettangolo, ma un trapezio)

Il modo per lo più accurato per piccoli angoli e la fotocamera centrata su mezzo è quello di misurare il rapporto tra la larghezza / altezza tra immagine "normale" dell'immagine e l'angolo delle linee centrali (perché non sono deformati).

Definiamo x da sinistra a destra, come y basso verso l'alto, z come da lontano a vicino.

Poi
x = arcsin (measuredWidth / normWidth)
rosso-blu y = arcsin (measuredHeight / normHeight)
rosso-verde z = sqrt (1,0-x ^ 2-y ^ 2)

I calcolerò domani una soluzione più precisa, ma sono troppo stanco ora ...

È possibile utilizzare u, v, n co-oridnates. Imposta il tuo punto di vista sulla posizione dell ' "occhio" o "camera", poi tradurre i vostri x, y, z coordinate a U, V, n. Da lì è possibile determinare le normali, così come le superfici prospettiche e visibili se si vuole (u 'v', n '). Inoltre, tenete a mente che 2D = 3D con z = 0. Infine, assicurarsi di utilizzare non omogenea coordinate.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top