2016-01-20 3 views
4

J'ai une image capturée en utilisant une caméra standard, comme indiqué dans la configuration ci-dessous. Je suis assez chanceux pour supposer que je connais la distance focale (en millimètres), le facteur de recadrage et la taille du capteur, et peut supposer que le centre de projection est le centre de l'image - donc je connais sa position en pixels et en termes de capteur.Corriger l'image en perspective en fonction de la distance focale et de la position/rotation de la caméra

Je connais également l'angle de la caméra par rapport au plan bleu et sa hauteur au-dessus de ce plan. La caméra tourne uniquement dans son axe des x, que nous supposons être parallèle à l'axe des x du monde.

Setup of camera over plane

Maintenant, je dois obtenir une rectification métrique de l'image telle que je peux mesurer un objet sur le plan bleu en millimètres (en 2D).

J'ai essayé différentes choses dans Matlab pour que cela fonctionne, mais mes résultats jusqu'ici ont été décevants. Il s'agit clairement d'un problème d'homographie plane-plane, et je pense que l'échelle devrait pouvoir être résolue en fonction du fait que je connais la taille du capteur et le nombre de pixels qu'il contient.

Ma recherche m'a conduit à cette même question, mais la méthodologie dans les réponses ne fonctionne pas pour moi (expliqué plus loin): How to do perspective correction in Matlab from known Intrinsic and Extrinsic parameters?

J'ai essayé de calculer les matrices intrinsèques et extrinsèques, puis obtenir un homographie:

f = 4.9; % Focal length is given as 4.9mm 
sensor_size = [6.17 4.55]; % Again in mm 
cc = sensor_size ./ 2; 

% Calculate intrinsic matrix 
KK = [f 0 cc(1);0 f cc(2); 0 0 1]; 

theta = 21.8; % Angle of camera above plane, degrees 
Rc = xrotate(theta) % xrotate fcn given below 
Tc = [0 0 60]'; % Camera is 60mm above plane along camera z-axis 

H = KK * [R(:,1) R(:,2) Tc]; 
figure;imshow(imtransform(I,maketform('projective',H), 'Size', image_size)) 

function R = xrotate(theta) 
    R = [ 1 0 0; 
      0 cosd(theta) sind(theta); 
      0 -sind(theta) cosd(theta) ];   
end 

cela me donne malheureusement avec l'ordure - étant donné l'original pleine grandeur de cette image:

Downscaled input image

-je obtenir ce résultat du code ci-dessus:

Result of homography calculated using above

Compte tenu de sa seule une rotation axe x, je pense que nous devrions avoir une forme de trapèze en raison de l'homographie, mais je ne sembler. Quelqu'un peut-il pointer vers des erreurs évidentes que j'ai faites ici?

Répondre

0

Vous mélangez des pixels et des mm. Exprimer la matrice KK en unités de pixels, en utilisant la largeur et la hauteur de l'image connues comme facteurs d'échelle.

+0

Merci, j'étais inquiet que cela pourrait être le cas. Malheureusement, l'échange de ces valeurs de pixel (échelle calculée en utilisant la taille du capteur par rapport à la taille de l'image) ne semble pas améliorer grandement le résultat. – n00dle