Calibração de Câmera Como determinar o modelo e os parâmetros que transformam a radiância da cena 3D numa imagem digital É o processo inverso da camera de rendering Real e virtual com uma mesma camera Novos pontos de vista (novos elementos) Extração de feições min | pi f K ,R,T ( Pi ) | 2 K , R,T Extração de feições Calibração de camera min | pi f ( Pi ) |2 Matrizes de posicionamento Matrizes de projeção “CAMERAS” DE VISÃO E DO OPENGL Mudança de base (revisão) p uu vv ww p xi yj zk u ui i u j j uk k v vi i v j j vk k w wi i wj j wk k p uui i u j j uk k vvi i v j j vk k wwi i wj j wk k p uui vvi wwi i uuj vv j wwj j uuk vvk wwk k y x x ui y u j z u k vi vj vk wi u wj v wk w z u ui v vi w w i uj vj wj uk x vk y wk z Visão: matriz de parâmetros extrínsicos Pc Pw T Pw c X c i w i c Yc i w jc Z i k c w c X c i w i c Pc Yc i w jc Z i k c w c X c m11 Pc Yc m21 Z m c 31 X c ro Pc Yc r3 Z r c 6 X m14 w Y m24 w Z m32 m33 m34 w 1 X r1 r2 t x w Y r4 r5 t y w Z r7 r8 t z w 1 m12 m22 yc jw i c k w i c X w jw jc k w jc Yw jw k c k w k c Z w jw i c k w i c jw jc k w jc jw k c k w k c zc xc X t x w Yw t y t Z w z 1 pc t zw m13 m23 Pc R tP xw pw yw yim y’ x s x ( xim ox ) p s ( y o ) y y im y sx p' sy 3 oy 2 o 1 0 0 1 2 ox x’ 3 4 5 xim Projeção cônica simples X P Y Z y’ p z' x’ x' X n p y' Y z' Z Z n X x' n = X -Z Y y' x' x' = n X -Z y' n = Y -Z -Z n n z' x' y' z' y' = n Y -Z X s ( x o ) x x im x Z f p Y s ( y o ) y y im y Z f X xim ox sx Z f Y yim oy sy Z f sx wxim wy 0 im w 0 0 f sy 0 K ox X oy Y Z 1 Parâmetros intrínsecos com cisalhamento X xh f x sh ox y 0 f o Y y y h Z w 0 0 1 1 fx f fy f sx sy p KI3 0P [ fx f y sh ox oy ] Sem correção Com correção radiométrica Tipos de distorção radial k1 0 xd x(1 k1rd2 k2 rd4 ) x xd 1 k1rd2 k2 rd4 y yd 1 k1rd2 k2 rd4 yd y (1 k1rd2 k2 rd4 ) rd x y 2 d 2 d k1 0 k 2 k1 k2 0 Exemplo de distorção radial Imagem original Corrigida k1=0.11, k2=0.019 Com correção radiométrica e radial CALIBRAÇÃO Calibração de camera min | pi f ( Pi ) |2 Compondo as transformações [ p] K R T P parâmetros extrínsecos parâmetros intrínsecos wxim f x wy 0 im w 0 sh fy 0 ox i w i c o y i w jc 1 i w k c jw i c k w i c jw jc k w jc jw k c k w k c X w t x Yw t y t Z w z 1 Parâmetros intrínsecos com distorção radial x' xd (1 k r k r ) 2 1 d 4 2 d y ' yd (1 k r k r ) 2 1 d rd x y 2 d 4 2 d 2 d k 2 k1 k2 0 [ fx f y sh ox oy k1 ] Parâmetros extrínsecos • Translação –Tx, Ty, Tz (3 g.l.) • Rotação (3 g.l.) r11 r 21 r31 r12 r22 r32 r13 r33 r33 iw j w k w i w jw i w k w k w jw 0 i w i w jw jw k w k w 1 Calibração de câmera • Problema: obter os parâmetros extrínsecos (R, T) e intrínsecos (K) da transformação projetiva de câmera. • Dados: n pares de pontos correspondentes (Pi, pi) na cena e na imagem. Calibração de câmeras • Calibração estimação de parâmetros otimização min | pi f K ,R,T ( Pi ) | 2 K , R,T pontos da cena projeção (função não linear) pontos da imagem Proceedings of SIBGRAPI'98, Rio de Janeiro, Brazil, 1998, pp. 388-399. Equações de projeção Xc xim f x c ox Z Yc yim f y c o y Z X r11 c Y r21 Z c r31 c r12 r22 r32 0 ox X c wxim f x wy 0 f o Y c y y im w 0 0 1 Z c r13 X Tx r33 Y w Ty r33 Z w Tz w wxim f x wy 0 im w 0 0 fy 0 X r11 c Y r21 Z c r31 c ox r11 r12 o y r21 r22 1 r31 r32 r13 r23 r33 r12 r13 r22 r23 r32 r33 X w Tx w Y Ty w Z Tz 1 X w Tx w Y Ty w Z Tz 1 Equações de projeção wxim f x wy 0 im w 0 0 fy 0 ox r11 r12 o y r21 r22 1 r31 r32 wxim f x r11 ox r31 f x r12 ox r32 wy f r o r f r o r y 22 x 32 im y 21 x 31 w r31 r32 wxim m11 m12 wy m m22 im 21 w m31 m32 m13 m23 m33 r13 r23 r33 X w Tx w Y Ty w Z Tz 1 f x r13 ox r33 f y r23 ox r33 r33 X w m14 w Y m24 Z w m34 1 X w f xTx oxTz w Y f yTy oxTz Z w Tz 1 Calibração a partir da matriz Para cada ponto: ui m11 vi m21 w m i 31 xi yi m12 m13 m22 m23 m32 m33 X iw m14 w Y m24 i w Zi m34 1 m11 X iw m12Yi w m13 Z iw m14 m31 X iw m32Yi w m33 Z iw m34 m21 X iw m22Yi w m23 Z iw m24 m31 X iw m32Yi w m33 Z iw m34 y m m 0 m11 X iw m12Yi w m13 Z iw m14 xi m31 X iw m32Yi w m33 Z iw m34 0 m21 X iw m22Yi w m23 Z iw m24 i w w w X m Y m Z i i i 31 32 33 34 Calibração a partir da matriz Para cada ponto: y m m 0 m11 X iw m12Yi w m13 Z iw m14 xi m31 X iw m32Yi w m33 Z iw m34 0 m21 X iw m22Yi w m23 Z iw m24 i w w w X m Y m Z i i i 31 32 33 34 X iwm11 Yiwm12 Z iwm13 m14 xi X iwm31 xiYiwm32 xi m33 Z iw xi m34 0 X iwm21 Yiwm22 Z iwm23 m24 yi X iwm31 yiYiwm32 yi m33 Z iw y3i m34 0 m11 m 12 m m33 m34 Am 0 m 0 Reconstruindo as matrizes q4 q1 q2 q3 f x r11 ox r31 f y r21 ox r31 r31 m11 m 21 m31 m12 m13 m22 m32 m23 m33 f x r12 ox r32 f x r13 ox r33 f y r22 ox r32 r32 f y r23 ox r33 r33 2 2 2 q3 m31 m32 m33 Tz m34 m14 m24 m34 f xTx oxTz f yTy oxTz Tz r312 r322 r332 escolha 1 tal queTz 0 r31 m31, r32 m32 , r33 m33 Reconstruindo as matrizes q4 m11 m 21 m31 q1 q2 q3 f x r11 ox r31 f r o r y 21 x 31 r31 m12 m13 m22 m32 m23 m33 m14 m24 m34 f x r12 ox r32 f x r13 ox r33 f y r22 ox r32 r32 f y r23 ox r33 r33 q3 k c q1 f x i c oxk c q 2 f y jc o y k c f xTx oxTz f yTy oxTz Tz ox q1 q3 f x q1 q1 ox o y q 2 q3 f y q 2 q 2 oy Reconstruindo as matrizes q4 q1 q2 q3 f x r11 ox r31 f r o r y 21 x 31 r31 m11 m 21 m31 m12 m13 m22 m32 m23 m33 m14 m24 m34 f x r12 ox r32 f x r13 ox r33 f y r22 ox r32 r32 f y r23 ox r33 r33 r1i (ox m3i m1i ) / f x i 1,2,3 r2i (o y m3i m2i ) / f y i 1,2,3 Tx (ox m33 m14 ) / f x Ty (o y m33 m24 ) / f y f xTx oxTz f yTy oxTz Tz R UDVT R UIVT MÉTODOS DE TSAI Com notação do OpenGL Y y' c p’ Zc Xc x' Xc c c P Y Zc x' p y' Xc c Z f c Y c Z Câmera para imagem x s x ( xim ox ) p s ( y o ) y y im y Xc c Z f c Y c Z f Xc xim ox c sx Z c f Y yim o y sy Z c Concatenando f Xc xim ox sx Z c c f Y yim o y sy Z c X c r11 c Y r21 Z c r31 r12 r22 r32 r13 X w Tx r33 Y w Ty r33 Z w Tz camera r11 X w r12Y w r13 Z w Tx xim ox f x r31 X w r32Y w r33 Z w Tz r21 X r22Y r23 Z Ty w yim o y f y w w r31 X r32Y r33 Z Tz w w w Os passos do Método de Tsai Passo 1: Assuma: (ox , ox ) conhecidos Distorção radial insignificante r11 X i r12Yi r13 Z i Tx w xi f x yi f y w w r31 X iw r32Yi w r33 Z iw Tz r21 X iw r22Yi w r23 Z iw Ty r31 X iw r32Yi w r33 Z iw Tz xi xim ox yi yim oy Método de Tsai xi f x yi f y r11 X iw r12Yi w r13 Z iw Tx r31 X iw r32Yi w r33 Z iw Tz r21 X iw r22Yi w r23 Z iw Ty r31 X i r32Yi r33 Z i Tz w w w fx r31 X i r32Yi r33 Z i Tz r11 X iw r12Yi w r13 Z iw Tx xi w w w r31 X i r32Yi r33 Z i Tz w w w fy yi r w w w X r Y r Z 21 i 22 i 23 i Ty Método de Tsai Passo 1: fx r31 X i r32Yi r33 Z i Tz r11 X iw r12Yi w r13 Z iw Tx xi w w w r31 X i r32Yi r33 Z i Tz w w w fy yi r w w w X r Y r Z 21 i 22 i 23 i Ty xi f y r21 X iw r22Yi w r23Z iw Ty yi f x r11 X iw r12Yi w r13Z iw Tx xi X iwr21 xiYi wr22 xi Z iwr23 xiTy yi X iwr11 yiYi wr12 yi Z iwr13 yiTx fx f sy sy f y sx f sx Método de Tsai Passo 1: xi X iwr21 xiYi wr22 xi Z iwr23 xiTy yi X iw r11 yiYi w r12 yi Z iw r13 yi Tx v1 v2 v3 v4 r21 r22 r23 Ty v5 v6 v7 v8 r11 r12 r13 Tx xi X iwv1 xiYi wv2 xi Z iwv3 xi v4 yi X iwv5 yiYi wv6 yi Z iwv7 yi v8 xi X iwv1 xiYi wv2 xi Z iwv3 xi v4 yi X iwv5 yiYi wv6 yi Z iwv7 yi v8 0 Correspondência x1 , y1 x2 , y 2 x3 , y3 xN , y N X ,Y , Z X ,Y , Z X ,Y , Z w w 1 w 1 w 1 w w 2 2 2 w w w 3 X 3 w 3 w w , Y , Z N N N Sistema Ax=0 x1 X 1w w X x 2 2 w xN X N x1Y1w x1Z1w x1 y1 X 1w y1Y1w y1Z iw x2Y2w x2 Z 2w x2 y2 X 2w y2Y2w y2 Z 2w xN YNw xN Z Nw xN y N X Nw y N YNw y N Z Nw Av 0 v1 0 v 0 2 y1 v3 0 y 2 v4 0 0 v5 y N v6 0 v 0 7 v8 0 rank( A) 7 Compute v by SVD decomposition of A=UDVT (The solution vector is the column of V corresponding to null (or smallest) singular value) in D. Estimativa dos parâmetros da câmera Fator de escala Seja v um a soluçãonão trivial, v γr21 r22 r23 Ty r11 r12 r13 Tx T Como r212 r222 r232 1, v12 v22 v32 2 r212 r222 r232 Sinal do fator de escala Sinal de yi f y Como: r21 X iw r22Yi w r23 Z iw Ty r31 X iw r32Yi w r33 Z iw Tz Zic r31 X iw r32Yi w r33Z iw Tz 0 w w w Temos yi r21 X i r22Yi r23Z i Ty 0 Caso isto não seja verdade troque o sinal de v Estimativa do fator Since r212 r222 r232 1, we have v52 v62 v72 2 2 r212 r222 r232 1 v52 v62 v72 Última linha da matriz de rotação r31 r11 r21 i r r r det r 32 12 22 11 r33 r13 r23 r21 Reortogonalize: r11 r 21 r31 r12 r22 r32 j r12 r22 k r13 r33 r13 r33 r33 R UDVT R UIVT Cáculo de fx fy e Tz For each corresponding pairxi , yi and X iw ,Yiw , Z iw xi r31 X iw r32Yiw r33Z iw Tz f x r11 X iw r12Yiw r13Z iw Tx xiTz r11 X iw r12Yiw r13Z iw Tx f x xi r31 X iw r32Yiw r33Z iw TZ Solve A b fx Cáculo de fx fy e Tz x1 x A 2 xN r r x1 r31 X 1w r32Y1w r33 Z1w w w w x r X r Y r Z 2 31 2 32 2 33 2 b w w w xN r31 X N r32YN r33 Z N w w w X r Y r Z 11 1 12 1 13 1 Tx w w w X r Y r Z T 11 2 12 2 13 2 x w w w r11 X N r12YN r13 Z N Tx Ax b UDV x b x VD U b Ax b A Ax A b x A A AT b T T T 1 T 1 T Ponto de fuga Cálculo do centro ótico pelos pontos de fuga Passo 2 do Tsai Computing Image Center ox , o y v3 v1 v2 Pontos de fuga do padrão 3D Tsai 2D Ziw 0 Coordenada do mundo para a câmera X c i w i c Pc Yc i w jc Z i k c w c X c r11 c Y r21 Z c r31 jw i c k w i c jw jc k w jc jw k c k w k c r12 r22 r32 zc xc X t x w Yw t y t Z w z 1 yc r13 X w Tx r33 Y w Ty r33 Z w Tz camera Pc T zw xw Pw yw Câmera para imagem x s x ( xim ox ) p s ( y o ) y y im y Xc c Z f c Y c Z f Xc xim ox sx Z c c f Y yim o y c sy Z Concatenando f Xc xim ox sx Z c c f Y yim o y sy Z c X c r11 c Y r21 Z c r31 r12 r22 r32 r13 X w Tx r33 Y w Ty r33 Z w Tz camera r11 X w r12Y w r13 Z w Tx xim ox f x r31 X w r32Y w r33 Z w Tz r21 X r22Y r23 Z Ty w yim o y f y w w r31 X r32Y r33 Z Tz w w w Método de Tsai plano Passo 1: xi f x yi f y r11 X iw r12Yi w r13 Z iw Tx =0 r31 X iw r32Yi w r33 Z iw Tz r21 X iw r22Yi w r23 Z iw Ty r31 X iw r32Yi w r33 Z iw Tz r11 X i r12Yi Tx w xi f x yi f y w r31 X i r32Yi Tz w w r21 X iw r22Yi w Ty r31 X iw r32Yi w Tz Método de Tsai plano fx r31 X i r32Yi Tz r11 X iw r12Yi w Tx xi w w r31 X i r32Yi Tz w w fy yi r w w X r Y 21 i 22 i Ty xi f y r21 X iw r22Yi w Ty yi f x r11 X iw r12Yi w Tx xi X iwr21 xiYi wr22 xiTy yi X iwr11 yiYi wr12 yiTx 1 xi X iwr21 xiYi wr22 xiTy yi X iwr11 yiYi wr12 yiTx Método de Tsai Passo 1: xi X iwv1 xiYi wv2 xi v3 yi X iwv4 yiYi wv5 yi v6 0 v1 r21 v2 r22 v3 Ty v4 r11 v5 r12 v6 Tx r11 v4 r12 v5 r21 v1 Av 0 v 0 r22 v2 Tx v 6 T y v3 r13 ? r23 ? Método de Tsai ˆi r r c 11 12 r11 v4 r13 T r12 v5 r21 v1 ˆj r r c 21 22 r22 v2 r23 T v42 v52 2 r13 2 Tx v 6 v12 v22 2 r23 2 T y v3 v4 v1 v5v2 2 r13 r23 0 4 v1 v2 v4 v5 2 v2v4 v1v5 0 2 v1 v2 v4 v5 1 2 v1 v2 v4 v5 2 4v2v4 v1v5 Sinal de 2 escolha um sinal r11 v4 r12 v5 xi f x r21 v1 r22 v2 r11 X iw r12Yi w Tx r31 X iw r32Yi w Tz Zic 0 Tx v 6 T y v3 Logo xi r11 X iw r12Yi w Tx 0 Caso isto não seja verdade troque o sinal de Fator de escala r11 v4 r12 v5 r21 v1 r22 v2 Tx v 6 r13 ? r23 ? f ? Tz ? T y v3 escolha um sinal r13 1 r112 r122 escolha um sinal r23 1 r212 r222 r13r23 r11r21 r12 r22 corrija a escolha r31 r11 r21 r r r 32 12 22 r33 r13 r23 Cáculo de fx fy e Tz For each corresponding pairxi , yi and X iw ,Yiw , Z iw xi r31 X iw r32Yiw Tz f x r11 X iw r12Yiw Tx xiTz r11 X iw r12Yiw Tx f x xi r31 X iw r32Yiw TZ Solve A b fx Implementation of “A Flexible New Technique for Camera Calibration” based on the report of: Zhengyou Zhang December 2, 1998 Notação do artigo de Zhang: y Y x X sx u0 sy 0 v r r r 0 1 2 3 1 0 0 1 X Y t 0 1 sx u0 sy 0 v r r 0 1 2 1 0 0 1 X Y t 1 ~ ~ sm AR tM Determinação de uma Homografia ~ ~ AR tM sm ui h0 v h i 3 si h6 h1 h4 h7 ~ ~ sm HM h2 X i h5 Yi h8 1 h X hY h xi 0 i 1 i 2 h6 X i h7Yi h8 H AR t ui h0 X i h1Yi h2 vi h3 X i h4Yi h5 si h6 X i h7Yi h8 h3 X i h4Yi h5 yi h6 X i h7Yi h8 h6 X i h7Yi h8 xi h0 X i h1Yi h2 h6 X i h7Yi h8 yi h3 X i h4Yi h5 y Y x X h6 X i h7Yi h8 xi h0 X i h1Yi h2 h6 X i h7Yi h8 yi h3 X i h4Yi h5 X i h0 Yi h1 1h2 0h3 0h4 0h5 xi X i h6 xiYi h7 xi h8 0 0h0 h1 0h2 X i h3 Yi h4 1h5 xi X i h6 xiYi h7 xi h8 0 2 equações por ponto. 9 (8) incógnitas int homography(int nPoints, double* modelPoints, double* imagePoints, double* H) { int k; double* L=(double*)malloc(2*nPoints*9*sizeof(double)); /* L is a 2nx9 matrix where Lij is in L[9*i+j] */ /* Assembles coeficiente matrix L */ for(k=0; k<nPoints; k++) { double X=modelPoints[3*k+0]; /* X coord of model double Y=modelPoints[3*k+1]; /* Y coord of model double W=modelPoints[3*k+2]; /* W coord of model double x=imagePoints[2*k+0]; /* x coord of image double y=imagePoints[2*k+1]; /* y coord of image point point point point point k k k k k int i=2*k; /* line number in matrix L L[9*i+0] = X; L[9*i+1] = Y; L[9*i+2] = W; L[9*i+3] = 0; L[9*i+4] = 0; L[9*i+5] = 0; L[9*i+6] = -x*X; L[9*i+7] = -x*Y; L[9*i+8] = -x*W; i=2*k+1; L[9*i+0] = 0; L[9*i+1] = 0; L[9*i+2] = 0; L[9*i+3] = X; L[9*i+4] = Y; L[9*i+5] = W; L[9*i+6] = -y*X; L[9*i+7] = -y*Y; L[9*i+8] = -y*W; } solveAx0(2*nPoints,9,L,H); /* solves the system [L]{h}={0} */ free(L); return 0; } */ */ */ */ */ */ Minimização (Levenberg-Marquardt) Tome H como solução inicial 2 2 u v x i y i i s i s i 0 i i N Minimize: onde: ui h0 v h i 3 si h6 h1 h4 h7 h2 X i h5 Yi h8 1 int homography(int nPoints, double* modelPoints, double* imagePoints, double* H) { int k; double* L=(double*)malloc(2*nPoints*9*sizeof(double)); /* L is a 2nx9 matrix where Lij is in L[9*i+j] */ /* Assembles coeficiente matrix L */ for(k=0; k<nPoints; k++) { double X=modelPoints[3*k+0]; /* X coord of model point k double Y=modelPoints[3*k+1]; /* Y coord of model point k double W=modelPoints[3*k+2]; /* W coord of model point k double x=imagePoints[2*k+0]; /* x coord of image point k double y=imagePoints[2*k+1]; /* y coord of image point k int i=2*k; /* line number in matrix L L[9*i+0] L[9*i+3] L[9*i+6] i=2*k+1; L[9*i+0] L[9*i+3] L[9*i+6] = X; L[9*i+1] = Y; L[9*i+2] = W; = 0; L[9*i+4] = 0; L[9*i+5] = 0; = -x*X; L[9*i+7] = -x*Y; L[9*i+8] = -x*W; = 0; L[9*i+1] = 0; L[9*i+2] = 0; = X; L[9*i+4] = Y; L[9*i+5] = W; = -y*X; L[9*i+7] = -y*Y; L[9*i+8] = -y*W; } solveAx0(2*nPoints,9,L,H); /* solves the system [L]{h}={0} */ if (OPTIMIZE) { double lmH[9]; lmHomography(imagePoints,modelPoints,H,nPoints,lmH); mtxMatCopy(lmH,3,3,H); } free(L); return 0; } */ */ */ */ */ */ Restrições na matriz de parâmetros intrínsicos ~ ~ AR tM sm h1 r1 r2 ~ ~ sm HM h2 h3 Ar1 r2 1 1 A 1h1 A 1h 2 H AR t t r1 r2 0 r1 r2 0 r1 r1 r2 r2 1 r1 r1 r2 r2 0 T T h1 A T A 1h 2 0 T h1 A T A 1h1 h 2 A T A 1h 2 0 T T T Das homografias para parâmetros intrínsecos h1 A T A 1h 2 0 T h1 A T A 1h1 h 2 A T A 1h 2 0 T T b0 onde: B A T A 1 b1 b3 h B h2 0 T 1 h B h1 h 2 B h 2 0 T 1 T b1 b2 b4 b3 h0 h1 h2 b4 e H h3 h4 h5 h6 h7 h8 b5 h0h1 b0 (h0h4 h3h1 )b1 h3h4 b2 (h0h7 h6h1 )b3 (h3h7 h6h4 )b4 h6h7 b5 0 (h0 h1 )b0 2(h0h3 h1h4 )b1 (h3 h4 )b2 2(h0h6 h1h7 )b3 3(h3h6 h4h7 )b4 (h6 h7 )b5 0 2 2 2 2 2 equações por homografia. 6 incógnitas 2 2 void calcB(int nH, double* H, double* B) { int m = 2*nH; int n = 6; double* V =(double*) calloc(sizeof(double),m*n); double* b =(double*) malloc(sizeof(double)*n); int i; for(i=0;i<nH;i++){ double* h = &H[9*i]; int line1 = 2*n*i; int line2 = line1+6; V[line1+0]=h[0]*h[1]; V[line1+2]=h[3]*h[4]; V[line1+4]=h[3]*h[7]+h[6]*h[4]; } V[line1+1]=h[0]*h[4] + h[3]*h[1]; V[line1+3]=h[0]*h[7]+h[6]*h[1]; V[line1+5]=h[6]*h[7]; V[line2+0]=h[0]*h[0] - h[1]*h[1]; V[line2+1]=2*(h[0]*h[3] - h[1]*h[4]); V[line2+2]=h[3]*h[3] - h[4]*h[4]; V[line2+3]=2*(h[0]*h[6] - h[1]*h[7]); V[line2+4]=2*(h[3]*h[6] - h[4]*h[7]); V[line2+5]=h[6]*h[6] - h[7]*h[7]; if (NORMALIZE) { mtxNormalizeVector(6,&V[line1]); mtxNormalizeVector(6,&V[line2]); } solveAx0(m,n,V,b); /* solves the system [V]{x}={0} */ i=0; B[i++]=b[0]; B[i++]=b[1]; B[i++]=b[3]; B[i++]=b[1]; B[i++]=b[2]; B[i++]=b[4]; B[i++]=b[3]; B[i++]=b[4]; B[i++]=b[5]; } free(b); free(V); Cálculo da matrix A /* Get intrinsic parameters from matrix B*/ int calcA(double* B, double* A) { double alpha,betha,gamma,u0,v0,lambda; double den=B[0]*B[4]-B[1]*B[1]; if (fabs(den)< TOL ) return 0; v0 = (B[1]*B[2]-B[0]*B[5])/den; if (fabs(B[0])<TOL) return 0; lambda = B[8]-(B[2]*B[2]+v0*(B[1]*B[2]-B[0]*B[5]))/B[0]; if (lambda/B[0]<0) return 0; alpha=sqrt(lambda/B[0]); if ((lambda*B[0]/den)<0) return 0; betha = sqrt(lambda*B[0]/den); gamma = - B[1]*alpha*alpha*betha/lambda; u0=gamma*v0/betha-B[2]*alpha*alpha/lambda; A[0]=alpha; A[1]=gamma; A[2]=u0; A[3]=0; A[4]=betha; A[5]=v0; A[6]=0; A[7]=0; A[8]=1; } return 1; Cálculo de R e t Calibração de Zhang para uma câmera “boa” yim yc y0 oc x' eixo óptico x0 xc w ox 2 h oy 2 xim f yim y' vista lateral yc zc X P Y Z fovy oc f h pixels zc y' oy x' ox w pixels xim Notação do artigo de Zhang: y Y x X X u u 0 Y s v 0 v0 r1 r2 r3 t 0 1 0 0 1 1 u s v y s x f p f x (em pixel) x u0 v0 0 X u f x 0 0 Y s v 0 f x 0 r1 r2 r3 t 0 1 0 0 1 1 ~ ~ sm AR tM u f x 0 0 s v 0 f x 0 r1 r2 1 0 0 1 X Y t 1 Determinação de uma Homografia ~ ~ AR tM sm ui h0 v h i 3 si h6 h1 h4 h7 ~ ~ sm HM h2 X i h5 Yi h8 1 h X hY h xi 0 i 1 i 2 h6 X i h7Yi h8 H AR t ui h0 X i h1Yi h2 vi h3 X i h4Yi h5 si h6 X i h7Yi h8 h3 X i h4Yi h5 yi h6 X i h7Yi h8 h6 X i h7Yi h8 xi h0 X i h1Yi h2 h6 X i h7Yi h8 yi h3 X i h4Yi h5 y Y x X h6 X i h7Yi h8 xi h0 X i h1Yi h2 h6 X i h7Yi h8 yi h3 X i h4Yi h5 X i h0 Yi h1 1h2 0h3 0h4 0h5 xi X i h6 xiYi h7 xi h8 0 0h0 h1 0h2 X i h3 Yi h4 1h5 xi X i h6 xiYi h7 xi h8 0 2 equações por ponto. 9 (8) incógnitas int homography(int nPoints, double* modelPoints, double* imagePoints, double* H) { int k; double* L=(double*)malloc(2*nPoints*9*sizeof(double)); /* L is a 2nx9 matrix where Lij is in L[9*i+j] */ /* Assembles coeficiente matrix L */ for(k=0; k<nPoints; k++) { double X=modelPoints[3*k+0]; /* X coord of model double Y=modelPoints[3*k+1]; /* Y coord of model double W=modelPoints[3*k+2]; /* W coord of model double x=imagePoints[2*k+0]; /* x coord of image double y=imagePoints[2*k+1]; /* y coord of image point point point point point k k k k k int i=2*k; /* line number in matrix L L[9*i+0] = X; L[9*i+1] = Y; L[9*i+2] = W; L[9*i+3] = 0; L[9*i+4] = 0; L[9*i+5] = 0; L[9*i+6] = -x*X; L[9*i+7] = -x*Y; L[9*i+8] = -x*W; i=2*k+1; L[9*i+0] = 0; L[9*i+1] = 0; L[9*i+2] = 0; L[9*i+3] = X; L[9*i+4] = Y; L[9*i+5] = W; L[9*i+6] = -y*X; L[9*i+7] = -y*Y; L[9*i+8] = -y*W; } solveAx0(2*nPoints,9,L,H); /* solves the system [L]{h}={0} */ free(L); return 0; } */ */ */ */ */ */ Minimização (Levenberg-Marquardt) Tome H como solução inicial 2 2 u v x i y i i s i s i 0 i i N Minimize: onde: ui h0 v h i 3 si h6 h1 h4 h7 h2 X i h5 Yi h8 1 int homography(int nPoints, double* modelPoints, double* imagePoints, double* H) { int k; double* L=(double*)malloc(2*nPoints*9*sizeof(double)); /* L is a 2nx9 matrix where Lij is in L[9*i+j] */ /* Assembles coeficiente matrix L */ for(k=0; k<nPoints; k++) { double X=modelPoints[3*k+0]; /* X coord of model point k double Y=modelPoints[3*k+1]; /* Y coord of model point k double W=modelPoints[3*k+2]; /* W coord of model point k double x=imagePoints[2*k+0]; /* x coord of image point k double y=imagePoints[2*k+1]; /* y coord of image point k int i=2*k; /* line number in matrix L L[9*i+0] L[9*i+3] L[9*i+6] i=2*k+1; L[9*i+0] L[9*i+3] L[9*i+6] = X; L[9*i+1] = Y; L[9*i+2] = W; = 0; L[9*i+4] = 0; L[9*i+5] = 0; = -x*X; L[9*i+7] = -x*Y; L[9*i+8] = -x*W; = 0; L[9*i+1] = 0; L[9*i+2] = 0; = X; L[9*i+4] = Y; L[9*i+5] = W; = -y*X; L[9*i+7] = -y*Y; L[9*i+8] = -y*W; } solveAx0(2*nPoints,9,L,H); /* solves the system [L]{h}={0} */ if (OPTIMIZE) { double lmH[9]; lmHomography(imagePoints,modelPoints,H,nPoints,lmH); mtxMatCopy(lmH,3,3,H); } free(L); return 0; } */ */ */ */ */ */ Restrições na matriz de parâmetros intrínsicos ~ ~ AR tM sm h1 r1 r2 ~ ~ sm HM h2 h3 Ar1 r2 1 1 A 1h1 A 1h 2 H AR t t r1 r2 0 r1 r2 0 r1 r1 r2 r2 1 r1 r1 r2 r2 0 T T h1 A T A 1h 2 0 T h1 A T A 1h1 h 2 A T A 1h 2 0 T T T Das homografias para parâmetros intrínsecos h1 A T A 1h 2 0 T h1 A T A 1h1 h 2 A T A 1h 2 0 T h1 B h 2 0 T T onde: h B h1 h 2 B h 2 0 T 1 T b0 b1 B A T A 1 b1 b2 b3 b4 1 2 b3 f x b4 0 b5 0 0 1 f x2 0 0 0 1 h0 e H h3 h6 h1 h4 h7 h2 h5 h8 h0h1 b0 (h0h4 h3h1 )b1 h3h4 b2 (h0h7 h6h1 )b3 (h3h7 h6h4 )b4 h6h7 b5 0 (h0 h1 )b0 2(h0h3 h1h4 )b1 (h3 h4 )b2 2(h0h6 h1h7 )b3 3(h3h6 h4h7 )b4 (h6 h7 )b5 0 2 2 2 2 2 h0 h1 h3h4 h6 h7 h0h1 h3h4 2 h6h7 0 2 fx fx fx h0 h1 h3 h4 2 2 (h6 h7 ) 0 2 2 fx fx (h h1 ) (h3 h4 ) fx 0 2 2 h6 h7 2 2 2 2 2 2 2 2 2 Cálculo de R e t FIM