Ignore:
Timestamp:
Feb 23, 2015, 10:17:04 PM (9 years ago)
Author:
sommeria
Message:

stereo_civ and civ2vel_3C updated, spline introduced for civ_series:deformation

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/series/civ2vel_3C.m

    r864 r878  
    169169%% MAIN LOOP ON FIELDS
    170170warning off
    171 if NbField<2 && length(filecell{:,1})>2
     171if NbField<2
    172172    disp_uvmat('ERROR','you need at least 2 images to compute the mean position for the stereo.',checkrun)
    173173return
     
    285285end
    286286    ZI=mean(ZItemp,3); %mean between two the two time step
     287    Vtest=ZItemp(:,:,2)-ZItemp(:,:,1);
    287288   
    288289    [Xa,Ya]=px_XYZ(XmlData{1}.GeometryCalib,XI,YI,ZI);% set of image coordinates on view a
    289290    [Xb,Yb]=px_XYZ(XmlData{2}.GeometryCalib,XI,YI,ZI);% set of image coordinates on view b
    290291   
    291     %trouver z
    292     % trouver les coordonnées px sur chaque image.
    293     %A=
     292   
    294293    for iview=1:2
    295294        %% reading input file(s)
     
    322321    Ua=griddata(X1,Y1,U1,Xa,Ya);
    323322    Va=griddata(X1,Y1,V1,Xa,Ya);
    324     A=get_coeff(XmlData{1}.GeometryCalib,Xa,Ya,YI,YI,ZI);
    325    
    326    
     323   
     324    [Ua,Va,Xa,Ya]=Ud2U(XmlData{1}.GeometryCalib,Xa,Ya,Ua,Va); % convert Xd data to X
     325    [A]=get_coeff(XmlData{1}.GeometryCalib,Xa,Ya,XI,YI,ZI); %get coef A~
     326   
     327    %remove wrong vector
    327328    temp=find(Data{2}.FF==0);
    328329    X2=Data{2}.X(temp);
     
    332333    Ub=griddata(X2,Y2,U2,Xb,Yb);
    333334    Vb=griddata(X2,Y2,V2,Xb,Yb);
    334     B=get_coeff(XmlData{2}.GeometryCalib,Xb,Yb,YI,YI,ZI);
     335
     336    [Ub,Vb,Xb,Yb]=Ud2U(XmlData{2}.GeometryCalib,Xb,Yb,Ub,Vb); % convert Xd data to X
     337    [B]=get_coeff(XmlData{2}.GeometryCalib,Xb,Yb,XI,YI,ZI); %get coef B~
     338   
     339   
     340    % System to solve
    335341    S=ones(size(XI,1),size(XI,2),3);
    336342    D=ones(size(XI,1),size(XI,2),3,3);
     343
    337344    S(:,:,1)=A(:,:,1,1).*Ua+A(:,:,2,1).*Va+B(:,:,1,1).*Ub+B(:,:,2,1).*Vb;
    338345    S(:,:,2)=A(:,:,1,2).*Ua+A(:,:,2,2).*Va+B(:,:,1,2).*Ub+B(:,:,2,2).*Vb;
     
    349356    for indj=1:size(XI,1)
    350357        for indi=1:size(XI,2)
    351             dxyz=squeeze(S(indj,indi,:))\squeeze(D(indj,indi,:,:));
     358            dxyz=(squeeze(D(indj,indi,:,:))*1000)\(squeeze(S(indj,indi,:))*1000); % solving...
    352359            U(indj,indi)=dxyz(1);
    353360            V(indj,indi)=dxyz(2);
     
    360367    Error(:,:,3)=B(:,:,1,1).*U+B(:,:,1,2).*V+B(:,:,1,3).*W-Ub;
    361368    Error(:,:,4)=B(:,:,2,1).*U+B(:,:,2,2).*V+B(:,:,2,3).*W-Vb;
     369   
     370   
     371
    362372   
    363373    %% generating the name of the merged field
     
    396406    MergeData.V=V/Dt;
    397407    MergeData.W=W/Dt;
    398     MergeData.Error=sqrt(sum(Error.*Error,3));
     408   
     409    mfx=(XmlData{1}.GeometryCalib.fx_fy(1)+XmlData{2}.GeometryCalib.fx_fy(1))/2;
     410    mfy=(XmlData{1}.GeometryCalib.fx_fy(2)+XmlData{2}.GeometryCalib.fx_fy(2))/2;
     411    MergeData.Error=(sqrt(mfx^2+mfy^2)/4).*sqrt(sum(Error.*Error,3));
    399412    errormsg=struct2nc(OutputFile,MergeData);%save result file
    400413    if isempty(errormsg)
     
    406419
    407420
    408 function A=get_coeff(Calib,X,Y,x,y,z)
     421function [A]=get_coeff(Calib,X,Y,x,y,z) % compute A~ coefficients
    409422R=(Calib.R)';%rotation matrix
    410423T_z=Calib.Tx_Ty_Tz(3);
    411424T=R(7)*x+R(8)*y+R(9)*z+T_z;
     425
    412426A(:,:,1,1)=(R(1)-R(7)*X)./T;
    413427A(:,:,1,2)=(R(2)-R(8)*X)./T;
     
    417431A(:,:,2,3)=(R(6)-R(9)*Y)./T;
    418432
    419 
    420 
    421 
    422 function [z,Xphy,Yphy,error]=shift2z(xmid, ymid, u, v,XmlData)
     433function [U,V,X,Y]=Ud2U(Calib,Xd,Yd,Ud,Vd) % convert Xd to X  and Ud to U
     434
     435X1d=Xd-Ud/2;
     436X2d=Xd+Ud/2;
     437Y1d=Yd-Vd/2;
     438Y2d=Yd+Vd/2;
     439
     440X1=(X1d-Calib.Cx_Cy(1))./Calib.fx_fy(1).*(1 + Calib.kc.*Calib.fx_fy(1).^(-2).*(X1d-Calib.Cx_Cy(1)).^2 + Calib.kc.*Calib.fx_fy(2).^(-2).*(Y1d-Calib.Cx_Cy(2)).^2 ).^(-1);
     441X2=(X2d-Calib.Cx_Cy(1))./Calib.fx_fy(1).*(1 + Calib.kc.*Calib.fx_fy(1).^(-2).*(X2d-Calib.Cx_Cy(1)).^2 + Calib.kc.*Calib.fx_fy(2).^(-2).*(Y2d-Calib.Cx_Cy(2)).^2 ).^(-1);
     442Y1=(Y1d-Calib.Cx_Cy(2))./Calib.fx_fy(2).*(1 + Calib.kc.*Calib.fx_fy(1).^(-2).*(X1d-Calib.Cx_Cy(1)).^2 + Calib.kc.*Calib.fx_fy(2).^(-2).*(Y1d-Calib.Cx_Cy(2)).^2 ).^(-1);
     443Y2=(Y2d-Calib.Cx_Cy(2))./Calib.fx_fy(2).*(1 + Calib.kc.*Calib.fx_fy(1).^(-2).*(X2d-Calib.Cx_Cy(1)).^2 + Calib.kc.*Calib.fx_fy(2).^(-2).*(Y2d-Calib.Cx_Cy(2)).^2 ).^(-1);
     444
     445U=X2-X1;
     446V=Y2-Y1;
     447X=X1+U/2;
     448Y=Y1+V/2;
     449
     450
     451
     452function [z,Xphy,Yphy,error]=shift2z(xmid, ymid, u, v,XmlData) % get H from stereo data
    423453z=0;
    424454error=0;
     
    429459R=(Calib_A.R)';
    430460x_a=xmid- u/2;
    431 y_a=ymid- u/2;
     461y_a=ymid- v/2;
    432462z_a=R(7)*x_a+R(8)*y_a+Calib_A.Tx_Ty_Tz(1,3);
    433463Xa=(R(1)*x_a+R(2)*y_a+Calib_A.Tx_Ty_Tz(1,1))./z_a;
     
    445475
    446476%% second image
     477%loading shift angle
     478
    447479Calib_B=XmlData{2}.GeometryCalib;
    448480R=(Calib_B.R)';
     481
     482
    449483x_b=xmid+ u/2;
    450484y_b=ymid+ v/2;
     
    464498%% result
    465499Den=(Dxb-Dxa).*(Dxb-Dxa)+(Dyb-Dya).*(Dyb-Dya);
    466 error=((Dyb-Dya).*u-(Dxb-Dxa).*v)./Den;
     500error=((Dyb-Dya).*(-u)-(Dxb-Dxa).*(-v))./Den;
     501% ex=-error.*(Dyb-Dya);
     502% ey=-error.*(Dxb-Dxa);
     503
     504% z1=-u./(Dxb-Dxa);
     505% z2=-v./(Dyb-Dya);
     506z=((Dxb-Dxa).*(-u)+(Dyb-Dya).*(-v))./Den;
    467507
    468508xnew(1,:)=Dxa.*z+x_a;
     
    470510ynew(1,:)=Dya.*z+y_a;
    471511ynew(2,:)=Dyb.*z+y_b;
    472 
    473 Xphy=mean(xnew,1); %on moyenne les 2 valeurs
    474 Yphy=mean(ynew,1);
    475 z=((Dxb-Dxa).*u-(Dyb-Dya).*v)./Den;
    476 
    477 
     512Xphy=mean(xnew,1);
     513Yphy=mean(ynew,1);
     514
     515
     516
     517
Note: See TracChangeset for help on using the changeset viewer.