- Messaggi: 169
- Ringraziamenti ricevuti 8
Altra cosa non chiara è perchè cerchi di stimare la rotazione tra le due foto, se hai a disposizione le due matrici camera K1, K2 relative alle due immagini Apollo, quindi con K1,K2: R^3-->P^2 che ad ogni punto della tua ricostruzione 3D associano il corrispondente punto sulle due immagini Apollo, allora l'omografia H fra l'immagine 1 e la 2 è H12=K2 K1^-1 e non c'è bisogno di stimare la rotazione.
F = focale in pixel
px = lato immagine in px
matrice calibrazione camera K = [ [ F, 0, px/2 ], [ 0.0, F, px/2 ], [ 0.0, 0.0, 1.0 ] ]
Kn = Rn * K
(R: matrice rotazione associata alla camera n)
H = K2*K1^1
Accedi al sito per partecipare alle discussioni.
Così ad occhio direi che una prima correzione sarebbe questa:doktorenko ha scritto: Ho provato cosi`:
... Kn = Rn * K (R: matrice rotazione associata alla camera n)
La matrice di trasformazione H 1->2:
H = K2*K1^1
Funziona, ma solo per due angoli su tre.
Kn=K*Rn
Idem! Ho studiato geometria proiettiva astratta, la computer grafica è un tantino più improntata all'aspetto pratico...La mia difficolta` principale e` che di questi argomenti non ho trovato molte informazioni; devo quindi procedere per intuito e tentativi.
Accedi al sito per partecipare alle discussioni.
1) per prima cosa si individuano dei punti nell`immagine di riferimento A e quelli corrispondenti nell`immagine da raddrizzare B (punti An e Bn).
1b) i punti An devono essere "mobili" (subire la parallasse dovuta allo spostamento della camera), e giacere sullo stesso piano.
2) si stima una prima matrice omografica H: H*B=A; Cn=H*Bn
3) con la forza bruta (ma si possono usare anche altri metodi) si corregge H finche` le rette rn:(Cn,An) non convergono nello stesso punto O.
A1 (1868.11769988769, 692.883470019046)
A2 (1990.48521852825, 775.234380818113)
A3 (2435.06354430023, 864.774779267219)
B1 (2427.28841864788, 727.392232676494)
B2 (2543.57337446140, 848.159902761366)
B3 (3045.03522141262, 984.230141465186)
Matrice omografica:
H = [[1.0087217782, 0.0492298329, -224.6818216166],
[-0.0048663276, 1.0336044935, -441.518876724],
[0.0000043189, 0.0000177307, 0.9504399531]]
Accedi al sito per partecipare alle discussioni.
Inizio dalla fine: se intendi la traslazione della camera non puoi tenerne conto tramite un'omografia perchè ti serve un'omografia nello spazio 3D. Ma questo aspetto è secondario rispetto a quanto scrivi nella prima parte. Siccome la questione tecnica è parecchio più complessa di come l'hai messa giù risponderò dopo aver studiato bene la questione, onde evitare di risponderti con sciocchezze. Nel frattempo però potresti iniziare anche tu a pensare bene a quello che vuoi effettivamente ottenere, per esempio quando dici:doktorenko ha scritto: Pero` ho un dubbio: nel calcolare la correzione della matrice H come nel punto 2, devo tener conto anche della traslazione o solo della rotazione?
Ora finchè assumevamo lo sfondo fisso potevamo cercare un'omografia tale che A=H*B a patto che con A e B si intendano le porzioni comuni di sfondo fra le due immagini, se anche lo sfondo ha parallasse non esiste nessun punto per cui valga la relazione sopra, per definizione.si stima una prima matrice omografica H: H*B=A
Accedi al sito per partecipare alle discussioni.
x: 2.7478 m
y: -7.67029 m
z: 1.68243 m
ax: 103.251°
ay: 0.798°
az: 34.739°
ax: 101°
ay: 2.5°
az: -44.8°
75.672°
90.171°
Accedi al sito per partecipare alle discussioni.
Per questo ti invitavo a chiarire quello che vuoi ottenere! Applicando omografie "casuali" puoi far convergere le rette in molti modi, e verso punti diversi. Prima di parlare meglio dei procedimenti per ricostruire la scena 3D è il caso di linkare questa esposizione dell'argomento, molto chiara e non eccessivamente tecnica (per confronto questa invece è un'esposizione tecnica), in un prossimo messaggio voglio esporre la sintesi con allegato l'esempio pratico fatto sulle due foto Apollo 15.doktorenko ha scritto: la fase 2 (forza bruta) funziona, pero` trova piu` combinazioni di angoli per cui le rette individuate concorrono: a me invece servirebbe una posizione unica.
Accedi al sito per partecipare alle discussioni.
Forse potrebbe esserti utile questo sito www.ehartwell.com/LM/SCATSystems.htmdoktorenko ha scritto: Sto ricostruendo il modulo (semplificato) perche` i modelli liberamente disponibili mi sembrano poco accurati nelle misure.
Accedi al sito per partecipare alle discussioni.
l'=F*x
l=F^T*x'
1) x'^T*F*x=0
x1'^T*F*x1=0
......
x7'^T*F*x7=0
F=S+A
S=(F+F^T)/2
A=(F-F^T)/2
F*e=0
F^T*e'=0
Accedi al sito per partecipare alle discussioni.
sift = cv2.SIFT()
sift = cv2.xfeatures2d.SIFT_create()
array([[ 1.54590733e-08, 1.31312522e-06, -2.31504371e-03],
[ -1.29520987e-06, 7.64118313e-08, -1.06896770e-03],
[ 2.74047832e-03, 5.50595730e-04, 1.00000000e+00]])
F=np.matrix([[0.0002249705489,0.02234261333,-0.1725523678],\
[-0.01959259243,0.005407583090,-0.2555901116],\
[0.2428871895,0.2098212272,1]])
S=(F+F.transpose())/2
A=(F-F.transpose())/2
M=np.delete(np.array(F),1,0)
a=M[:,:-1]
b=-M[:,2]
x,y=np.linalg.solve(a,b)
M=np.delete(np.array(F).transpose(),1,0)
a=M[:,:-1]
b=-M[:,2]
X,Y=np.linalg.solve(a,b)
>>> x
-10.883432648836861
>>> y
7.8326029740642245
>>> X
-12.357155656359714
>>> Y
12.254998631089576
>>> px=4175
>>> mm=55.44
>>> X/px*mm
-7.1978876554283415
>>> Y/px*mm
28.010637232681304
>>> x/px*mm
-9.5717150249253162
>>> y/px*mm
23.523676064212165
Accedi al sito per partecipare alle discussioni.
F=np.matrix([[ 1.57550907e-05, -7.16872070e-05, 1.09271677e-01],
[ 7.84514021e-05, -8.04395058e-06, -2.95069542e-02],
[ -1.72668082e-01, 5.65996434e-02, 1.00000000e+00]])
e= (544.7,1644)
e'= (555, 2089.5)
S=(F+F.transpose())/2
a11,a12,a13,a12,a22,a23,a13,a23,a33=np.array(S).flatten()
print ("%.9fx^2+2 * %.9fxy+%.9fy^2+2 * %.9fx+2 * %.9fy+%.9f=0" % (a11,a12,a22,a13,a23,a33) )
>>> 0.000015755x^2+2 * 0.000003382xy+-0.000008044y^2+2 * -0.031698203x+2 * 0.013546345y+1=0
A1(342, 2184) B1(364, 2485)
A2(583, 951) B2(677, 1375)
A3(910, 1488) B3(948, 1867)
A4(844, 2629) B4(737, 2860)
Accedi al sito per partecipare alle discussioni.
No, la soluzione è una sola e visto che quella che ho trovato è verificata empiricamente con le intersezioni dei punti (seppure approssimate), la soluzione reale deve essere molto vicina.doktorenko ha scritto: Allora anche questa soluzione dovrebbe andare bene? e come si fa a passare dalla matrice S all`equazione della conica?
X^T*S*X=0
Accedi al sito per partecipare alle discussioni.
import numpy as np
import cv2
pts1 = np.array(\
[[ -15.21, 7.15],\
[ -12.95, 5.57],\
[ -9.77,7.73],\
[ -8.05, 7.65],\
[ -2.88, 0.8],\
[ 9.63, 8.17],\
[ 12.13, 8.86]])
pts2 = np.array(\
[[ -16.23, 11.48],\
[ -13.75, 9.74],\
[ -10.44, 12.08],\
[ -8.5, 12.02],\
[ -2.78, 4.62],\
[ 11.51, 12.98],\
[ 14.95, 13.98]])
F, mask = cv2.findFundamentalMat(pts1,pts2,cv2.FM_LMEDS)
F=np.matrix(F[0:3])
>>> F
matrix([[ 2.24970008e-04, 2.23427304e-02, -1.72553143e-01],
[ -1.95926949e-02, 5.40761741e-03, -2.55590089e-01],
[ 2.42888271e-01, 2.09820763e-01, 1.00000000e+00]])
>>> x, y
(-10.883362887762464, 7.8325956676863848)
>>> X,Y
(-12.357087076459413, 12.254990884928457)
Accedi al sito per partecipare alle discussioni.
doktorenko ha scritto: Le differenze tra i due grafici dovrebbero essere:
1) i miei calcioli sono i pixel e non in mm (10 mm = 753 px)
2) il centro dell`immagine non e` all`origine degli assi ma a O(4175/2, 4175/2)
3) l`asse y e` positivo verso il basso (convenzione delle immagini informatiche)
4) forse ho usato come riferimento l`altra immagine rispetto alla tua (ordine dei punti e-e')
5) la precisione nell`individuazione dei punti di OpenCV e ` intera.
Sono andato a memoria, mi pareva di ricordare che la pellicola fosse 40x40. Questo però non modifica la sostanza dei calcoli fatti sopra, è solo un cambio di unità di misura. Già che ci siamo, qual era la dimensione effettiva della pellicola?p.s.
come hai fatto a calcolare la dimensione di 40 mm di lato? Perche` io la tua non la vedo tagliata: i 40 mm corrispondo al quadrato interno alla griglia di 5x5 crocette.
Accedi al sito per partecipare alle discussioni.
px=4175.
mm=55.44
pts1=(((pts1-px/2)*[1,-1])*55.44)/px
pts2=(((pts2-px/2)*[1,-1])*55.44)/px
F, mask = cv2.findFundamentalMat(pts1,pts2,cv2.FM_LMEDS)
>>> F
matrix([[ 7.17589983e-05, -5.93437573e-03, 2.09125440e-02],
[ 5.89581319e-03, 3.53392050e-04, 2.15287984e-01],
[ 1.01037585e-02, -2.04270651e-01, 1.00000000e+00]])
c: 0.29x² - 0.16x y + 1.43y² + 127.06x + 45.14y = -4096
spazio (10 mm) tra due crocette = 753 px
dimensione immagine: 4175 px
4175 px / 753 px * 10 mm = 55.44 mm
Accedi al sito per partecipare alle discussioni.
lunghezza focale f = 0.0611 m
sensore f = 0.05544 m
K=np.matrix([ [ f, 0, l/2 ], [ 0.0, f, l/2 ], [ 0.0, 0.0, 1.0 ] ])
E = K**-1* F * K
points, R, t, mask = cv2.recoverPose(E, pts1, pts2)
>>> R
array([[ 0.99302249, -0.11715838, 0.01342568],
[ 0.11557984, 0.94435246, -0.30796062],
[ 0.0234016 , 0.30736355, 0.95130437]])
>>> t
array([[-0.99929059],
[-0.03747715],
[ 0.00371336]])
X = cv2.triangulatePoints( P1, P2, pts1.transpose(), pts2.transpose() )
X /= X[3]
K: matrice calibrazione 3x3
R: matrice rotazione 3x3
t: traslazione 3x1
P= K*[R|t]
Accedi al sito per partecipare alle discussioni.
Questo è l'obiettivo dichiarato di tutta la procedura, ma è anche l'ultimo dei problemi, note le matrici fondamentale e essenziale come si fa è spiegato qui . Uno dei problemi veri è che se non si conosce almeno una misura sulla scena reale, sia questa la distanza fra i due scatti o le coordinate 3D di un punto, non ci sono santi nè madonne nè opencv che possano fare il calcolo. Il vettore spostamento fra i due scatti è noto solo a meno di un fattore di proporzionalità, vale a dire che si può conscere solo la retta della spostamento, per ricavare i numeri giusti pensavo di usare le misure della larghezza del lunar rover.doktorenko ha scritto: Sto cercando di capire come ricavare i punti Pxyz partendo dai punti corrispondenti Puv e P'uv.
Accedi al sito per partecipare alle discussioni.
FranZeta ha scritto: Questo è l'obiettivo dichiarato di tutta la procedura, ma è anche l'ultimo dei problemi, note le matrici fondamentale e essenziale come si fa è spiegato qui . Uno dei problemi veri è che se non si conosce almeno una misura sulla scena reale, sia questa la distanza fra i due scatti o le coordinate 3D di un punto, non ci sono santi nè madonne nè opencv che possano fare il calcolo.
Il vettore spostamento fra i due scatti è noto solo a meno di un fattore di proporzionalità, vale a dire che si può conscere solo la retta della spostamento, per ricavare i numeri giusti pensavo di usare le misure della larghezza del lunar rover.
(sx2, sy2, 1) = K(R|lambda*T)(X,Y,Z)
Si`, ho sbagliato a copiarla:PS A me risulta E=K'^T*F*K, se K'=K: E=K^T*F*K.
E=cv2.findEssentialMat(pts1,pts2,focale,(cx,cy))[0]
l_px=4175.
f_mm=61.1
l_mm=55.44
f_px=f_mm/l_mm*l_px
K=np.matrix([ [ f_px, 0, l_px/2 ], [ 0.0, f_px, l_px/2 ], [ 0.0, 0.0, 1.0 ] ])
E=cv2.findEssentialMat(pts1,pts2,f,(px/2,px/2))[0]
points, R, t, mask = cv2.recoverPose(E, pts1, pts2)
>>> R
array([[ 0.99953627, -0.01286357, 0.02760033],
[ 0.01063138, 0.99677412, 0.07955081],
[-0.02853461, -0.07922049, 0.99644864]])
>>> t
array([[-0.49655057],
[ 0.00879161],
[ 0.86796327]])
R1 = np.eye(3)
R2 = R
t1=np.zeros(3)[:,np.newaxis]
t2=t
P1=np.matmul(K,np.hstack((R1,t1)))
P2=np.matmul(K,np.hstack((R2,t2)))
X = cv2.triangulatePoints( P1[:3], P2[:3], pts1.transpose(), pts2.transpose() )
X /= X[3]
Accedi al sito per partecipare alle discussioni.
Accedi al sito per partecipare alle discussioni.
FranZeta ha scritto: Come vedi ci sono differenze non marginali con i tuoi risultati, prima di pensare a ricostruire la scena 3D sarebbe meglio verificare il tutto, quando riesco faccio una gif delle due immagini sovrapposte dopo la rotazione, mi sembra il controllo migliore, però sulla parte precedente dei calcoli (conica ed epipoli) ho pochi dubbi, fossi in te verificherei se con i tuoi dati ottieni risultati simili, per esempio se ti risultano ancora gli epipoli fuori dall'immagine c'è qualcosa che non va.
Accedi al sito per partecipare alle discussioni.
T=[-.500, .070, .863]
[0,999634149 0,020790914 -0,017300485]
R=[-0,022218207 0,995971755 -0,086871252]
[0,015424662 0,087223856 0,996069314]
ax=0.0873
ay=0.0154
az=-0.0222
[.1565203692e-3 .1002680620e-1 .2953812161e-2]
F=[-.1035880582e-1 .2305792649e-2 -.2592214824]
[.4094473436e-1 .2480372470 1.]
[.3041773160 19.48581526 .1302149517]
E=[-20.13101405 4.481013067 -11.42744053]
[1.804995144 10.93439812 1.]
%projHper4pt.m
%trasformazione proiettiva della foto img2 per sovrapporla
%a img1 mediante corrispondenza di 4 punti sullo sfondo. Le coordinate dei
%punti sono in pixel così come compaiono sull'immagine (es. il centro
%dell'immagine ha coordinate (sizex/2,sizey/2)).
%Trascrive le immagini finali nella cratella work
fixed = imread('D:\Immagini\Temp\img1.jpg');
moving = imread('D:\Immagini\Temp\img2.jpg');
fixedPoints=input('fixedPoints=[.. ..;.. ..;.. ..;.. ..]');
movingPoints=input('movingPoints=[.. ..;.. ..;.. ..;.. ..]');
tform = fitgeotrans(movingPoints, fixedPoints, 'projective');
registered = imwarp(moving, tform,'FillValues', 255);
figure, imshow(registered);
Rfixed = imref2d(size(fixed));
registered1 = imwarp(moving,tform,'FillValues', 255,'OutputView',Rfixed);
figure, imshowpair(fixed,registered1,'blend');
blend=imfuse(fixed,registered1,'blend');
imwrite(blend,'imgblend.jpg');
imwrite(fixed,'img1.jpg');
imwrite(registered1,'img2.jpg');
%projH.m
%carica le due immagini img1, img2 dalla cartella D:\Immagini\Temp, applica
%l'omografia H a img2, permette di traslare la seconda immagine per
%sovrapporla alla prima e salva le immagini finali nella cartella work
fixed = imread('D:\Immagini\Temp\img1.jpg');
moving = imread('D:\Immagini\Temp\img2.jpg');
SIZE=size(moving);
a=SIZE(2)/2;b=SIZE(1)/2;
T1=[[1 0 -a];[0 1 -b];[0 0 1]];
T2=[[1 0 a];[0 1 b];[0 0 1]];
H=input('omografia H=?');
H=H'
H1=H;
H1(:,1)=1/a*H1(:,1);H1(:,2)=1/b*H(:,2);
H2=[[a 0 0];[0 b 0];[0 0 1]];
H3=T2*H2*H1*T1;
tform=projective2d(H3');
registered = imwarp(moving, tform,'FillValues', 255);
figure, imshow(registered);
Rfixed = imref2d(size(fixed));
registered1 = imwarp(moving,tform,'FillValues', 255,'OutputView',Rfixed);
figure, imshowpair(fixed,registered1,'blend');
check=input('traslare la seconda immagine? 1=SI 0=NO....');
while check > 0
tx=input('tx=?');
ty=input('ty=?');
T2=[[1 0 a+tx];[0 1 b+ty];[0 0 1]];
H3=T2*H2*H1*T1;
tform=projective2d(H3');
registered1 = imwarp(moving,tform,'FillValues', 255,'OutputView',Rfixed);
figure, imshowpair(fixed,registered1,'blend');
check=input('traslare ancora la seconda immagine? 1=SI 0=NO....');
end
A=imfuse(fixed,registered1,'blend');
imwrite(A,'imgblend.jpg');
imwrite(fixed,'img1.jpg');
imwrite(registered1,'img2.jpg');
Accedi al sito per partecipare alle discussioni.
Questo ci porta anche a concludere che la parallasse per gli oggetti più lontani della scena deve essere in ogni caso molto contenuta, anche se lo sfondo si trovasse solo a qualche decina di metri e non km. Tra l'altro la possibilita di discernere lo sfondo dagli altri elementi è un'altra di quelle facoltà che abbiamo noi ma non gli algoritmi.
Accedi al sito per partecipare alle discussioni.
Lo spostamento è praticamente identico, se escludiamo improbabili coincidenze direi che è confermato. La conica e gli epipoli sono solo qualitativamente simili, si assomigliano soltanto. Questo comporta differenze sostanziali nelle rotazioni trovate, sicuramente quella che trovo io è più sbagliata, ma la differenza fra le due rotazioni e fra queste e la rotazione effettiva sembra sempre essere attorno all'asse z, la direzione della fotocamera. Avevo pensato di provare a correggere manualmente queste rotazioni in eccesso ma non avrebbe molto senso.doktorenko ha scritto: Comunque, da quello che ho capito, tu confermi il risultato dell`algoritmo di OpenCV? Io direi che e` comprovato anche dalla ricostruzione tridimensionale mediante triangolazione dei punti, a prima vista sufficientemente corretta.
Qui non ti seguo molto. Da quello che ho capito l'algoritmo trova una marea di punti corrispondenti, molti di questi saranno punti dello sfondo. In realtà non è una pecca usare i punti lontani, anzi, più sono lontani maggiore è la precisione nel determinare la rotazione, questo indipendentemente dal fatto che lo sfondo sia vero o finto, di sicuro i punti dello sfondo sono i più lontani che si vedono nell'immagine.Ricostruzione che non ottengo (in nessun modo, neanche approssimativo) ricavando gli angoli della camere con la collimazione di punti lontani (crateri sullo sfondo).
Questo mi sembra un punto interessante da approfondire.
Accedi al sito per partecipare alle discussioni.
Con una omografia e` possibile ottenere, da due foto prese da posizioni leggermente diverse, una coppia di immagini stereoscopiche "raddrizzando" una di esse.
premessa teorica:
a) la proiezione dell'immagine sul piano del sensore introduce una deformazione (di tipo appunto proiettivo)
b) due scatti (A e B) presi dallo stesso punto, ma con diversa angolazione, proiettano diversamente (sul piano del sensore) la stessa porzione sovrapponibile dell'inquadratura (Ab, Ba)
c) posso trasformare Ab in Ba (e viceversa) a tavolino, applicando una matrice di deformazione 3x3 ad Ab o a Ba
d) Ab e Ba sono quindi omografie
Metodo Oleynik:
1) calcolo di milioni di H con la forza bruta
2) si sceglie la matrice H che fa coincidere il massimo numero di punti S1h e S2
3) il risultato finale non è soddisfacente (non ci sono abbastanza punti in sovrapposizione)
4) S1 e S2 non sono quindi omografie
conclusione:
5) S subisce la parallasse (o anche altre deformazioni)
possibili obiezioni:
1) O. ha sbagliato a calcolare H (non dettaglia l'operazione)
2) le deformazioni sono introdotte dalla lente
Accedi al sito per partecipare alle discussioni.
HumanClone ha scritto: Sono d'accordo sul fatto che gli anaglifi non permettono di misurare la pendenza dei dislivelli, ma quantomeno permettono di apprezzarne la presenza e smentire chi parla di campo da tennis. Cioè sono probanti in senso qualitativo ma non quantitativo.
"A mano", come avevo provato a fare in questo thread, no di certo, anche perchè la distanza tra le due foto è talmente piccola che non porterebbe a nulla di significativo. L'errore sarebbe troppo grande rispetto ai piccoli dislivelli che vorremmo misurare, inoltre sarebbe del tutto inutile per la zona dell'ombra del LEM che, ripeto, è la causa dei problemi con le ombre. Però - e qui entra in causa doktorenko - se guardi qualche commento più sopra vedrai che ci sarebbe un programmino già bello pronto che fa questo tipo di analisi. Io non riesco a farlo girare perchè mi mancano delle librerie, inoltre con Python sono una completa frana e non mi ci metto neanche lì, ma se doktorenko volesse fare la prova potremmo avere qualche dato in più sulla reale conformazione del terreno in primo piano. Anche se, ripeto, le immagini sono davvero molto vicine, dubito che ne esca fuori qualcosa di utile.Quindi farai un'analisi fotogrammetrica della scena?
Accedi al sito per partecipare alle discussioni.
FranZeta ha scritto: Però - e qui entra in causa doktorenko - se guardi qualche commento più sopra vedrai che ci sarebbe un programmino già bello pronto che fa questo tipo di analisi. Io non riesco a farlo girare perchè mi mancano delle librerie, inoltre con Python sono una completa frana e non mi ci metto neanche lì, ma se doktorenko volesse fare la prova potremmo avere qualche dato in più sulla reale conformazione del terreno in primo piano. Anche se, ripeto, le immagini sono davvero molto vicine, dubito che ne esca fuori qualcosa di utile.
Accedi al sito per partecipare alle discussioni.
No più che altro mi riferivo a questo codice che ricava la matrice fondamentale della coppia di immagini, poi da quella si può trovare lo spostamento fra i due scatti ed eventualmente la reale posizione di alcuni punti vicini. L'immagine che generava dovrebbe essere questa:doktorenko ha scritto: Ti riferisci a quest'immagine?
Accedi al sito per partecipare alle discussioni.
array([[ 3.00659770e-08, -2.61855429e-06, 1.14838140e-02],
[ 2.61810120e-06, 2.75747709e-08, -1.30691859e-02],
[-1.21837463e-02, 1.33374620e-02, 1.00000000e+00]])
>>> len(pts1)
5159
>>> px=3900
>>> f_mm=61.1
>>> l_mm=55.44
>>> f_px=f_mm/l_mm*px
>>> E=cv2.findEssentialMat(pts1,pts2,f_px,(px/2,px/2))[0]
>>> E
array([[ 7.95300899e-03, -7.06852016e-01, -1.51034058e-02],
[ 7.06889467e-01, 7.80103436e-03, 1.24125113e-02],
[-9.70207321e-03, 8.19079896e-03, 8.55695945e-06]])
>>> points, R, t, mask = cv2.recoverPose(E, pts1, pts2)
>>> R
array([[ 0.99951476, 0.01062017, 0.0292823 ],
[-0.01164179, 0.99932154, 0.03494172],
[-0.02889134, -0.03526566, 0.99896027]])
>>> t
array([[0.01173584],
[0.01359077],
[0.99983877]])
Accedi al sito per partecipare alle discussioni.
import numpy as np
import cv2
from matplotlib import pyplot as plt
def drawlines(img1,img2,lines,pts1,pts2):
''' img1 - image on which we draw the epilines for the points in img2
lines - corresponding epilines '''
r,c = img1.shape
img1 = cv2.cvtColor(img1,cv2.COLOR_GRAY2BGR)
img2 = cv2.cvtColor(img2,cv2.COLOR_GRAY2BGR)
for r,pt1,pt2 in zip(lines,pts1,pts2):
color = tuple(np.random.randint(0,255,3).tolist())
x0,y0 = map(int, [0, -r[2]/r[1] ])
x1,y1 = map(int, [c, -(r[2]+r[0]*c)/r[1] ])
img1 = cv2.line(img1, (x0,y0), (x1,y1), color,1)
img1 = cv2.circle(img1,tuple(pt1),5,color,-1)
img2 = cv2.circle(img2,tuple(pt2),5,color,-1)
return img1,img2
img1 = cv2.imread('as14-68-9487.jpg',0) #queryimage # left image
img2 = cv2.imread('as14-68-9486.jpg',0) #trainimage # right image
sift = cv2.xfeatures2d.SIFT_create()
# find the keypoints and descriptors with SIFT
kp1, des1 = sift.detectAndCompute(img1,None)
kp2, des2 = sift.detectAndCompute(img2,None)
# FLANN parameters
FLANN_INDEX_KDTREE = 1
index_params = dict(algorithm = FLANN_INDEX_KDTREE, trees = 5)
search_params = dict(checks=50)
flann = cv2.FlannBasedMatcher(index_params,search_params)
matches = flann.knnMatch(des1,des2,k=2)
good = []
pts1 = []
pts2 = []
# ratio test as per Lowe's paper
for i,(m,n) in enumerate(matches):
if m.distance < 0.8*n.distance:
good.append(m)
pts2.append(kp2[m.trainIdx].pt)
pts1.append(kp1[m.queryIdx].pt)
pts1 = np.int32(pts1)
pts2 = np.int32(pts2)
F, mask = cv2.findFundamentalMat(pts1,pts2,cv2.FM_LMEDS)
# We select only inlier points
pts1 = pts1[mask.ravel()==1]
pts2 = pts2[mask.ravel()==1]
lines1 = cv2.computeCorrespondEpilines(pts2.reshape(-1,1,2), 2,F)
lines1 = lines1.reshape(-1,3)
img5,img6 = drawlines(img1,img2,lines1,pts1,pts2)
# Find epilines corresponding to points in left image (first image) and
# drawing its lines on right image
lines2 = cv2.computeCorrespondEpilines(pts1.reshape(-1,1,2), 1,F)
lines2 = lines2.reshape(-1,3)
img3,img4 = drawlines(img2,img1,lines2,pts2,pts1)
plt.subplot(121),plt.imshow(img5)
plt.subplot(122),plt.imshow(img3)
plt.show()
np.save("/tmp/punti1.npy",pts1)
np.save("/tmp/punti2.npy",pts2)
>>> F
array([[ 1.98602311e-08, 2.29862063e-07, -1.02489430e-03],
[-1.61345636e-07, -2.61852456e-09, -1.46165956e-03],
[ 7.70671415e-04, 1.15212704e-03, 1.00000000e+00]])
>>> R
array([[ 0.98192603, 0.00442368, 0.18921337],
[ 0.00119167, 0.9995625 , -0.02955327],
[-0.18926132, 0.02924461, 0.98149116]])
>>> t
array([[-0.67234328],
[ 0.24372482],
[ 0.69896547]])
>>> E
array([[ 0.03320617, 0.48898699, -0.18375618],
[-0.39533195, -0.0160898 , -0.56013648],
[ 0.16979116, 0.47597287, 0.01855876]])
Accedi al sito per partecipare alle discussioni.
Non mi torna. Da quello che avevi detto, avevo capito che a sovrapporsi dovesse essere solo la parte della scena a parallasse nulla, cioè lo sfondo. Bandiera e astronauta un po’ di parallasse ce l’hanno.per costruire l'anaglifo ho fissato la posizione della bandiera e dell'astronauta, in modo che coincidessero nelle due immagini da sovrapporre
Accedi al sito per partecipare alle discussioni.
In teoria si userebbe lo sfondo, ma dato che non ci sono riferimenti precisi e dato che non c'è assolutamente nessuna parallasse alla distanza della bandiera e dell'astronauta si può fare così. Per la precisione ho usato l'angolo del riquadro stellato e dello scarpone, puoi vedere da te che sono a parallasse zero anche nella tua immagine. Vediamo se riusciamo a misuarare la distanza fra i due scatti con i dati di doktorenko, ma sarà roba di qualche centimetro.HumanClone ha scritto: Non mi torna. Da quello che avevi detto, avevo capito che a sovrapporsi dovesse essere solo la parte della scena a parallasse nulla, cioè lo sfondo. Bandiera e astronauta un po’ di parallasse ce l’hanno.
Accedi al sito per partecipare alle discussioni.