Discussione:
Trasformazione prospettica
(troppo vecchio per rispondere)
Narcolessico
2008-03-08 11:02:19 UTC
Permalink
Leggo qui

http://en.wikipedia.org/wiki/Projective_geometry#Projective_transformation

che una trasformazione prospettica da R^2 in R^2 è una biiezione tra punti
rappresentata da... una matrice 3x3.

Ma come si fa a moltiplicare un punto (matrice 2x1) per una matrice 3x3?
--
Narcolessico
http://binaryunit.blogspot.com
Enrico Gregorio
2008-03-08 11:23:39 UTC
Permalink
Post by Narcolessico
Leggo qui
http://en.wikipedia.org/wiki/Projective_geometry#Projective_transformation
che una trasformazione prospettica da R^2 in R^2 è una biiezione tra punti
rappresentata da... una matrice 3x3.
Ma come si fa a moltiplicare un punto (matrice 2x1) per una matrice 3x3?
Leggi male: parlano di P^2, il piano proiettivo. Le coordinate dei punti
nel piano proiettivo sono terne di numeri (a meno di una relazione di
equivalenza).

Ciao
Enrico
Luca
2008-03-08 11:28:12 UTC
Permalink
Post by Narcolessico
Leggo qui
http://en.wikipedia.org/wiki/Projective_geometry#Projective_transformation
Post by Narcolessico
che una trasformazione prospettica da R^2 in R^2 è una biiezione tra
punti rappresentata da... una matrice 3x3.
Ma come si fa a moltiplicare un punto (matrice 2x1) per una matrice 3x3?
Suppongo che i punti siano intesi in coordinate omogenee. Dai una
occhiata. Ciao!
Narcolessico
2008-03-08 12:42:12 UTC
Permalink
Post by Luca
Suppongo che i punti siano intesi in coordinate omogenee. Dai una
occhiata. Ciao!
Ho iniziato a dare un'occhiata e mi sto perdendo (positivamente) negli
approfondimenti... E' un argomento molto interessante.

La mia necessità iniziale era la seguente. Ho le cordinate di quattro punti
prima e dopo una proiezione prospettica; mi vengono date le coordinate di
un punto proiettato, e dovrei trovare le coordinate dello stesso punto
prima della proiezione.

Se ho ben capito, potrei usare tre dei quattro punti noti per ricavare la
matrice 3x3 della trasformazione prospettica; a questo punto, trovata la
matrice, sono in grado di effettuare il calcolo inverso: dato un punto
proiettato, trovare le coordinate del punto originario.

Tuttavia, alcune cose mi sfuggono. Primo: quante incognite mi servono nella
matrice? Se la proiezione fosse il risultato di un rendering, le incognite
sarebbero:

- Posizione e orientamento nello spazio di una fotocamera (tot. 6 incognite)
- Distanza tra il fuoco e il piano della proiezione (zoom)

Totale: 7 incognite. Dove stanno nella matrice questi sette valori? Le
trasformazioni di rotazione e traslazione, da sole, corrispono alle prime
due righe (sei valori). Poi?

Secondo dubbio: supponendo di non conoscere le coordinate y dei quattro
punti proiettati iniziali, come dovrei procedere? Se le incognite sono in
effetti 7, mi servono le coordinate X di almeno sette punti... Quindi
quattro non bastano più per ricostruire la matrice. E' corretto?
--
Narcolessico
http://binaryunit.blogspot.com
Narcolessico
2008-03-08 14:29:58 UTC
Permalink
Mi sto confondendo. Qui si parla di una matrice 4x4:

http://en.wikipedia.org/wiki/Transformation_matrix#Perspective_projection

Continuo a googlare...
--
Narcolessico
http://binaryunit.blogspot.com
?manu*
2008-03-08 15:51:52 UTC
Permalink
Post by Narcolessico
Tuttavia, alcune cose mi sfuggono. Primo: quante incognite mi servono nella
matrice? Se la proiezione fosse il risultato di un rendering, le incognite
- Posizione e orientamento nello spazio di una fotocamera (tot. 6 incognite)
- Distanza tra il fuoco e il piano della proiezione (zoom)
Totale: 7 incognite. Dove stanno nella matrice questi sette valori? Le
trasformazioni di rotazione e traslazione, da sole, corrispono alle prime
due righe (sei valori). Poi?
Non credo che le informazioni sullo spazio proiettivo ti possano essere
molto utili per il tuo problema. La trasformazione che associa al punto
(x,y,z) di R^3 il punto (X,Y) sullo schermo è:

(X,Y) = P [ M (x-x0,y-y0,z-z0) ]

dove P(x,y,z) = a (x/z, y/z) è la trasformazione prospettica con "a"
parametro di zoom;
M è una matrice ortogonale che rappresenta l'orientazione della camera
e (x0,y0,z0) è la posizione della camera. Sai non sai cos'è una matrice
ortogonale chiedi pure. Per ora ti basti sapere che M può essere
determinata con tre parametri.

Con quella formula dovresti riuscire a rispondere a tutte le tue
domande... sempre che la formula sia giusta.

E.
Narcolessico
2008-03-08 16:11:36 UTC
Permalink
Post by ?manu*
Post by Narcolessico
Totale: 7 incognite. Dove stanno nella matrice questi sette valori? Le
trasformazioni di rotazione e traslazione, da sole, corrispono alle prime
due righe (sei valori). Poi?
Non credo che le informazioni sullo spazio proiettivo ti possano essere
molto utili per il tuo problema. La trasformazione che associa al punto
(X,Y) = P [ M (x-x0,y-y0,z-z0) ]
dove P(x,y,z) = a (x/z, y/z) è la trasformazione prospettica con "a"
parametro di zoom;
M è una matrice ortogonale che rappresenta l'orientazione della camera
e (x0,y0,z0) è la posizione della camera. Sai non sai cos'è una matrice
ortogonale chiedi pure. Per ora ti basti sapere che M può essere
determinata con tre parametri.
Leggendo qui e lì mi sembra di aver capito una cosa: che per "trasformazione
prospettica" di solito si intende la proiezione su un piano da R^3 a R^2
(in pratica, il rendering tridimensionale).

A me basta passare da R^2 a R^2, perchè tutti i punti che mi interessano
stanno in un rettangolo. E' come se volessi mappare le coordinate dei punti
su di un foglio di carta rigido nelle coordinate sullo stesso foglio per
come appaiono in una foto. Questa mappatura mi serve per il passaggio
contrario: da una foto di un foglio su di un tavolo, dovrei ricostruire la
posizione esatta sul foglio di ogni punto che vedo nella foto. Non so se ho
reso o sono poco chiaro...

Se mi interessasse solo una traslazione da R^2 a R^2, o solo una rotazione,
o solo uno scaling o uno shearing orizzontale o verticale, una matrice di
2x2 sarebbe sufficiente. Ho letto che se mi interessa applicare
contemporaneamente rotazione + traslazione + ..., mi serve una matrice 3x3
(di cui uso solo le prime due righe, se non erro) usando le coordinate
omogenee dei punti; e tre punti di cui sia note posizione iniziale e finale
e posizione trasformata sarebbero sufficienti a determinare questa matrice.

A me serve un passettino in più: con soli tre punti un rettangolo può
diventare un parallelogramma ruotato e schiacciato, ma non deformato
prospetticamente; col quarto punto dovrei essere in grado di ricavare una
matrice 3x3 che mi dia anche la deformazione prospettica. E' giusto fin
qui?

Primo dubbio: quali elementi della matrice hanno valori noti? Se ho capito
bene mi hai confermato che 7 parametri sono sufficienti (e necessari) per
definire una trasformazione prospettica. Forse l'elemento 3,3 della matrice
è 1? Ce n'è un altro noto? Poi, per il calcolo, dovrei arrangiarmi... In
caso posterò di nuovo ;)

Una eventuale conseguenza della necessità di sole sette incognite sarebbe
che, per ricavare la matrice, non occorrono per forza 4 punti di cui sia
nota la posizione prima e dopo la trasformazione; bastano 3 punti e una
sola coordinata del quarto. In altre parole: se mi dicono che un
determinato rettangolo di una data dimensione è stato deformato
prospetticamente e mi danno le coordinate proiettate di tre vertici e la
coordinata x del quarto, dovrei essere in grado da solo di ricavare la y
mancante. E' giusto?

Prima di esporre gli altri dubbi attendo conferme...
--
Narcolessico
http://binaryunit.blogspot.com
Narcolessico
2008-03-09 17:39:04 UTC
Permalink
Faccio i primi esperimenti per ricavare la mia matrice 3x3 (che dovrebbe
definire una trasformazione prospettica da R^2 in R^2).

Coordinate di quattro punti non proiettati:

A=(0,0)
B=(6,0)
C=(6,10)
D=(0,10)

Per trasformarli in coordinate omogenee, aggiungo semplicemente "1":

A=(0,0,1)
...

Queste sono le coordinate degli stessi punti dopo la proiezione:

A=(6/11, 75/11)
B=(60/17, 105/17)
C=(110/17, 105/17)
D=(80/11, 75/11)

Come sopra, per renderle omogenee aggiungo semplicemente 1. Sbaglio in
questa trasformazione così semplice?

Sia M la matrice 3x3 che cerco, e "Tp" il punto "T" dopo la proiezione
(sempre in coordinate omogenee). Il mio sistema sarà:

MA=Ap
MB=Bp
MC=Cp
MD=Dp

In realtà ho già 9 equazioni con i primi tre punti, ma non so bene quali
equazioni prendere delle 12 totali.

Se chiamiamo aij l'elemento della matrice in riga i e colonna j, le prime
tre righe del sistema sono:

a11*A1 + a12*A2 + a13*A3 = Ap1 (= 6/11)
a21*A1 + a22*A2 + a23*A3 = Ap2 (= 75/11)
a31*A1 + a32*A2 + a33*A3 = Ap3 (= 1)

Ora, poiché A1=A2=0 e Ap3=1, la terza equazione mi definisce già l'elemento
a33 della matrice (dev'essere a33=1); inoltre siccome il terzo valore di
ogni terna (prima e dopo la proiezione) è 1, si finisce sempre con a31 =
a32 = 0. Ovvero, la mia matrice ha solo 6 valori e uno è sempre fisso
(a33=1); ma la trasformazione dovrebbe dipendere da almeno 7 parametri...
Inoltre, se provo ad applicare questa trasformazione, per verifica, agli
altri punti che conosco, non ottengo valori corretti.

Dove sbaglio?
--
Narcolessico
http://binaryunit.blogspot.com
?manu*
2008-03-09 21:16:13 UTC
Permalink
Post by Narcolessico
Faccio i primi esperimenti per ricavare la mia matrice 3x3 (che dovrebbe
definire una trasformazione prospettica da R^2 in R^2).
Io sospetto che quello che tu intendi con "prospettica" non sia quello
che normalmente si intende con "proiettiva". Infatti le trasformazioni
proiettive comprendono tutte le trasformazioni lineari, quelle che
invece ottieni con una "camera", sono in qualche senso "ortogonali".

Io ti consiglio di prendere la trasformazione prospettica che ti ho
scritto in generale da R^3 a R^2 e ridurla da R^2 a R^2, mettendo ad
esempio tutte le coordinate z dei punti di partenza a zero.

E.
El Filibustero
2008-03-10 14:23:54 UTC
Permalink
Post by Narcolessico
Sia M la matrice 3x3 che cerco, e "Tp" il punto "T" dopo la proiezione
MA=Ap
MB=Bp
MC=Cp
MD=Dp
In realtà ho già 9 equazioni con i primi tre punti, ma non so bene quali
equazioni prendere delle 12 totali.
No. Intanto la matrice M e' definita a meno di un fattore
moltiplicativo non nullo. In altri termini, la trasformazione
geometrica non e' descritta da una sola matrice ma piuttosto da una
classe di equivalenza fra matrici modulo un fattore: le matrici

1 0 0 2 0 0
0 1 0 e 0 2 0
0 0 1 0 0 2

descrivono entrambe indifferentemente la trasformazione identica.
Inoltre, anche MX = Xp a meno di una costante moltiplicativa non
nulla. Quindi in realta' le equazioni sono

MA = Ap*alfa1
MB = Bp*alfa2
MC = Cp*alfa3
MD = Dp*alfa4

dove base e altezza sono le dimensioni del rettangolo di partenza:

A=(0,0,1) -----> Ap=(0,0,1) [per semplicita']
B=(base,0,1) -----> Bp=(x2,y2,1)
C=(base,altezza,1) -----> Cp=(x3,y3,1)
B=(0,altezza,1) -----> Dp=(x4,y4,1)
Post by Narcolessico
Ora, poiché A1=A2=0 e Ap3=1, la terza equazione mi definisce già l'elemento
a33 della matrice (dev'essere a33=1); inoltre siccome il terzo valore di
ogni terna (prima e dopo la proiezione) è 1, si finisce sempre con a31 =
a32 = 0. Ovvero, la mia matrice ha solo 6 valori e uno è sempre fisso
(a33=1);
La matrice 3x3 ha 9 valori, di cui uno non nullo puo' essere fissato
arbitrariamente a 1, per scegliere un particolare rappresentante della
classe di equivalenza di cui sopra. Quindi 8 valori da scegliere...
Post by Narcolessico
ma la trasformazione dovrebbe dipendere da almeno 7 parametri...
...infatti la trasformazione dipende da 8 parametri: ciascuna delle
due coordinate dei quattro corrispondenti di A,B,C,D puo' essere
scelta liberamente (ferma restando la non singolarita' della
trasformazione: punti non allineati non possono trasformarsi in
allineati). Sia M=

a b c
d e f
g h i

la matrice che cerchiamo. Essendo A(0,0,1) ---> Ap(0,0,1), cio'
comporta c=f=0. Visto che la trasf. e' non-singolare, i non e' nullo:
allora si puo' porre arbitrariamente i=1. Cosi' siamo a M=

a b 0
d e 0
g h 1

Ora, MB=Bp*alfa2. Si hanno le tre equazioni

a*base = alfa2*x2
d*base = alfa2*y2
g*base + 1 = alfa2

che consentono di esplicitare a e d in funzione di g:

a = (g*base +1)*x2/base
d = (g*base +1)*y2/base

Analogamente, da MD = Dp*alfa4 si avra'

b = (h*altezza + 1)*x4/altezza
e = (h*altezza + 1)*y4/altezza

e a questo punto restano solo da determinare g,h: si fa tramite la
relazione

MC = Cp*alfa3

Ciao
Eugenio
2008-03-11 14:58:44 UTC
Permalink
E' incredibile quanto si cresca in questo ng... !
Post by El Filibustero
la matrice che cerchiamo. Essendo A(0,0,1) ---> Ap(0,0,1), cio'
allora si puo' porre arbitrariamente i=1. Cosi' siamo a M=
a b 0
d e 0
g h 1
Prima dicevo grosso modo questo: se un elemento della matrice è uguale
a 1, e altri due sono nulli, non abbiamo ridotto la dipendenza a soli
sei valori? Ma forse ho capito: abbiamo già considerato MA=Ap, quindi
è normale che il grado di libertà sia sceso di due (tre). Giusto?
Post by El Filibustero
E' piu' facile traslare l'origine in A, assumendo dopo la proiezione
A=(0,0), B=(60/17-6/11,105/17-75/11), ecc... In questo modo la matrice
di trasformazione risulta
3441/3025 37/55 0
-148/605 0 0
59/275 0 1
Ho un altro punto di prova P=(2,2,1); P dopo la proiezione dovrebbe
valere (50/13,85/13,1) (cioè circa 3.846, 6.538), ma usando questa
matrice e traslando di (+6/11,+75/11) ottengo (3.079, 6.476). Vedo che
i valori sono molto simili... Ma nei calcoli uso più di dodici
decimali di precisione, quindi escluderei che si tratti di errori
propagati. Perchè allora non corrisponde?

Eventualmente, ho anche un altro punto di prova: Q=(3,2,1) -->
Qp=(55/14,45/7,1), ma anche con questo non corrisponde. Sto rivedendo
le proiezioni di A,B,C,D per verificare se per caso qualcuno tra i
valori proiettati fosse sbagliato in partenza, ma finora sembrano
esatti.
Post by El Filibustero
La matrice 3x3 ha 9 valori, di cui uno non nullo puo' essere fissato
arbitrariamente a 1, per scegliere un particolare rappresentante della
classe di equivalenza di cui sopra. Quindi 8 valori da scegliere...
...
Post by El Filibustero
e a questo punto restano solo da determinare g,h: si fa tramite la
relazione
MC = Cp*alfa3
Ho fatto due conti e mi è venuto così:


det = base*altezza*( (x2-x3)*(y4-y3) - (x4-x3)*(y2-y3) )
g = altezza*( (x3-x2-x4)*(y4-y3) - (y3-y2-y4)*(x4-x3) )/det
h = base*( (y3-y2-y4)*(x2-x3) - (x3-x2-x4)*(y2-y3) )/det
a = (g*base +1)*x2/base
d = (g*base +1)*y2/base
b = (h*altezza + 1)*x4/altezza
e = (h*altezza + 1)*y4/altezza
c=0
f=0
i=1

Ma qui la trasformazione non mi funziona nemmeno sui vertici iniziali
(eccetto su sul vertice A). Forse ho sbagliato io nello sviluppo?

--
Narcolessico
http://binaryunit.blogspot.com
El Filibustero
2008-03-11 17:14:07 UTC
Permalink
Post by Eugenio
Prima dicevo grosso modo questo: se un elemento della matrice è uguale
a 1, e altri due sono nulli, non abbiamo ridotto la dipendenza a soli
sei valori? Ma forse ho capito: abbiamo già considerato MA=Ap, quindi
è normale che il grado di libertà sia sceso di due (tre). Giusto?
Esatto
Post by Eugenio
Post by El Filibustero
E' piu' facile traslare l'origine in A, assumendo dopo la proiezione
A=(0,0), B=(60/17-6/11,105/17-75/11), ecc... In questo modo la matrice
di trasformazione risulta
3441/3025 37/55 0
-148/605 0 0
59/275 0 1
Ho un altro punto di prova P=(2,2,1); P dopo la proiezione dovrebbe
valere (50/13,85/13,1) (cioè circa 3.846, 6.538), ma usando questa
matrice e traslando di (+6/11,+75/11) ottengo (3.079, 6.476). Vedo che
i valori sono molto simili...
Magari le ordinate, ma le ascisse non sono "molto simili".
Post by Eugenio
Ma nei calcoli uso più di dodici decimali di precisione
Nel mio primo post avevo fatto un richiamo
Post by Eugenio
la prospettiva ideale (*) che lo trasforma
dimenticandomi di scriverlo. Intendevo dire che l'immagine prodotta da
una fotocamera non e' una prospettiva ideale: nei modelli con ottica
non professionale, la deformazione (sferica ?) e' evidentissima.
Post by Eugenio
quindi escluderei che si tratti di errori propagati
Certo: gli errori dovuti alla deformazione di cui sopra sono di
entita' enormemente maggiore di quelli di calcolo con 12 decimali di
precisione.
Post by Eugenio
Perchè allora non corrisponde?
Obiettivo troppo deformante. Ma nella foto il rettangolo ha i lati
rettilinei? Viene il sospetto di no.
Post by Eugenio
det = base*altezza*( (x2-x3)*(y4-y3) - (x4-x3)*(y2-y3) )
g = altezza*( (x3-x2-x4)*(y4-y3) - (y3-y2-y4)*(x4-x3) )/det
h = base*( (y3-y2-y4)*(x2-x3) - (x3-x2-x4)*(y2-y3) )/det
a = (g*base +1)*x2/base
d = (g*base +1)*y2/base
b = (h*altezza + 1)*x4/altezza
e = (h*altezza + 1)*y4/altezza
c=0
f=0
i=1
Ma qui la trasformazione non mi funziona nemmeno sui vertici iniziali
(eccetto su sul vertice A). Forse ho sbagliato io nello sviluppo?
Si'. Deve venire

g = (y2(x3-x4)-x2(y3-y4))/(base(x2(y3-y4)+x3(y4-y2)+x4(y2-y3)))
h = (y4(x2-x3)+x4(y3-y2))/(altezza(x2(y3-y4)+x3(y4-y2)+x4(y2-y3)))

Ciao
Eugenio
2008-03-12 11:27:15 UTC
Permalink
Post by El Filibustero
Nel mio primo post avevo fatto un richiamo
Post by El Filibustero
la prospettiva ideale (*) che lo trasforma
dimenticandomi di scriverlo. Intendevo dire che l'immagine prodotta da
una fotocamera non e' una prospettiva ideale: nei modelli con ottica
non professionale, la deformazione (sferica ?) e' evidentissima.
Vero, ma sto ancora lavorando sulla prospettiva ideale; sulla
correzione della deformazione lenticolare lavorerò dopo. Le coordinate
dei punti di esempio sono l'output di un programma, non sono tratte da
una foto. Disegnando i punti proiettati il rettangolo diventa, come ci
si aspetta, un trapezio (c'è un solo punto di fuga al centro
dell'immagine). Non mi resta che andare a prendere il sorgente e
rivedere i calcoli che vengono fatti.
Post by El Filibustero
Si'. Deve venire
g = (y2(x3-x4)-x2(y3-y4))/(base(x2(y3-y4)+x3(y4-y2)+x4(y2-y3)))
h = (y4(x2-x3)+x4(y3-y2))/(altezza(x2(y3-y4)+x3(y4-y2)+x4(y2-y3)))
Ora purtroppo non ho sotto mano il mio pc; appena posso riprovo e
posto subito. Mi sa che le ipotesi più probabili, a questo punto, sono
che 1. ho sbagliato dei calcoli io 2. il programmino che mi fornisce i
punti di prova contiene un errore.

Ciao

--
Narcolessico
http://binaryunit.blogspot.com
Eugenio
2008-03-13 12:39:11 UTC
Permalink
Dopo attenta verifica, ho visto che il programmino era corretto, ma...
ho sbagliato io in un valore: la x di A proiettato è 30/11, non 60/11
come sui miei appunti, e non 6/11 come ho erroneamente copiato a
video. Ora i valori combaciano perfettamente. Mea culpa! :\

C'è però la possibilità che invece di avere ascisse e ordinate di 4
punti abbia a disposizione le sole ascisse di otto punti. E' possibile
ricostruire la matrice con le sole x? Intuitivamente direi di sì,
almeno in parte, ma devo ancora fare qualche prova su carta. Non posso
ricostruire la seconda riga della matrice, ma la prima e la terza
riga; tuttavia, come faccio a invertire la matrice se non ho la riga
centrale?

Infine, mi rimane il dubbio di cui avevo accennato sopra: abbiamo
detto che la matrice ha otto variabili "libere" e una che, fissata,
stabilisce delle classi di equivalenza; eppure, la proiezione di
alcuni punti dalle 3 dimensioni al piano visivo dipende da soli sette
parametri (posizione e orientazione della camera, zoom). Che
differenza c'è tra una matrice con due variabili fissate e una con
tre? C'è un significato intuitivo?

--
Narcolessico
http://binaryunit.blogspot.com
El Filibustero
2008-03-13 20:05:24 UTC
Permalink
Post by Eugenio
C'è però la possibilità che invece di avere ascisse e ordinate di 4
punti abbia a disposizione le sole ascisse di otto punti.
Non capisco perche' un programma non dovrebbe essere in grado dare
tutti i corrispondenti che interessano.
Post by Eugenio
Infine, mi rimane il dubbio di cui avevo accennato sopra: abbiamo
detto che la matrice ha otto variabili "libere" e una che, fissata,
stabilisce delle classi di equivalenza; eppure, la proiezione di
alcuni punti dalle 3 dimensioni al piano visivo dipende da soli sette
parametri (posizione e orientazione della camera, zoom).
In verita' i parametri sono solo 5: 3 per la posizione della camera e
2 per la sua orientazione (bastano due angoli per definirla). Lo zoom
puo' essere ottenuto come semplice riposizionamento dell'obiettivo,
quindi non e' un parametro indipendente. Tutto cio' significa solo che
non e' possibile disporre la camera in modo che quattro punti del
piano ripreso vadano a finire su quattro punti arbitrariamente scelti
del piano pellicola. Invece la matrice con 8 parametri liberi descrive
trasformazioni geometriche (proiettivita') piu' generali delle
prospettivita'; ma questo non ha importanza, perche' le prospettivita'
sono particolari proiettivita', e una proiettivita' che ha date
quattro coppie di punti corrispondenti e' necessariamente unica. E'
per questo motivo che nel primo post dicevo che, conoscendo quattro
corrispondenti, non serve considerare posizione e orientazione
dell'obiettivo. Ciao
Eugenio
2008-03-14 12:02:16 UTC
Permalink
Post by El Filibustero
Post by Eugenio
C'è però la possibilità che invece di avere ascisse e ordinate di 4
punti abbia a disposizione le sole ascisse di otto punti.
Non capisco perche' un programma non dovrebbe essere in grado dare
tutti i corrispondenti che interessano.
Perchè nell'applicazione finale devo elaborare delle immagini da
alcune webcam (scelte tra i modelli con distorsione lenticolare
minima), e di tali immagini probabilmente avrò a disposizione solo
delle linee orizzontali. Ma forse in questo caso mi conviene andare di
trigonometria...
Post by El Filibustero
In verita' i parametri sono solo 5: 3 per la posizione della camera e
2 per la sua orientazione (bastano due angoli per definirla). Lo zoom
puo' essere ottenuto come semplice riposizionamento dell'obiettivo,
quindi non e' un parametro indipendente.
Non ho capito l'ultimo passaggio: non vuoi dire che solo spostando
l'obiettivo è possibile ottenere la stessa trasformazione prospettica
che si otterebbe variando lo zoom di una misura nota, vero?
Post by El Filibustero
Tutto cio' significa solo che
non e' possibile disporre la camera in modo che quattro punti del
piano ripreso vadano a finire su quattro punti arbitrariamente scelti
del piano pellicola. Invece la matrice con 8 parametri liberi descrive
trasformazioni geometriche (proiettivita') piu' generali delle
prospettivita'; ma questo non ha importanza, perche' le prospettivita'
sono particolari proiettivita', e una proiettivita' che ha date
quattro coppie di punti corrispondenti e' necessariamente unica. E'
per questo motivo che nel primo post dicevo che, conoscendo quattro
corrispondenti, non serve considerare posizione e orientazione
dell'obiettivo. Ciao
Ora è chiarissimo, grazie. Quindi con 8 variabili libere possiamo
sempre trovare una trasformazione che associ quattro punti (otto
coordinate) ad altri quattro del tutto arbitrari; con sette, immagino
che possiamo trovare una trasformazione che associ 3 punti e la
coordinata di un quarto a tre punti e una coordinata arbitrari... E
così via.

Questo mi fa pensare che in qualche modo sia possibile ricostruire la
matrice completa da otto ascisse... Alla fine, poi, avrò la coordinata
x del punto proiettato per come è visto da due angolazioni (quindi
lavoro con due matrici differnenti), e da queste ascisse e le matrici
dovrei risalire alle coordinate non proiettate.

--
Narcolessico
http://binaryunit.blogspot.com
El Filibustero
2008-03-16 14:48:09 UTC
Permalink
Post by Eugenio
Post by El Filibustero
Non capisco perche' un programma non dovrebbe essere in grado dare
tutti i corrispondenti che interessano.
Perchè nell'applicazione finale devo elaborare delle immagini da
alcune webcam (scelte tra i modelli con distorsione lenticolare
minima), e di tali immagini probabilmente avrò a disposizione solo
delle linee orizzontali. Ma forse in questo caso mi conviene andare di
trigonometria...
Continuo a non capire, ma fa lo stesso. Comunque la distorsione
lenticolare di qualunque webcam, anche la migliore, e' tale da rendere
vane queste considerazioni sulla prospettiva ideale. IMHO e' meglio un
approccio piu' empirico al problema.
Post by Eugenio
Post by El Filibustero
In verita' i parametri sono solo 5: 3 per la posizione della camera e
2 per la sua orientazione (bastano due angoli per definirla). Lo zoom
puo' essere ottenuto come semplice riposizionamento dell'obiettivo,
quindi non e' un parametro indipendente.
Non ho capito l'ultimo passaggio: non vuoi dire che solo spostando
l'obiettivo è possibile ottenere la stessa trasformazione prospettica
che si otterebbe variando lo zoom di una misura nota, vero?
voglio dire proprio quello. In una prospettiva ideale e' cosi'. Ciao
Eugenio
2008-03-16 23:07:05 UTC
Permalink
Post by El Filibustero
Post by Eugenio
Perchè nell'applicazione finale devo elaborare delle immagini da
alcune webcam (scelte tra i modelli con distorsione lenticolare
minima), e di tali immagini probabilmente avrò a disposizione solo
delle linee orizzontali. Ma forse in questo caso mi conviene andare di
trigonometria...
Continuo a non capire, ma fa lo stesso. Comunque la distorsione
lenticolare di qualunque webcam, anche la migliore, e' tale da rendere
vane queste considerazioni sulla prospettiva ideale. IMHO e' meglio un
approccio piu' empirico al problema.
Più empirico? Per esempio? Ci sarà sicuramente un margine di errore
nella ricostruzione della trasformazione prospettica, ma pensavo che
calibrare il tutto in base ai quattro punti conosciuti (per come
vengono nell'immagine) fosse abbastanza "empirico". Anche perchè posso
calibrare 4-8 punti, non di più.
Post by El Filibustero
Post by Eugenio
Non ho capito l'ultimo passaggio: non vuoi dire che solo spostando
l'obiettivo è possibile ottenere la stessa trasformazione prospettica
che si otterebbe variando lo zoom di una misura nota, vero?
voglio dire proprio quello. In una prospettiva ideale e' cosi'. Ciao
Mi hai dato da pensare, non la sapevo questa ;) Ma come fai a definire
l'orientazione della telecamera con soli due parametri?

E rivedendo su, mi sorge un dubbio: perchè, al fine di ricostruire la
matrice di trasformazione, abbiamo dovuto definire le singole
equazioni a meno di costanti moltiplicative?

--
Narcolessico
http://binaryunit.blogspot.com
Tetis
2008-03-17 12:03:22 UTC
Permalink
Post by Eugenio
Post by El Filibustero
Post by Eugenio
Perchè nell'applicazione finale devo elaborare delle immagini da
alcune webcam (scelte tra i modelli con distorsione lenticolare
minima), e di tali immagini probabilmente avrò a disposizione solo
delle linee orizzontali. Ma forse in questo caso mi conviene andare di
trigonometria...
Continuo a non capire, ma fa lo stesso. Comunque la distorsione
lenticolare di qualunque webcam, anche la migliore, e' tale da rendere
vane queste considerazioni sulla prospettiva ideale. IMHO e' meglio un
approccio piu' empirico al problema.
Più empirico? Per esempio? Ci sarà sicuramente un margine di errore
nella ricostruzione della trasformazione prospettica, ma pensavo che
calibrare il tutto in base ai quattro punti conosciuti (per come
vengono nell'immagine) fosse abbastanza "empirico". Anche perchè posso
calibrare 4-8 punti, non di più.
Post by El Filibustero
Post by Eugenio
Non ho capito l'ultimo passaggio: non vuoi dire che solo spostando
l'obiettivo è possibile ottenere la stessa trasformazione prospettica
che si otterebbe variando lo zoom di una misura nota, vero?
voglio dire proprio quello. In una prospettiva ideale e' cosi'. Ciao
Mi hai dato da pensare, non la sapevo questa ;)
E' un teorema mica banale per la geometria euclidea.
Date due quaterne di punti, su
due rette in un piano, che hanno il medesimo birapporto c'è una
corrispondenza proiettiva fra le due quaterne che individua
univocamente un punto esterno. Ovvero esiste una disposizione
relativa delle rette, in modo che esista un sistema di
rette, ciascuna congiungente un punto della prima retta ad un punto
della seconda retta, che convergono in un punto, eventualmente
improprio del piano.

Dal punto di vista intuitivo puoi fare questa considerazione:
poni di non essere nel caso di corrispondenza per similitudine,
poni in coincidenza due punti a scelta, rimangono tre punti
per retta, considera le coppie di rette che congiungono coppie
di punti consecutivi. Queste due coppie convergono ad un punto
differente, tuttavia la loro distanza varierà al variare dell'angolo,
che forma la retta delle immagini rispetto alla retta degli oggetti,
quindi hai tante equazioni quante incognite. (non è tuttavia,
ancora, dimostrato che il codominio della funzione che esprime
la distanza fra i due punti individuati dalle due coppie di rette,
in funzione dell'angolo contenga lo zero:
è solo un argomento empirico).
Post by Eugenio
Ma come fai a definire
l'orientazione della telecamera con soli due parametri?
Tieni presente che la rotazione della telecamera intorno
all'asse focale, in prospettiva ideale, non altera l'immagine,
se non per una rotazione.
Post by Eugenio
E rivedendo su, mi sorge un dubbio: perchè, al fine di ricostruire la
matrice di trasformazione, abbiamo dovuto definire le singole
equazioni a meno di costanti moltiplicative?
Non confondere la trasformazione di similitudine dell'immagine
proiettata con la trasformazione di similitudine globale della figura
che descrive l'intera proiezione. Per vedere
che differenza passa considera un caso elementare come la
proiezione centrale da un piano ad un piano parallelo. Questo
è un esempio di trasformazione proiettiva che si riduce sempre ad una
similitudine fra l'immagine originale e l'immagine proiettata,
indipendentemente
dalla posizione del centro di proiezione, grazie al teorema di Talete,
tuttavia al variare della posizione del punto di proiezione la figura che
descrive la proiezione nello spazio (ovvero le rette che congiungono
i punti del piano originale al centro di proiezione) non risulta mai essere
una similitudine.
Post by Eugenio
--
Narcolessico
http://binaryunit.blogspot.com
--------------------------------
Inviato via http://arianna.libero.it/usenet/
El Filibustero
2008-03-17 15:40:29 UTC
Permalink
Post by Eugenio
Più empirico? Per esempio?
Oooops, chiedo scusa. Dopotutto, non ha tanto senso quello che ho
detto, non avendo io idea ne' dello scopo di tutto quanto, ne' dei
mezzi per conseguirlo.
Post by Eugenio
Mi hai dato da pensare, non la sapevo questa ;) Ma come fai a definire
l'orientazione della telecamera con soli due parametri?
Dare la direzione di una retta in uno spazio euclideo 3D e' come dare
un versore, e un versore e' completamente specificato dalle sue tre
componenti vx,vy,vz, che pero' non sono indipendenti, in quanto
vx^2+vy^2+vz^2=1. Oppure, in altri termini, la direzione di un raggio
sferico qualsiasi e' univocamente individuata da longitudine e
latitudine.
Post by Eugenio
E rivedendo su, mi sorge un dubbio: perchè, al fine di ricostruire la
matrice di trasformazione, abbiamo dovuto definire le singole
equazioni a meno di costanti moltiplicative?
Perche' si usano coordinate omogenee, dove un punto e' definito da tre
coordinate a meno di costanti moltiplicative. Ciao
Eugenio
2008-03-18 18:17:49 UTC
Permalink
Grazie a Tetis ed El Filibustero per le spiegazioni. Mentalmente non
riesco a raffigurare come poter ridurre una proiezione con zoom K ad
un'altra equivalente con zoom L<>K solo variando posizione e
orientazione della camera, ma ho capito "analiticamente" come una
proiezione possa dipendere da soli 5 parametri (sia gli esempi del
versore che del raggio sferico erano chiarissimi). Ma allora nella
matrice di trasformazione erano proprio necessari 8 parametri, o ne
bastavano 5?

Grazie a bite per i link. Anche se sto testando un approccio diverso
dalle "solite" tecniche di stereovisione, quelle pagine sono concise e
precise e meritano una buona lettura.

Una cosa che mi fa riflettere è che quando ho studiato le coordinate
omogenee ed il piano proiettivo nel corso di algebra era tutto
chiarissimo, ma "astratto". Non abbiamo studiato applicazioni
pratiche, e così i concetti non si sono fissati in modo tale da averne
padronanza. Ed ecco che mi ritrovo a fare domande che, col senno di
poi, mi sembrano stupidissime ("perchè la costante alpha?")... E se
ripenso alla prima domanda del thread quasi mi vergogno :)


Giusto per completezza, alla fine sto risolvendo così: della matrice
di trasformazione mi costruisco solo la prima (a,b,c) e la terza
(g,h,i=1), perchè non avendo le Y non riesco a ricostruire la seconda;
ma la seconda riga, in effetti, non è necessaria. Per risolvere il
sistema

a*x1 + b*y1 + c*z1 = X1p*alpha1
g*x1 + h*y1 + z1 = Z1p*alpha1
a*x2 + b*y2 + c*z2 = X2p*alpha2
g*x2 + h*y2 + z2 = Z2p*alpha2
...

ho bisogno di calibrare con 5 punti (4 vertici +, per esempio, il
centro); sono 10 equazioni in 10 incognite, ma con A=(0,0) si ottiene
subito c=Axp, quindi alla fine le incognite saranno 4 (escluse le
costanti moltiplicative). Calcolo a,b...h per ognuna delle due camere;
quando in entrambe "leggo" la coordinata X trasformata, risolvo il
sistema

a1*x + b1*y + c1*z = X1p
a2*x + b2*y + c2*z = X2p
g1*x + h1*y + z = 1 (oppure: g2*x + h2*y + z = 1)

dove, ovviamente, le incognite ora sono x,y e z, e ottengo sia la x
che la y non proiettate. Ad un primo test era tutto corretto (si
ottiene una matrice differente di quella ottenuta calibrando sia con
le x che con le y, ma cambia la z e ovviamente il risultato finale è
uguale), ma non sono arrivato a fare il secondo test (confrontare le x
originarie con quelle ottenute dal sistema) perchè si è bruciata la
RAM... X(

Forse non sono stato molto chiaro sui fini di questa cosa, ma dovrei
realizzare presto unl prototipo e vorrei mettere un video su
youtube... Per i curiosi, posterò il link :)

--
Narcolessico
http://binaryunit.blogspot.com
El Filibustero
2008-03-09 21:31:49 UTC
Permalink
Post by Narcolessico
A me basta passare da R^2 a R^2, perchè tutti i punti che mi interessano
stanno in un rettangolo. E' come se volessi mappare le coordinate dei punti
su di un foglio di carta rigido nelle coordinate sullo stesso foglio per
come appaiono in una foto. Questa mappatura mi serve per il passaggio
contrario: da una foto di un foglio su di un tavolo, dovrei ricostruire la
posizione esatta sul foglio di ogni punto che vedo nella foto. Non so se ho
reso o sono poco chiaro...
Se la posizione e la direzione di ripresa della fotocamera rispetto al
tavolo sono note, si tratta di un problema ordinario (ma non banale)
di prospettiva. Ma probabilmente non serve tanto: se si sa che il
foglio fotografato e' il rettangolo di base b e altezza h ABCD [A(0,0)
B(b,0), C(b,h), D(0,h)], la prospettiva ideale (*) che lo trasforma
nel quadrilatero A'=A(0,0), B'(x2,y2) C'(x3,y3) D'(x4,y4) e' data
dalla trasformazione lineare R^3-->R^3 di matrice


x2(x3*y4 - x4*y3)/(det*b) x4(x2*y3 - x3*y2)/(det*h) 0
y2(x3*y4 - x4*y3)/(det*b) y4(x2*y3 - x3*y2)/(det*h) 0
(y2(x3-x4)-x2(y3-y4))/(det*b) (y4(x2-x3)+x4(y3-y2))/(det*h) 1

dove det=x2(y3-y4)+x3(y4-y2)+x4(y2-y3), non nullo perche' B',C',D' non
sono allineati.
Post by Narcolessico
Faccio i primi esperimenti per ricavare la mia matrice 3x3 (che dovrebbe
definire una trasformazione prospettica da R^2 in R^2).
A=(0,0)
B=(6,0)
C=(6,10)
D=(0,10)
Quindi b=6, h=10
Post by Narcolessico
A=(0,0,1)
...
A=(6/11, 75/11)
B=(60/17, 105/17)
C=(110/17, 105/17)
D=(80/11, 75/11)
E' piu' facile traslare l'origine in A, assumendo dopo la proiezione
A=(0,0), B=(60/17-6/11,105/17-75/11), ecc... In questo modo la matrice
di trasformazione risulta

3441/3025 37/55 0
-148/605 0 0
59/275 0 1

Ciao
bite
2008-03-18 21:58:13 UTC
Permalink
Post by Narcolessico
A me basta passare da R^2 a R^2, perchè tutti i punti che mi interessano
stanno in un rettangolo. E' come se volessi mappare le coordinate dei punti
su di un foglio di carta rigido nelle coordinate sullo stesso foglio per
come appaiono in una foto. Questa mappatura mi serve per il passaggio
contrario: da una foto di un foglio su di un tavolo, dovrei ricostruire la
posizione esatta sul foglio di ogni punto che vedo nella foto. Non so se ho
reso o sono poco chiaro...
Allora credo che quella che chiami "trasformazione prospettica" sia
un'omografia.

Puoi procedere così:

Siano M_i = (X_i, Y_i, W_i)^T, con i=1, N, i punti 2D non trasformati,
in coordinate omogenee, e
m_i = (x_i, y_i, w_i)^T i corrispondenti punti 2D trasformati.

Sia H la matrice 3x3 dell'omografia, incognita. Per ogni i si ha:

m_i = H M_i

cioé

x_i = H_11 X_i + H_12 Y_i + H_13 W_i
y_i = H_21 X_i + H_22 Y_i + H_23 W_i
w_i = H_31 X_i + H_32 Y_i + H_33 W_i

Le coordinate non omogenee dei punti trasformati (cioé quelle che tu
conosci) sono:

x_i/w_i = (H_11 X_i + H_12 Y_i + H_13 W_i) / (H_31 X_i + H_32 Y_i +
H_33 W_i)
y_i/w_i = (H_21 X_i + H_22 Y_i + H_23 W_i) / (H_31 X_i + H_32 Y_i +
H_33 W_i)

Quindi puoi riscrivere:

H_11 X_i + H_12 Y_i + H_13 W_i - (x_i/w_i) H_31 X_i - (x_i/w_i) H_32
Y_i - (x_i/w_i) H_33 W_i = 0
H_21 X_i + H_22 Y_i + H_23 W_i - (y_i/w_i) H_31 X_i - (y_i/w_i) H_32
Y_i - (y_i/w_i) H_33 W_i = 0

Questo è un sistema omogeneo di 2N equazioni nelle 9 incognite
H_11 ... H_33, però l'omografia è definita a meno di un fattore
moltiplicativo e quindi ha solo 8 gradi di libertà. Con 4 punti puoi
risolvere il sistema.
Come metodo di risoluzione va bene la decomposizione in valori
singolari (SVD). Dovresti trovare un unico valore singolare prossimo
allo zero (a meno di errori di misura); la corrispondente colonna
della matrice destra fornita da SVD è un vettore soluzione (H_11,
H_12 ... H_32, H_33)^T

Per i dettagli vedi ad esempio http://research.microsoft.com/~zhang/Calib/

Per la decomposizione in valori singolari potresti usare la libreria
open source lapack, disponibile sia in fortran che in c++.
bite
2008-03-18 22:39:03 UTC
Permalink
Dimenticavo l'ultimo passaggino:

H_11 (X_i/W_i) + H_12 (Y_i/W_i) + H_13 - (x_i/w_i) H_31 (X_i/W_i) -
(x_i/w_i) H_32 (Y_i/W_i) - (x_i/w_i) H_33 = 0
H_21 (X_i/W_i) + H_22 (Y_i/W_i) + H_23 - (y_i/w_i) H_31 (X_i/W_i) -
(y_i/w_i) H_32 (Y_i/W_i) - (y_i/w_i) H_33 = 0

dove (X_i/W_i) e (Y_i/W_i) sono le coordinate non trasformate non
omogenee (cioé quelle che tu conosci).

Ciao

PS vedo dal tuo blog che abbiamo un conoscente in comune,
sevencapitalsins, frequentatore del forum ubuntu.
Eugenio
2008-03-22 12:21:00 UTC
Permalink
Post by bite
PS vedo dal tuo blog che abbiamo un conoscente in comune,
sevencapitalsins, frequentatore del forum ubuntu.
Ah, già, l'"algoritmo universale"... Quanto ho riso appena l'ho letto!

Grazie dei consigli, ma vorrei capire innanzitutto cosa non va nel
metodo che uso. Riassunto della situazione:

- Ho due visuali; con 5 punti mi calcolo in fase di calibrazione i
valori a,b,c,g,h,i per ogni visuale tali che

a*x1 + b*y1 + c*z1 = X1p*alpha1
g*x1 + h*y1 + z1 = Z1p*alpha1
a*x2 + b*y2 + c*z2 = X2p*alpha2
g*x2 + h*y2 + z2 = Z2p*alpha2
...

- I valori che calcolo sono corretti: per tutte le coordinate di prova
di cui conosco la X proiettata l'approssimazione è ottima. Quindi il
problema non è qui...

- Terminata la calibrazione, le incognite diventano le coordinate x e
y non proiettate; dispongo solo della coordinata x proiettata dello
stesso punto preso da due visuali differenti (per ognuna delle quali
ho calcolato a,b...i). Allora dalle quattro equazioni

a1*x + b1*y + c1*z = X1p
g1*x + h1*y + z = 1

a2*x + b2*y + c2*z = X2p
g2*x + h2*y + z = 1

dovrei ricavare x e y. Tuttavia, poichè parliamo di coordinate
omogenee e le trasformazioni sono diverse per ogni visuale, la x e la
y delle prime due equazioni e quelle delle seconde due sono differenti
(anzi: non è detto che siano uguali); la le coordinate non omogenee
devono essero. Meglio scrivere

a1*x1 + b1*y1 + c1*z1 = X1p
g1*x1 + h1*y1 + z1 = 1

a2*x2 + b2*y2 + c2*z2 = X2p
g2*x2 + h2*y2 + z2 = 1

aggiungendo le condizioni

x1/z1 = x2/z2
y1/z1 = y2/z2

E' come se avessi sei incognite in sei equazioni non tutte lineari.
Allora ho pensato di fare la seguente: divido le prime due equazioni
per z1, e le seconde due per z2:

a1*(x1/z1) + b1*(y1/z1) + c1 = X1p*(1/z1)
g1*(x1/z1) + h1*(y1/z1) + 1 = 1/z1

a2*(x2/z2) + b2*(y2/z2) + c2 = X2p*(1/z2)
g2*(x2/z2) + h2*(y2/z2) + 1 = 1/z2

Ora rinomino (x1/z1) = (x2/z2) = Xr, (y1/y1) = (y2/y2) = Yr, 1/z1=Zr1
e 1/z2=Zr2. Il sistema è diventato lineare in 4 incognite:

a1*Xr + b1*Yr - X1p*Zr1 = - c1
g1*Xr + h1*Yr - Zr1 = -1

a2*Xr + b2*Yr - X2p*Zr2 = - c2
g2*Xr + h2*Yr - Zr2 = -1

Risolvo e... non ottengo i valori giusti. Se le dimensioni del
rettangolo sono W=40 e H=30, dei vertici A,B,C ottengo le coordinate
esatte (se dò in pasto al sistema le X proiettate in ogni camera dei
singoli punti), mentre già il vertice D, che è stato usato per la
calibrazione, risulta completamente sballato... E sballano anche i
punti di prova non usati per la calibrazione.

Sbaglio a rinominare? Faccio qualche assunzione impropria?

--
Narcolessico
http://binaryunit.blogspot.com
bite
2008-03-22 15:16:55 UTC
Permalink
Post by Eugenio
Post by bite
PS vedo dal tuo blog che abbiamo un conoscente in comune,
sevencapitalsins, frequentatore del forum ubuntu.
Ah, già, l'"algoritmo universale"... Quanto ho riso appena l'ho letto!
Grazie dei consigli, ma vorrei capire innanzitutto cosa non va nel
- Ho due visuali; con 5 punti mi calcolo in fase di calibrazione i
valori a,b,c,g,h,i per ogni visuale tali che
a*x1 + b*y1 + c*z1 = X1p*alpha1
g*x1 + h*y1 + z1 = Z1p*alpha1
a*x2 + b*y2 + c*z2 = X2p*alpha2
g*x2 + h*y2 + z2 = Z2p*alpha2
...
Per capirci qualcosa sono dovuto andare a rileggere i tuoi post
vecchi. Allora vedo che la matrice della trasformazione per te è
[a_11 ... a_33] e che hai già ricavato a_33 = 1 dal primo punto con
x1=0, x2=0, perché dici che a_31 * 0 + a_32 * 0 + a_33 * 1 = 1
E qui sta il problema: la terza coordinata del punto trasformato _non_
deve essere per forza 1, è un'incognita (chiamala W1p); di qui in
avanti scusami ma non sto più a seguire i tuoi conti, perché tanto a
causa di questo problema saranno sicuramente sbagliati :)
bite
2008-03-22 15:21:19 UTC
Permalink
primo punto con x1=0, x2=0
Scusa m'è scivolato il cervello, intendevo x1=0, y1=0
Eugenio
2008-03-22 15:34:34 UTC
Permalink
Post by bite
Per capirci qualcosa sono dovuto andare a rileggere i tuoi post
vecchi. Allora vedo che la matrice della trasformazione per te è
[a_11 ... a_33] e che hai già ricavato a_33 = 1 dal primo punto con
x1=0, x2=0, perché dici che a_31 * 0 + a_32 * 0 + a_33 * 1 = 1
E qui sta il problema: la terza coordinata del punto trasformato _non_
deve essere per forza 1, è un'incognita (chiamala W1p); di qui in
avanti scusami ma non sto più a seguire i tuoi conti, perché tanto a
causa di questo problema saranno sicuramente sbagliati :)
Aspetta: quello lo faccio solo in fase di calibrazione, quando dò in
pasto al sistema le coordinate non trasformate e trasformate di 4 (5)
punti. Se so che le coordinate (non omogenee) di un punto prima della
trasformazione sono X e Y, a cosa dovrei porre Z se non 1? Quando devo
trovare le coordinate non trasformate a partire da quelle trasformate,
la z la lascio come incognita.

--
Narcolessico
http://binaryunit.blogspot.com
Eugenio
2008-03-22 15:38:04 UTC
Permalink
Non so cosa ho cambiato, ma... al secondo copia-incolla ha funzionato
tutto... :O

Meraviglia e gaudio. Non mi resta che tradurre le funzioni octave in c+
+.

Grazie a tutti per l'aiuto. E per la pazienza!!! =)

--
Narcolessico
http://binaryunit.blogspot.com
Aka
2008-03-25 14:54:24 UTC
Permalink
Scusatemi. ripesco il thread per una curiosità: dato che la
trasformazione in oggetto dipende da 5 parametri, ne basterebbero meno
di 8 nella matrice che vogliamo trovare? Perchè non fissiamo 4 invece
di 1 dei 9 valori?

--
Narcolessico
http://binaryunit.blogspot.com
bite
2008-03-25 17:04:13 UTC
Permalink
Post by Aka
Scusatemi. ripesco il thread per una curiosità: dato che la
trasformazione in oggetto dipende da 5 parametri, ne basterebbero meno
di 8 nella matrice che vogliamo trovare? Perchè non fissiamo 4 invece
di 1 dei 9 valori?
--
Narcolessico
http://binaryunit.blogspot.com
Ma perché dici che dipende da 5 parametri? Un'omografia 2D in generale
dipende da 8 parametri.
Eugenio
2008-03-25 19:47:30 UTC
Permalink
Post by bite
Post by Aka
Scusatemi. ripesco il thread per una curiosità: dato che la
trasformazione in oggetto dipende da 5 parametri, ne basterebbero meno
di 8 nella matrice che vogliamo trovare? Perchè non fissiamo 4 invece
di 1 dei 9 valori?
--
Narcolessico
http://binaryunit.blogspot.com
Ma perché dici che dipende da 5 parametri? Un'omografia 2D in generale
dipende da 8 parametri.
La mia è una trasformazione prospettica (proiettiva? Insomma, la
proiezione di punti nello spazio sul piano visivo usando le rette che
passano per il fuoco); la cercavo 2D->2D e non 3D->2D perchè i punti
nello spazio che mi servono sono complanari e li ho in input espressi
secondo un sistema di riferimento cartesiano sul piano stesso. Questo
tipo ti proiezione è definito da posizione della camera, orientamento
e zoom (7 variabili); ma nel thread mi è stato spiegato come lo zoom
non sia determinante e come sia possibile definire l'orientamento
della camera con soli due parametri. Quindi si è parlato di 5
parametri per definire la mia trasformazione (caso particolare di
omografia?).

Ora, dato che il tipo di trasformazione che mi serviva dipende da soli
5 parametri, mi sono chiesto: avrei potuto fare tutto fissando 4
elementi della matrice invece di uno solo (i=1)?

--
Narcolessico
http://binaryunit.blogspot.com
bite
2008-03-25 22:28:36 UTC
Permalink
Post by Eugenio
Post by bite
Post by Aka
Scusatemi. ripesco il thread per una curiosità: dato che la
trasformazione in oggetto dipende da 5 parametri, ne basterebbero meno
di 8 nella matrice che vogliamo trovare? Perchè non fissiamo 4 invece
di 1 dei 9 valori?
--
Narcolessico
http://binaryunit.blogspot.com
Ma perché dici che dipende da 5 parametri? Un'omografia 2D in generale
dipende da 8 parametri.
La mia è una trasformazione prospettica (proiettiva? Insomma, la
proiezione di punti nello spazio sul piano visivo usando le rette che
passano per il fuoco); la cercavo 2D->2D e non 3D->2D perchè i punti
nello spazio che mi servono sono complanari e li ho in input espressi
secondo un sistema di riferimento cartesiano sul piano stesso. Questo
tipo ti proiezione è definito da posizione della camera, orientamento
e zoom (7 variabili); ma nel thread mi è stato spiegato come lo zoom
non sia determinante
lo zoom, ovvero la lunghezza focale, è determinante, e va a unirsi con
un'altra variabile che è il fattore di scala (ad esempio, il numeri di
pixel per mm). Per cui nei conti compare il loro prodotto - ma
compare. Abbi pazienza ma non ho gran voglia di rileggere tutto il
thread alla ricerca di questa affermazione, ma penso che ci sia stato
un fraintendimento.
Post by Eugenio
e come sia possibile definire l'orientamento
della camera con soli due parametri.
Con due parametri è possibile determinare la direzione dell'asse
ottico, ma attorno a quest'asse la fotocamera può ancora ruotare, e
questo ha effetto sull'immagine, perbacco. Insomma, gli angoli di
Eulero sono tre, non due.
Post by Eugenio
Quindi si è parlato di 5
parametri per definire la mia trasformazione (caso particolare di
omografia?).
Inoltre ne dimentichi uno: il cosiddetto skew. I pixel potrebbero non
essere quadrati o rettangolari, ma romboidali.
Post by Eugenio
Ora, dato che il tipo di trasformazione che mi serviva dipende da soli
5 parametri, mi sono chiesto: avrei potuto fare tutto fissando 4
elementi della matrice invece di uno solo (i=1)?
Quindi alla fine sommando abbiamo:

6 parametri per posizione e orientazione della fotocamera (3
componenti di un vettore di posizione + 3 angoli di Eulero)
fuoco*fattore di scala = 1 parametro se il fattore di scala è
isotropo, 2 nel caso più generale.
skew = 1 parametro
posizione della proiezione del centro ottico ("punto principale") sul
piano del sensore = 2 parametri
totale: 11 parametri nel caso più generale

Però se non ti interessa la fotocamera ma solo l'omografia, cioé la
relazione tra punti oggetto (su un piano) e punti immagine (su un
altro piano, quello del sensore), intervengono delle condizioni che
riducono il numero di parametri.
- Puoi aumentare fuoco*fattore di scala ed aumentare in proporzione la
distanza dell'oggetto dal centro ottico lungo l'asse ottico: per la
similitudine tra triangoli, non cambia nulla.
- Puoi inclinare la fotocamera in due direzioni (mantenendo fisso il
centro ottico) e cambiare di concerto un fattore di scala
(anisotropo), non cambia nulla.
totale: tre condizioni; 11-3 = 8.
Post by Eugenio
--
Narcolessico
http://binaryunit.blogspot.com
Inoltre tieni presente che in generale non è consigliabile "fissare" p
elementi della matrice nxn se sai che ci sono solo n*n-p gradi di
libertà. Se ad esempio fissi a 1 un elemento che è zero o prossimo
allo zero, sballi tutto. Il metodo corretto è determinare il nullspace
della matrice.

Queste cose le trovi ad esempio in:
Faugeras, Three-dimensional Computer Vision - a geometric viewpoint,
The MIT Press
Hartley & Zissermann, Multiple View Geometry, Cambridge University
Press

(testi che purtroppo non sono disponibili online).
Eugenio
2008-03-26 12:30:27 UTC
Permalink
Ti ringrazio per la spiegazione, ma purtroppo non sono in grado di
rispondere prima di andare a rivedere qualche libro (vedrò se trovo
quello che mi hai consigliato. Se qualcuno della prima parte della
discussione (El Filibustero?) si trovasse a passare di qui, sarei
lieto di leggere una spiegazione delle precedenti affermazioni, che
forse evidentemente ho frainteso.
Post by bite
Post by Eugenio
e come sia possibile definire l'orientamento
della camera con soli due parametri.
Con due parametri è possibile determinare la direzione dell'asse
ottico, ma attorno a quest'asse la fotocamera può ancora ruotare, e
questo ha effetto sull'immagine, perbacco. Insomma, gli angoli di
Eulero sono tre, non due.
Certo, la rotazione attorno all'asse focale ha effetto sull'immagine;
ma (sempre SE avevo capito bene i post precedenti) tale rotazione
potrebbe essere "inclusa" in altri valori della matrice. Ovvero, data
la matrice di una trasformazione prospettica, è sempre possibile
costruire un'altra matrice che definisca la medesima trasformazione
senza la necessità di avere 8 gradi di libertà (ma fissando
arbitrariamente più di un elemento).

Forse avevo capito male io. In altre parole: se ti definisco una
trasformazione prospettica (es. tramite posizione e orientazione della
camera nello spazio, zoom, etc etc) quanti elementi della matrice 3x3
posso fissare (con valori arbitrari o con valori specifici, questo non
lo so) in modo che tu, con i restanti elementi, sia sempre in grado di
definire la medesima trasformazione? Mi sembra di capire che per
un'omografia generica la risposta sia 1, mentre per una trasformazione
prospettica forse qualcosa in meno.

Narcolessico
http://binaryunit.blogspot.com
bite
2008-03-26 13:35:59 UTC
Permalink
Post by Eugenio
Ti ringrazio per la spiegazione, ma purtroppo non sono in grado di
rispondere prima di andare a rivedere qualche libro (vedrò se trovo
quello che mi hai consigliato. Se qualcuno della prima parte della
discussione (El Filibustero?) si trovasse a passare di qui, sarei
lieto di leggere una spiegazione delle precedenti affermazioni, che
forse evidentemente ho frainteso.
Post by bite
Post by Eugenio
e come sia possibile definire l'orientamento
della camera con soli due parametri.
Con due parametri è possibile determinare la direzione dell'asse
ottico, ma attorno a quest'asse la fotocamera può ancora ruotare, e
questo ha effetto sull'immagine, perbacco. Insomma, gli angoli di
Eulero sono tre, non due.
Certo, la rotazione attorno all'asse focale ha effetto sull'immagine;
ma (sempre SE avevo capito bene i post precedenti) tale rotazione
potrebbe essere "inclusa" in altri valori della matrice. Ovvero, data
la matrice di una trasformazione prospettica, è sempre possibile
costruire un'altra matrice che definisca la medesima trasformazione
senza la necessità di avere 8 gradi di libertà (ma fissando
arbitrariamente più di un elemento).
no, ripeto: gli angoli di Eulero sono tre, indipendenti.
Post by Eugenio
Forse avevo capito male io. In altre parole: se ti definisco una
trasformazione prospettica (es. tramite posizione e orientazione della
camera nello spazio, zoom, etc etc) quanti elementi della matrice 3x3
posso fissare (con valori arbitrari o con valori specifici, questo non
lo so) in modo che tu, con i restanti elementi, sia sempre in grado di
definire la medesima trasformazione? Mi sembra di capire che per
un'omografia generica la risposta sia 1, mentre per una trasformazione
prospettica forse qualcosa in meno.
Se piazzi una vera fotocamera (lasciami trascurare solo le
distorsioni, per il momento) davanti a un oggetto planare su cui sono
riconoscibili dei punti, allora sul sensore, pure esso planare, si
formeranno le immagini di quei punti. Quindi l'omografia 2D è
completamente determinata (sempre a parte la solita costante
moltiplicativa che non ha effetto pratico, perché si elimina quando
vai a dividere le coordinate omogenee: X/W e Y/W, per ottenere le
coordinate cartesiane).

Inoltre, per quanto detto nel post precedente, ripeto che mi sembra
fuorviante dire "quanti _elementi_ della matrice 3x3 posso fissare".
Non ne puoi fissare neanche uno, perché se lo fissi a 1 e poi risulta
che doveva essere 0, hai sbagliato clamorosamente. Io direi invece che
la famosa matrice 3x3 che rappresenta l'omografia tra i punti
sull'oggetto e i punti sul sensore ha un nullspace di dimensione 1,
che corrisponde alla famosa costante moltiplicativa. Cioè esiste un
vettore v (non nullo) tale che kv è soluzione del sistema omogeneo per
qualsiasi k reale. Mi perdonino i matematici per la mia sbrigatività
e, se ne hanno voglia, mi segnalino eventuali errori.

A mio parere stai perdendo tempo a reinventare la ruota, e fino adesso
ti è venuta anche un po' spigolosa :) Leggiti qualche testo, il
migliore secondo me è Hartley+Zisserman, ti sembrerà di perdere tempo
all'inizio ma ne risparmierai enormemente di più dopo.
Post by Eugenio
Narcolessico
http://binaryunit.blogspot.com
bite
2008-03-17 13:13:13 UTC
Permalink
Post by Narcolessico
Leggo qui
http://en.wikipedia.org/wiki/Projective_geometry#Projective_transform...
che una trasformazione prospettica da R^2 in R^2 è una biiezione tra punti
rappresentata da... una matrice 3x3.
Ma come si fa a moltiplicare un punto (matrice 2x1) per una matrice 3x3?
Risposte ad alcune delle domande che hai fatto le trovi qui:
http://www.cs.unc.edu/~marc/tutorial/
(so che ne esiste anche una versione pdf liberamente downloadabile ma
in questo momento non la trovo).

Suggerisco anche queste poche paginuzze, a mio parere molto chiare,
sulla geometria proiettiva: http://robotics.stanford.edu/~birch/projective/
Loading...