Changeset 209


Ignore:
Timestamp:
Feb 27, 2011, 10:43:18 PM (13 years ago)
Author:
sommeria
Message:

phys improved to deal with 3D fields

File:
1 edited

Legend:

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

    r202 r209  
    9494end
    9595
     96% DataOut.VarDimName{2}
     97% DataOut.VarDimName{3}
     98% DataOut.VarDimName{4}
     99% DataOut.VarDimName{5}
     100% DataOut.VarDimName{6}
     101% DataOut.VarDimName{7}
     102% DataOut.VarAttribute{1}
     103% DataOut.VarAttribute{2}
     104% DataOut.VarAttribute{3}
     105% DataOut.VarAttribute{4}
     106% DataOut.VarAttribute{5}
     107% DataOut.VarAttribute{6}
     108% DataOut.VarAttribute{7}
    96109%------------------------------------------------
    97110function DataOut=phys_1(Data,Calib)
     
    100113DataOut=Data;%default
    101114% DataOut.CoordUnit=Calib.CoordUnit; %put flag for physical coordinates
    102 if isfield(Calib,'SliceCoord')
    103     DataOut.PlaneCoord=Calib.SliceCoord;%to generalise for any plane
     115if isfield(Calib,'SliceCoord') && isfield(Data,'ZIndex')&&~isempty(Data.ZIndex)&&~isnan(Data.ZIndex)
     116    DataOut.PlaneCoord=Calib.SliceCoord(Data.ZIndex,:);% transfer the slice position
     117    if isfield(Calib,'SliceAngle') % transfer the slice rotation angles
     118        DataOut.PlaneAngle=Calib.SliceAngle(Data.ZIndex,:);
     119    end
    104120end
    105121% The transform ACTS ONLY IF .CoordType='px'and Calib defined
     
    112128    DataOut.TimeUnit='s';
    113129    %transform of X,Y coordinates for vector fields
     130    test_z=0;
    114131    if isfield(Data,'ZIndex') && ~isempty(Data.ZIndex)&&~isnan(Data.ZIndex)
    115132        Z=Data.ZIndex;
     133        test_z=1;
    116134    else
    117135        Z=0;
     
    119137    if isfield(Data,'X') &&isfield(Data,'Y')&&~isempty(Data.X) && ~isempty(Data.Y)
    120138        [DataOut.X,DataOut.Y,DataOut.Z]=phys_XYZ(Calib,Data.X,Data.Y,Z);
     139        if test_z
     140             DataOut.ListVarName=[DataOut.ListVarName(1:2) {'Z'} DataOut.ListVarName(3:end)];
     141             DataOut.VarDimName=[DataOut.VarDimName(1:2) DataOut.VarDimName(1) DataOut.VarDimName(3:end)];
     142             ZAttribute{1}.Role='coord_z';
     143             DataOut.VarAttribute=[DataOut.VarAttribute(1:2) ZAttribute DataOut.VarAttribute(3:end)];
     144        end
    121145        if isfield(Data,'U')&&isfield(Data,'V')&&~isempty(Data.U) && ~isempty(Data.V)&& isfield(Data,'dt')
    122146            if ~isempty(Data.dt)
     
    209233        if numel(siz)==2 %(B/W images)
    210234            vec_A=reshape(A{icell},1,npx(icell)*npy(icell));%put the original image in line
    211             ind_in=find(flagin);
     235            %ind_in=find(flagin);
    212236            ind_out=find(~flagin);
    213237            ICOMB=((XIMA-1)*npy(icell)+(npy(icell)+1-YIMA));
    214238            ICOMB=ICOMB(flagin);%index corresponding to XIMA and YIMA in the aligned original image vec_A
    215             vec_B(ind_in)=vec_A(ICOMB);
    216             vec_B(ind_out)=zeros(size(ind_out));
     239            %vec_B(ind_in)=vec_A(ICOMB);
     240            vec_B(flagin)=vec_A(ICOMB);
     241            vec_B(~flagin)=zeros(size(ind_out));
     242%             vec_B(ind_out)=zeros(size(ind_out));
    217243            A_out{icell}=reshape(vec_B,npY,npX);%new image in real coordinates
    218244        elseif numel(siz)==3     
    219245            for icolor=1:siz(3)
    220246                vec_A=reshape(A{icell}(:,:,icolor),1,npx*npy);%put the original image in line
    221                 ind_in=find(flagin);
     247               % ind_in=find(flagin);
    222248                ind_out=find(~flagin);
    223249                ICOMB=((XIMA-1)*npy+(npy+1-YIMA));
    224250                ICOMB=ICOMB(flagin);%index corresponding to XIMA and YIMA in the aligned original image vec_A
    225                 vec_B(ind_in)=vec_A(ICOMB);
    226                 vec_B(ind_out)=zeros(size(ind_out));
     251                vec_B(flagin)=vec_A(ICOMB);
     252                vec_B(~flagin)=zeros(size(ind_out));
    227253                A_out{icell}(:,:,icolor)=reshape(vec_B,npy,npx);%new image in real coordinates
    228254            end
     
    251277%INPUT:
    252278%Z: index of plane
    253 function [Xphys,Yphys,Zphys]=phys_XYZ(Calib,X,Y,Z)
     279function [Xphys,Yphys,Zphys]=phys_XYZ(Calib,X,Y,Zindex)
    254280%------------------------------------------------------------------------
    255 if exist('Z','var')&& isequal(Z,round(Z))&& Z>0 && isfield(Calib,'SliceCoord')&&length(Calib.SliceCoord)>=Z
    256     Zindex=Z;
    257     Zphys=Calib.SliceCoord(Zindex,3);%GENERALISER AUX CAS AVEC ANGLE
     281testangle=0;
     282test_refraction=0;
     283if exist('Zindex','var')&& isequal(Zindex,round(Zindex))&& Zindex>0 && isfield(Calib,'SliceCoord')&&length(Calib.SliceCoord)>=Zindex
     284    if isfield(Calib, 'SliceAngle') && ~isequal(Calib.SliceAngle,0)
     285        testangle=1;
     286        om=norm(Calib.SliceAngle(Zindex,:));%norm of rotation angle in radians
     287        OmAxis=Calib.SliceAngle(Zindex,:)/om; %unit vector marking the rotation axis
     288        cos_om=cos(pi*om/180);
     289        sin_om=sin(pi*om/180);
     290        coeff=OmAxis(3)*(1-cos_om);
     291        norm_plane(1)=OmAxis(1)*coeff+OmAxis(2)*sin_om;
     292        norm_plane(2)=OmAxis(2)*coeff-OmAxis(1)*sin_om;
     293        norm_plane(3)=OmAxis(3)*coeff+cos_om;
     294        Z0=norm_plane*Calib.SliceCoord(Zindex,:)'/norm_plane(3);
     295    else
     296        Z0=Calib.SliceCoord(Zindex,3);%horizontal plane z=cte
     297    end
     298    Z0virt=Z0;
    258299    if isfield(Calib,'InterfaceCoord') && isfield(Calib,'RefractionIndex')
    259300        H=Calib.InterfaceCoord(3);
    260         if H>Zphys
    261             Zphys=H-(H-Zphys)/Calib.RefractionIndex; %corrected z (virtual object)
     301        if H>Z0
     302            Z0virt=H-(H-Z0)/Calib.RefractionIndex; %corrected z (virtual object)
     303            test_refraction=1;
    262304        end
    263305    end   
    264306else
    265     Zphys=0;
     307    Z0=0;
     308    Z0virt=0;
    266309end
    267310if ~exist('X','var')||~exist('Y','var')
     
    285328if isfield(Calib,'R')
    286329    R=(Calib.R)';
     330    if testangle
     331        a=-norm_plane(1)/norm_plane(3);
     332        b=-norm_plane(2)/norm_plane(3);
     333        if test_refraction
     334            a=a/Calib.RefractionIndex;
     335            b=b/Calib.RefractionIndex;
     336        end
     337        R(1)=R(1)+a*R(3);
     338        R(2)=R(2)+b*R(3);
     339        R(4)=R(4)+a*R(6);
     340        R(5)=R(5)+b*R(6);
     341        R(7)=R(7)+a*R(9);
     342        R(8)=R(8)+b*R(9);
     343    end
    287344    Tx=Calib.Tx_Ty_Tz(1);
    288345    Ty=Calib.Tx_Ty_Tz(2);
     
    299356    Zx0=R(3)*R(5)-R(2)*R(6);
    300357    Zy0=R(1)*R(6)-R(3)*R(4);
    301     A11=R(8)*Ty-R(5)*Tz+Z11*Zphys;
    302     A12=R(2)*Tz-R(8)*Tx+Z12*Zphys;
    303     A21=-R(7)*Ty+R(4)*Tz+Z21*Zphys;
    304     A22=-R(1)*Tz+R(7)*Tx+Z22*Zphys;
    305     X0=f*(R(5)*Tx-R(2)*Ty+Zx0*Zphys);
    306     Y0=f*(-R(4)*Tx+R(1)*Ty+Zy0*Zphys);
     358    A11=R(8)*Ty-R(5)*Tz+Z11*Z0virt;
     359    A12=R(2)*Tz-R(8)*Tx+Z12*Z0virt;
     360    A21=-R(7)*Ty+R(4)*Tz+Z21*Z0virt;
     361    A22=-R(1)*Tz+R(7)*Tx+Z22*Z0virt;
     362    X0=f*(R(5)*Tx-R(2)*Ty+Zx0*Z0virt);
     363    Y0=f*(-R(4)*Tx+R(1)*Ty+Zy0*Z0virt);
    307364        %px to camera:
    308365    Xd=dpx*(X-Calib.Cx_Cy(1)); % sensor coordinates
     
    312369    Yu=Yd./dist_fact;
    313370    denom=Dx*Xu+Dy*Yu+D0;
    314     % denom2=denom.*denom;
    315371    Xphys=(A11.*Xu+A12.*Yu+X0)./denom;%world coordinates
    316372    Yphys=(A21.*Xu+A22.*Yu+Y0)./denom;
    317 %     Xd=(X-Calib.Cx_Cy(1))/Calib.fx_fy(1); % sensor coordinates
    318 %     Yd=(Y-Calib.Cx_Cy(2))/Calib.fx_fy(2);
    319 %     dist_fact=1+Calib.kc*(Xd.*Xd+Yd.*Yd); %distortion factor
    320 %     Xu=Xd./dist_fact;%undistorted sensor coordinates
    321 %     Yu=Yd./dist_fact;
    322 %     A11=R(7)*Xu-R(1);
    323 %     A12=R(8)*Xu-R(2);
    324 %     A21=R(7)*Yu-R(4);
    325 %     A22=R(8)*Yu-R(5);
    326 %     B1=(R(3)-R(9)*Xu)*Zphys-Tz*Xu+Tx;
    327 %     B2=(R(6)-R(9)*Yu)*Zphys-Tz*Yu+Ty;
    328 %     deter=A12.*A21-A11.*A22;
    329 %     Xphys=(A21.*B1-A11.*B2)./deter;
    330 %     Yphys=(-A22.*B1+A12.*B2)./deter;
     373    if testangle
     374        Zphys=Z0+a*Xphys+b*Yphys;
     375    else
     376        Zphys=Z0;
     377    end
    331378else
    332379    Xphys=-Calib.Tx_Ty_Tz(1)+X/Calib.fx_fy(1);
     
    343390% Calib: structure containing the calibration parameters (read from the ImaDoc .xml file)
    344391% Xphys, Yphys: array of x,y physical coordinates
    345 % [Zphys]: corresponding array of z physical coordinates (0 by default)
    346 
    347 
    348 
    349 
     392% [Z0]: corresponding array of z physical coordinates (0 by default)
     393
     394
     395
     396
Note: See TracChangeset for help on using the changeset viewer.