Ignore:
Timestamp:
Oct 16, 2010, 5:56:00 PM (14 years ago)
Author:
sommeria
Message:

geometry_calib is now updated when a new image is viewed by uvmat
imadoc2struct corrected for time reading

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/transform_field/phys.m

    r79 r116  
    5858end
    5959%transform of X,Y coordinates for vector fields
    60 if isfield(Data,'ZIndex')&&~isempty(Data.ZIndex)
     60if isfield(Data,'ZIndex')&&~isempty(Data.ZIndex)&&~isnan(Data.ZIndex)
    6161    ZIndex=Data.ZIndex;
    6262else
    63     ZIndex=0;
     63    ZIndex=1;
    6464end
    6565if test_1
     
    111111    DataOut.TimeUnit='s';
    112112    %transform of X,Y coordinates for vector fields
    113     if isfield(Data,'ZIndex') && ~isempty(Data.ZIndex)
    114         Z=Data.ZIndex;
     113    if isfield(Data,'ZIndex') && ~isempty(Data.ZIndex)&&~isnan(Data.ZIndex)
     114        Z=Data.ZIndex
    115115    else
    116116        Z=0;
     
    153153end
    154154
    155 
    156155%%%%%%%%%%%%%%%%%%%%
    157156function [A_out,Rangx,Rangy]=phys_Ima(A,CalibIn,ZIndex)
     157
     158if ndims(A)==3
     159    A=mean(A,3);
     160end
     161
     162
    158163xcorner=[];
    159164ycorner=[];
    160165npx=[];
    161166npy=[];
     167dx=ones(1,length(A));
     168dy=ones(1,length(A));
    162169for icell=1:length(A)
    163170    siz=size(A{icell});
     
    165172    npy=[npy siz(1)];
    166173    Calib=CalibIn{icell};
    167     xima=[0.5 siz(2)-0.5 0.5 siz(2)-0.5];%image coordiantes of corners
     174    xima=[0.5 siz(2)-0.5 0.5 siz(2)-0.5];%image coordinates of corners
    168175    yima=[0.5 0.5 siz(1)-0.5 siz(1)-0.5];
    169176    [xcorner_new,ycorner_new]=phys_XYZ(Calib,xima,yima,ZIndex);%corresponding physical coordinates
     
    177184Rangy(2)=min(ycorner);
    178185Rangy(1)=max(ycorner);
    179 test_multi=(max(npx)~=min(npx)) | (max(npy)~=min(npy));
     186test_multi=(max(npx)~=min(npx)) || (max(npy)~=min(npy)); %different image lengths
    180187npX=1+round((Rangx(2)-Rangx(1))/min(dx));% nbre of pixels in the new image (use the finest resolution min(dx) in the set of images)
    181188npY=1+round((Rangy(1)-Rangy(2))/min(dy));
     
    187194for icell=1:length(A)
    188195    Calib=CalibIn{icell};
    189     if (isfield(Calib,'R') && ~isequal(Calib.R(2,1),0) && ~isequal(Calib.R(1,2),0)) ||...
    190         ((isfield(Calib,'kappa1')&& ~isequal(Calib.kappa1,0))) || test_multi || ~isequal(Calib,CalibIn{1})
     196    if isfield(Calib,'R') || isfield(Calib,'kc')|| test_multi ||~isequal(Calib,CalibIn{1})% the image needs to be interpolated to the new coordinates
    191197        zphys=0; %default
    192198        if isfield(Calib,'SliceCoord') %.Z= index of plane
     
    227233            A_out{icell}=uint16(A_out{icell});
    228234        end
    229     else%
    230        
     235    else%     
    231236        A_out{icell}=A{icell};%no transform
    232237        Rangx=[0.5 npx-0.5];%image coordiantes of corners
    233238        Rangy=[npy-0.5 0.5];
    234         [Rangx]=phys_XYZ(Calib,Rangx,[0.5 0.5],[ZIndex ZIndex]);%case of translations without rotation and quadratic deformation
    235         [xx,Rangy]=phys_XYZ(Calib,[0.5 0.5],Rangy,[ZIndex ZIndex]);
    236     end
    237 end
    238 
     239        [Rangx]=phys_XYZ(Calib,Rangx,[0.5 0.5],ZIndex);%case of translations without rotation and quadratic deformation
     240        [xx,Rangy]=phys_XYZ(Calib,[0.5 0.5],Rangy,ZIndex);
     241    end
     242end
     243
     244%------------------------------------------------------------------------
    239245%'phys_XYZ':transforms image (px) to real world (phys) coordinates using geometric calibration parameters
    240246% function [Xphys,Yphys]=phys_XYZ(Calib,X,Y,Z)
     
    245251%Z: index of plane
    246252function [Xphys,Yphys,Zphys]=phys_XYZ(Calib,X,Y,Z)
    247 if exist('Z','var')& isequal(Z,round(Z))& Z>0 & isfield(Calib,'SliceCoord')&length(Calib.SliceCoord)>=Z
     253%------------------------------------------------------------------------
     254if exist('Z','var')&& isequal(Z,round(Z))&& Z>0 && isfield(Calib,'SliceCoord')&&length(Calib.SliceCoord)>=Z
    248255    Zindex=Z;
    249256    Zphys=Calib.SliceCoord(Zindex,3);%GENERALISER AUX CAS AVEC ANGLE
    250257else
    251 %     if exist('Z','var')
    252 %         Zphys=Z;
    253 %     else
    254         Zphys=0;
    255 %     end
     258    Zphys=0;
    256259end
    257260if ~exist('X','var')||~exist('Y','var')
     
    260263    return
    261264end
    262 Xphys=X;%default
    263 Yphys=Y;
    264 %image transform
     265%coordinate transform
     266if ~isfield(Calib,'fx_fy')
     267     Calib.fx_fy=[1 1];
     268end
     269if ~isfield(Calib,'Tx_Ty_Tz')
     270     Calib.Tx_Ty_Tz=[0 0 1];
     271end
     272if ~isfield(Calib,'Cx_Cy')
     273     Calib.Cx_Cy=[0 0];
     274end
     275if ~isfield(Calib,'kc')
     276     Calib.kc=0;
     277end
    265278if isfield(Calib,'R')
    266279    R=(Calib.R)';
     280    Tx=Calib.Tx_Ty_Tz(1);
     281    Ty=Calib.Tx_Ty_Tz(2);
     282    Tz=Calib.Tx_Ty_Tz(3);
     283    f=Calib.fx_fy(1);%dpy=1; sx=1
     284    dpx=Calib.fx_fy(2)/Calib.fx_fy(1);
    267285    Dx=R(5)*R(7)-R(4)*R(8);
    268286    Dy=R(1)*R(8)-R(2)*R(7);
    269     D0=Calib.f*(R(2)*R(4)-R(1)*R(5));
     287    D0=f*(R(2)*R(4)-R(1)*R(5));
    270288    Z11=R(6)*R(8)-R(5)*R(9);
    271289    Z12=R(2)*R(9)-R(3)*R(8); 
     
    274292    Zx0=R(3)*R(5)-R(2)*R(6);
    275293    Zy0=R(1)*R(6)-R(3)*R(4);
    276     A11=R(8)*Calib.Ty-R(5)*Calib.Tz+Z11*Zphys;
    277     A12=R(2)*Calib.Tz-R(8)*Calib.Tx+Z12*Zphys;
    278     A21=-R(7)*Calib.Ty+R(4)*Calib.Tz+Z21*Zphys;
    279     A22=-R(1)*Calib.Tz+R(7)*Calib.Tx+Z11*Zphys;
    280     X0=Calib.f*(R(5)*Calib.Tx-R(2)*Calib.Ty+Zx0*Zphys);
    281     Y0=Calib.f*(-R(4)*Calib.Tx+R(1)*Calib.Ty+Zy0*Zphys);
     294    A11=R(8)*Ty-R(5)*Tz+Z11*Zphys;
     295    A12=R(2)*Tz-R(8)*Tx+Z12*Zphys;
     296    A21=-R(7)*Ty+R(4)*Tz+Z21*Zphys;
     297    A22=-R(1)*Tz+R(7)*Tx+Z22*Zphys;
     298    X0=f*(R(5)*Tx-R(2)*Ty+Zx0*Zphys);
     299    Y0=f*(-R(4)*Tx+R(1)*Ty+Zy0*Zphys);
    282300        %px to camera:
    283     Xd=(Calib.dpx/Calib.sx)*(X-Calib.Cx); % sensor coordinates
    284     Yd=Calib.dpy*(Y-Calib.Cy);
    285     dist_fact=1+Calib.kappa1*(Xd.*Xd+Yd.*Yd); %distortion factor
    286     Xu=dist_fact.*Xd;%undistorted sensor coordinates
    287     Yu=dist_fact.*Yd;
     301    Xd=dpx*(X-Calib.Cx_Cy(1)); % sensor coordinates
     302    Yd=(Y-Calib.Cx_Cy(2));
     303    dist_fact=1+Calib.kc*(Xd.*Xd+Yd.*Yd)/(f*f); %distortion factor
     304    Xu=Xd./dist_fact;%undistorted sensor coordinates
     305    Yu=Yd./dist_fact;
    288306    denom=Dx*Xu+Dy*Yu+D0;
    289307    % denom2=denom.*denom;
    290308    Xphys=(A11.*Xu+A12.*Yu+X0)./denom;%world coordinates
    291309    Yphys=(A21.*Xu+A22.*Yu+Y0)./denom;
     310%     Xd=(X-Calib.Cx_Cy(1))/Calib.fx_fy(1); % sensor coordinates
     311%     Yd=(Y-Calib.Cx_Cy(2))/Calib.fx_fy(2);
     312%     dist_fact=1+Calib.kc*(Xd.*Xd+Yd.*Yd); %distortion factor
     313%     Xu=Xd./dist_fact;%undistorted sensor coordinates
     314%     Yu=Yd./dist_fact;
     315%     A11=R(7)*Xu-R(1);
     316%     A12=R(8)*Xu-R(2);
     317%     A21=R(7)*Yu-R(4);
     318%     A22=R(8)*Yu-R(5);
     319%     B1=(R(3)-R(9)*Xu)*Zphys-Tz*Xu+Tx;
     320%     B2=(R(6)-R(9)*Yu)*Zphys-Tz*Yu+Ty;
     321%     deter=A12.*A21-A11.*A22;
     322%     Xphys=(A21.*B1-A11.*B2)./deter;
     323%     Yphys=(-A22.*B1+A12.*B2)./deter;
     324else
     325    Xphys=-Calib.Tx_Ty_Tz(1)+X/Calib.fx_fy(1);
     326    Yphys=-Calib.Tx_Ty_Tz(2)+Y/Calib.fx_fy(2);
    292327end
    293328
Note: See TracChangeset for help on using the changeset viewer.