Calibração de Câmera Como determinar o modelo e os parâmetros que transformam a radiância da cena numa imagem digital
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 (P i, p i ) na cena e na imagem.
Calibração de câmeras Calibração estimação de parâmetros otimização pontos da cena pontos da imagem projeção (função não linear)
Modelo de câmera pinhole dA p dA c irradiação sobre o pixel radiância dos pontos visíveis na direção da câmera Câmeras e olhos humanos são sensíveis a radiância
Câmera segue um modelo simples plano de projeção centro de projeção Projeção cônica caixa filme objeto pinhole raios de luz imagem Câmera pinhole
Câmeras reais sceneimage planelens Image Irradiance:Scene Radiance:
Câmeras com lentes O c p dA c α dA p (área correspondente a dA c )
Radiancia emitida por c na direção de p O c p α d dA c dA p
Ângulo sólido O c α d r dA c
Relação entre as áreas O c p α o i dA c dA p
Irradiação sobre o sensor O P p α d quando foco no dA c dA p
Irradiação (irradiância) no sensor da câmera é proporcional a: radiância do objeto da cena; área da lente; variação do cos 4
Trabalho de Gariel e Manuel, 2003: Variação cos 4 Descrição: Este experimento consistiu em verificar a equação fundamental da radiometria sobre a formação da imagem. Para comprovar esta variação proporcional a cos 4 utilizou-se uma tela de projeção comum de laminado de PVC e um projetor iluminando esta tela com uma única cor uniforme. A tela funcionou como uma superfície lambertiana, irradiando uniformemente em todas as direções.
Equipamento utilizado Creative WebCam Pro 640x480 (VGA) color CMOS Sensor USB 1.1 Interface
= arc tg (0,9/2,0) = 24 o cos 4 = 0,7 1,8m 2,0m Calculou-se, segundo as proporções de captura sobre as quais foram geradas as imagens da tela, o ângulo. Foi possível verificar que a iluminação nos pontos da tela decresce proporcionalmente a cos 4.
R=75 G=95 B=165 R=55 G=70 B=110 R=53 G=67 B=115 0,7 P1P1 P 1 0,7 P2P2 P 1 – pixel no centro da tela P 2 – pixel no canto da tela, na horizontal de P 1
Sem correção
Com correção radiométrica
Sem correção
Com correção radiométrica
Sem correção
Com correção radiométrica
Sem correção
Com correção radiométrica
Distorção radial
Origem da distorção radial
Tipos de distorção radial
Exemplo de distorção radial Imagem original Corrigida k 1 =0.11, k 2 =0.019
Sem correção Gabriel Malizia, 2003
(24, 15) (16, 238) (24, 457) (285,210) (O x, O y ) = (285,210), em pixel da imagem (611, 13) (620, 237) (610, 457) (319, 471) (319, 4)
(-261, 195) (-269, -28) (-261, -247) (0,0) (34, 208)(326, 197) (335, -27) (325, -247) (34, -261) Nova distribuição das coordenadas xdxd ydyd
Um processo simples para estimar k 1 e k 2
Considerando k 2 0 k 1 =5*10 -5 k 1 =4*10 -5 Valores médios de k 1 nos pontos extremos da imagem capturada
Sem correção
k 1 =4, Com correção
k 1 =2, Com correção
Sem correção
Com correção radiométrica e radial
Sem correção
Com correção radiométrica e radial
Velocidade 1/60 or 1/100 segundo ok
Abertura Escala normal f/1.4, f/2, f/2.8, f/4, f/5.6, f/8, f/11, f/16, f/22 abertura nitidez diâmetro efetivo campo de visão
Sensores
Foveon
Sensor Fujifilm
Outros modelos de camera
Variabilidade das medidas de uma camera Capture n (~100) imagens de uma mesma cena com uma câmera digital parada. Calcule, para cada pixel a média e o desvio padrão por:
Imagem 1
Imagem Média
Aqui a gente mostra o error de variação de cor por pixel, o qual va de 2.5 a 6 niveis.
Um zoom da imagen anterior
Desvio Padrão Médio Normalizado Desvio Padrão Médio Máximo: R=10.1 G=10.6 B=9.9 Média do Desvio Padrão Médio: R=2.29 G=2.26 B=2.50
Desvio Padrão Médio Normalizado - Red
Desvio Padrão Médio Normalizado - Green
Desvio Padrão Médio Normalizado - Blue
Imagem Original
Imagem tons de cinza
Média
Ruído Normalizado - desvio padrão máximo = desvio padrão médio = 1.61
Ruído Normalizado - desvio padrão máximo = desvio padrão médio = 1.61
Compressão do jpeg
Aplicações são tecnologicamente complexas: exemplo: algoritmo do JPEG FDCT Source Image Quantizer Entropy Encoder Table Compressed image data DCT-based encoding 8x8 blocks R B G
Equations for JPEG DCT Forward DCT: Inverse DCT:
Visualization of Basis Functions Increasing frequency
Notação xcxc ycyc zczc p y' x' sinal ! OpenGLVisão
Z X Y u v
(X,Y,Z) T (x,y) T (x im,y im ) T y im npnp x im ycyc vista lateral ococ zczc npnp fovy oyoy x im y im h pixels oxox ococ eixo óptico x0x0 y0y0 ycyc xcxc zczc y' x' w pixels x' y'
(x im,y im ) T (x,y) T x im y im x y sxsx sysy p' o oyoy oxox 5
(X,Y,Z) T (x im,y im ) T
Parâmetros intrínsecos com cisalhamento
Parâmetros intrínsecos com distorção radial
Parâmetros extrínsecos Translação –T x, T y, T z (3 g.l.) Rotação (3 g.l.)
Parâmetros extrínsecos xcxc ycyc zczc ywyw xwxw zwzw PwPw PcPc T
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 (P i, p i ) na cena e na imagem.
Calibração de câmeras Calibração estimação de parâmetros otimização pontos da cena pontos da imagem projeção (função não linear)
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 Passo 1: conhecidos Distorção radial insignificante Assuma:
Método de Tsai
Passo 1:
Método de Tsai Passo 1:
Correspondência
Sistema Ax=0 Compute v by SVD decomposition of A=UDV T (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 f x f y e T z
Ponto de fuga
Cálculo do centro ótico pelos pontos de fuga
Passo 2 do Tsai Computing Image Center v1v1v1v1 v2v2v2v2 v3v3v3v3
Pontos de fuga do padrão 3D
Fim da parte 1
Tsai 2D
Coordenada do mundo para a câmera xcxc ycyc zczc ywyw xwxw zwzw PwPw PcPc T
Câmera para imagem
Concatenando
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
Fator de escala escolha um sinal corrija a escolha
Cáculo de f x f y e T z
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: X Y x y
Determinação de uma Homografia
X Y x y 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 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) onde: Tome H como solução inicial Minimize:
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 y im f x im ycyc vista lateral ococ zczc f fovy oyoy x im y im h pixels oxox ococ eixo óptico x0x0 y0y0 ycyc xcxc zczc y' x' w pixels x' y'
Notação do artigo de Zhang: X Y x y
Determinação de uma Homografia
X Y x y 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 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) onde: Tome H como solução inicial Minimize:
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
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 no Juiz Virtual k = 1..n-1 1 a Opção
Calibração no Juiz Virtual
2 a Opção Mimimiza-se, onde é o resultado obtido pelatransformação encontrada. Problema não linear
Onde é o centróide dos pontos próprios P k. Calibração no Juiz Virtual k=1..n Para eliminar a solução trivial H = 0,
Calibração no Juiz Virtual A solução desse problema se dá por resolver Minimizar || Mt || sujeito a m T t = 1, onde e M é a representação matricial da transformação, dada por: É usado o método de multiplicadores de Lagrange, conduzindo ao seguinte sistema linear: (2n x 9)
Relação entre as matrizes do OpenGL e de um sistema de visão Matrizes de posicionamento Matrizes de projeção
Matrizes de posicionamento xexe yeye zeze center eye zozo yoyo xoxo up x y z Y Z X t
Matrizes de posicionamento at eye z o = Z y o = Y x o = X up x e = x y e = y zeze z
Relação entre as matrizes instrísicas K e P ogl u z x y v void getPoglFromK(float k[9], float P[16]);
Mudando de XYZ para x e y e z e u z ye= yye= y v x e = x ze= - zze= - z
Sistemas de coordenadas do OpenGL v u yeye vista lateral eye zeze f =n p fovy oyoy u v h s y oxox eye eixo óptico x0x0 y0y0 yeye xexe zeze y' x' w s x x' y' pixel sxsx sysy f =n p fpfp
OpenGL xexe yeye zeze xnxn ynyn znzn u v pixel sxsx sysy h s y w s x w h 0
Visão xexe yeye zeze xnxn ynyn znzn u v pixel sxsx sysy h s y w s x w h 0 Esta linha vem da derivação da matrix P do OpenGL