Calibração de Câmeras Cap. 6 Trucco & Verri
Câmera segue um modelo simples caixa filme objeto pinhole raios de luz imagem Câmera plano de projeção centro de projeção Projeção cônica “pinhole”
Notação Visão OpenGL y' yc p’ zc x' xc sinal !
(X,Y,Z)T (x’,y’)T(xim,yim)T yc y' eixo óptico zc y0 x' oc xc x0 f xim yim y' vista lateral yc oy zc fovy h pixels x' oc ox xim f w pixels
(xim,yim)T (x’,y’)T yim y’ sx p' sy 3 oy 2 o x’ 1 xim 1 ox 2 3 4 5
(X,Y,Z)T (xim,yim)T
Parâmetros intrínsecos com cisalhamento
Parâmetros intrínsecos com distorção radial
Parâmetros extrínsecos Translação –Tx, Ty, Tz (3 g.l.) Rotação (3 g.l.)
Parâmetros extrínsecos xc yc zc Pc T yw xw zw Pw
Compondo as transformações parâmetros extrínsecos parâmetros intrínsecos
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 pontos da cena projeção (função não linear) pontos da imagem
Método de Tsai (compativel com notação do OpenGL) X c Y c Z c p’ y' x'
Câmera para imagem
Concatenando
Os passos do Método de Tsai Assuma: conhecidos Distorção radial insignificante
Método de Tsai
Método de Tsai Passo 1:
Método de Tsai Passo 1:
Correspondência
Sistema Ax=0 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
Sinal do fator de escala Sinal de Como: Temos Caso isto não seja verdade troque o sinal de v
Estimativa do fator
Última linha da matriz de rotação Reortogonalize:
Cáculo de fx fy e Tz
Cáculo de fx fy e Tz
Ponto de fuga
Cálculo do centro ótico pelos pontos de fuga
Passo 2 do Tsai Computing Image Center v3 v2 v1
Pontos de fuga do padrão 3D
Tsai 2D
Método de Tsai plano Passo 1: =0
Método de Tsai plano
Método de Tsai Passo 1:
Método de Tsai
Sinal de Logo Caso isto não seja verdade troque o sinal de escolha um sinal Logo Caso isto não seja verdade troque o sinal de
Fator de escala escolha um sinal escolha um sinal corrija a escolha
Cáculo de fx fy e Tz
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
Determinação de uma Homografia
y Y x X 2 equações por ponto. 9 (8) incógnitas
int homography(int nPoints, double. modelPoints, double 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] = 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 Minimize: onde:
int homography(int nPoints, double. modelPoints, double 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] = 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} */ 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
Das homografias para parâmetros intrínsecos onde: e 2 equações por homografia. 6 incógnitas
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+1]=h[0]*h[4] + h[3]*h[1]; V[line1+2]=h[3]*h[4]; V[line1+3]=h[0]*h[7]+h[6]*h[1]; V[line1+4]=h[3]*h[7]+h[6]*h[4]; 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 y' eixo óptico zc y0 x' oc xc x0 f xim yim y' vista lateral yc oy zc fovy h pixels x' oc ox xim f w pixels
Notação do artigo de Zhang: y Y x X
Determinação de uma Homografia
y Y x X 2 equações por ponto. 9 (8) incógnitas
int homography(int nPoints, double. modelPoints, double 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] = 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 Minimize: onde:
int homography(int nPoints, double. modelPoints, double 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] = 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} */ 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
Das homografias para parâmetros intrínsecos onde: e
Cálculo de R e t
Proceedings of SIBGRAPI'98, Rio de Janeiro, Brazil, 1998, pp. 388-399.
Equações de projeção
Equações de projeção
Calibração a partir da matriz Para cada ponto:
Calibração a partir da matriz Para cada ponto:
Calibração a partir da matriz
Calibração a partir da matriz
Calibração a partir da matriz
Calibração no Juiz Virtual k = 1..n-1 1a Opção
Calibração no Juiz Virtual
Calibração no Juiz Virtual 2a Opção Mimimiza-se , onde é o resultado obtido pelatransformação encontrada. Problema não linear
Calibração no Juiz Virtual k=1..n Para eliminar a solução trivial H = 0, Onde é o centróide dos pontos próprios Pk.
Calibração no Juiz Virtual A solução desse problema se dá por resolver Minimizar || Mt || sujeito a mTt = 1, onde e M é a representação matricial da transformação, dada por: (2n x 9) É usado o método de multiplicadores de Lagrange, conduzindo ao seguinte sistema linear: