2016-10-01 4 views
0

Je travaille sur un problème lié à l'étalonnage de la caméra. Dans l'image ci-dessous, nous considérons un système de coordonnées du monde avec l'axe X allant vers la gauche, l'axe Y vers la droite et l'axe Z vers le haut. Nous sélectionnons 15 points (x, y, z) répartis uniformément sur les 3 plans. La distance entre les lignes de la grille est de 1 pouce. Nous obtenons également les coordonnées MATLAB pour les 15 pixels (u, v). L'objectif est d'obtenir la matrice de la caméra 3x4 (M) en utilisant les moindres carrés linéaires homogènes, puis de projeter les points du monde (x, y, z) sur l'image (u ', v') en utilisant M. mais les coordonnées que j'obtiens (u ', v') semblent être de très petite taille par rapport aux coordonnées réelles (u, v). L'erreur RMS est trop grande et les points projetés ne sont même pas positionnés sur l'image à proximité des points réels. Y a-t-il une mise à l'échelle que je dois faire pour le convertir en coordonnées MATLAB? J'inclus également mon code qui n'est pas très bien écrit puisque je suis relativement nouveau à MATLAB. Grid imageÉtalonnage de l'appareil photo: mappage des points 3D à 2D

P=[];% 2nx12 matrix - 30x12 matrix 
for i=1:15 %compute P 
    world_row = world_coords(i,:); % 3d homogeneous coordinates (x,y,z,1) 
    zeroelem = repelem(0,4); 
    image_coord = image_coords(i,:); 
    img_u = image_coord(1); 
    prod = -img_u*world_row; 
    row1 = [world_row,zeroelem,prod]; 
    zeroelem = repelem(0,3); 
    img_v = image_coord(2); 
    prod = -img_v*world_row; 
    row2 = [0,world_row,zeroelem,prod]; 
    P=[P;row1;row2]; 
    end 
var1 = P'*P; 
[V,D] = eig(var1');//compute eigen vector corresponding to least eigen value 
m = V(:,1); //unit vector of norm 1 
M = reshape(m,3,4); //camera matrix of 3x4 size 
%get projected points 
proj = M*world_coords'; 
U = proj (1,:); 
V = proj (2,:); 
W = proj (3,:); 
for i=1:15 
    U(i) = U(i)/W(i); 
    V(i) = V(i)/W(i); 
end 
final = [U;V];//(u',v') 

15 points across the 3 planes

Je suis aussi l'image, y compris avec les 15 points que je choisis. Prenez P1 (u, v) = (286,260) et P1 (x, y, z) = (4,0,3). Le (u ', v') que j'ai obtenu pour cela a des valeurs faibles. Quelqu'un peut-il me signaler ce que je fais mal?

Répondre

0

C'était une erreur idiote de ma part qui me donnait la mauvaise matrice de caméra. J'ai noté à tort les coordonnées mondiales du point P ((7,0,1) au lieu de (1,0,1)). Ceci a conduit à une matrice 30x12 mal formée que nous utilisons pour former une équation à résoudre par les moindres carrés linéaires homogènes. J'ai obtenu la matrice d'étalonnage qui projette les points 3D avec une erreur RMS faible après correction de cette erreur. enter image description here