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.
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:
-je obtenir ce résultat du code ci-dessus:
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?
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