Comment puis-je undistort une image sous Matlab à l'aide de la connus des paramètres de la caméra?
C'est facile à faire dans OpenCV cependant, je voudrais un natif Matlab mise en œuvre, qui est assez efficace et peut être facilement modifié. La méthode doit être capable de prendre les paramètres de l'appareil photo comme indiqué dans le lien ci-dessus.
Vous pouvez maintenant le faire à partir de la version R2013B, à l'aide de la Vision par Ordinateur Système de boîte à outils. Il y a un GUI application appelée Calibrateur Caméra et une fonction undistortImage.
La plus simple et la plus commune façon de faire undistort (également appelé unwarp ou de compensation de la distorsion de l'objectif) est de faire un avant de distorsion sur une sortie choisi la taille des photos et puis un revers de la cartographie à l'aide de la méthode d'interpolation bilinéaire.
Voici le code que j'ai écrit pour l'exécution de cette:
functionI=undistort(Idistorted,params)fx=params.fx;fy=params.fy;cx=params.cx;cy=params.cy;k1=params.k1;k2=params.k2;k3=params.k3;p1=params.p1;p2=params.p2;K=[fx0cx;0fycy;001];I=zeros(size(Idistorted));[ij]=find(~isnan(I));% Xp = the xyz vals of points on the z planeXp=inv(K)*[jiones(length(i),1)]';% Now we calculate how those points distort i.e forward map them through the distortionr2=Xp(1,:).^2+Xp(2,:).^2;x=Xp(1,:);y=Xp(2,:);x=x.*(1+k1*r2+k2*r2.^2)+2*p1.*x.*y+p2*(r2+2*x.^2);y=y.*(1+k1*r2+k2*r2.^2)+2*p2.*x.*y+p1*(r2+2*y.^2);% u and v are now the distorted cooridnatesu=reshape(fx*x+cx,size(I));v=reshape(fy*y+cy,size(I));% Now we perform a backward mapping in order to undistort the warped image coordinatesI=interp2(Idistorted,u,v);
Pour l'utiliser, il a besoin de connaître les paramètres de la caméra de l'appareil photo utilisé.
Je suis actuellement en utilisant la DGM CamboardNano qui, selon le Cayim.com forums a les paramètres utilisés ici:
Voici un exemple de sortie de la Camboard Nano. Note: j'ai ajouté artificiellement des lignes frontalières de voir ce que l'effet a été de la distorsion près des bords (elle est beaucoup plus prononcée):
Ce genre de types de données de votre fonction de soutien? Je ne peux pas le faire fonctionner avec tout, j'ai essayé... BTW: merci pour la fonction, de sa bizarre comment matlab ne pas avoir cette mise en œuvre il faut au moins travailler avec un seul canal de type "double". Première chose à faire est de convertir n'importe quelle image du double. Aussi, si vous avez une image en niveaux de gris ou de ses une image de profondeur alors qu'il devrait fonctionner correctement juste appeler undistort avec les bons paramètres. Si vous avez des 3 canaux de couleur de l'image, vous aurez besoin de undistort séparément sur chaque canal. Il ne fonctionne pas avec des images bitmap en niveaux de gris, mais je vais les convertir en double et de les essayer!
Vous pouvez maintenant le faire à partir de la version R2013B, à l'aide de la Vision par Ordinateur Système de boîte à outils. Il y a un GUI application appelée Calibrateur Caméra et une fonction undistortImage.
OriginalL'auteur Dima
La plus simple et la plus commune façon de faire undistort (également appelé unwarp ou de compensation de la distorsion de l'objectif) est de faire un avant de distorsion sur une sortie choisi la taille des photos et puis un revers de la cartographie à l'aide de la méthode d'interpolation bilinéaire.
Voici le code que j'ai écrit pour l'exécution de cette:
Pour l'utiliser, il a besoin de connaître les paramètres de la caméra de l'appareil photo utilisé.
Je suis actuellement en utilisant la DGM CamboardNano qui, selon le Cayim.com forums a les paramètres utilisés ici:
Voici un exemple de sortie de la Camboard Nano. Note: j'ai ajouté artificiellement des lignes frontalières de voir ce que l'effet a été de la distorsion près des bords (elle est beaucoup plus prononcée):
il faut au moins travailler avec un seul canal de type "double". Première chose à faire est de convertir n'importe quelle image du double. Aussi, si vous avez une image en niveaux de gris ou de ses une image de profondeur alors qu'il devrait fonctionner correctement juste appeler undistort avec les bons paramètres. Si vous avez des 3 canaux de couleur de l'image, vous aurez besoin de undistort séparément sur chaque canal.
Il ne fonctionne pas avec des images bitmap en niveaux de gris, mais je vais les convertir en double et de les essayer!
OriginalL'auteur twerdster