- Timestamp:
- Feb 3, 2015, 7:59:58 PM (10 years ago)
- Location:
- trunk/src
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/calc_field_interp.m
r809 r863 50 50 Operator{ilist}='';%default empty operator (vec, norm,...) 51 51 r=regexp(FieldName{ilist},'(?<Operator>(^vec|^norm|^curl|^div|^strain))\((?<UName>.+),(?<VName>.+)\)$','names');% analyse the field name 52 if isempty(r) % the field name is a variable itself52 if isempty(r) % no operator: the field name is a variable itself 53 53 ivar=find(strcmp(FieldName{ilist},Data.ListVarName)); 54 if isempty(ivar) 54 if isempty(ivar)% the requested variable does not exist 55 55 check_skipped(ilist)=1; %variable not found 56 elseif isempty(find(strcmp(FieldName{ilist},InputVarList), 1)); 56 elseif isempty(find(strcmp(FieldName{ilist},InputVarList), 1));% the variable exists and has not been already selected 57 57 if isfield(Data.VarAttribute{ivar},'Role') &&... 58 (strcmp(Data.VarAttribute{ivar}.Role,'ancillary')||strcmp(Data.VarAttribute{ivar}.Role,'warnflag')||strcmp(Data.VarAttribute{ivar}.Role,'errorflag')) 59 check_interp(ilist)=0; % ancillary variable, not interpolated 58 (strcmp(Data.VarAttribute{ivar}.Role,'ancillary')||strcmp(Data.VarAttribute{ivar}.Role,'warnflag')||strcmp(Data.VarAttribute{ivar}.Role,'errorflag')) 59 check_interp(ilist)=0; % ancillary variable, not interpolated ????? 60 check_skipped(ilist)=1; %variable not used 61 else 62 InputVarList=[InputVarList FieldName{ilist}];% the variable is added to the list of input variables 60 63 end 61 InputVarList=[InputVarList FieldName{ilist}];% the variable is added to the list of input variables if it is not already in the list62 64 end 63 65 else … … 161 163 162 164 %% put an error flag to indicate NaN data 163 if exist('XI','var')&&~isempty(VarVal)164 nbvar=numel(VarVal);165 ListVarName{nbvar+1}='FF';166 VarVal{nbvar+1}=isnan(VarVal{nbvar});167 VarAttribute{nbvar+1}.Role='errorflag';168 end165 % if exist('XI','var')&&~isempty(VarVal) 166 % nbvar=numel(VarVal); 167 % ListVarName{nbvar+1}='FF'; 168 % VarVal{nbvar+1}=isnan(VarVal{nbvar}); 169 % VarAttribute{nbvar+1}.Role='errorflag'; 170 % end 169 171 170 172 -
trunk/src/check_files.m
r856 r863 95 95 'rotate_points';...%'rotate_points': associated with GUI rotate_points.fig to introduce (2D) rotation parameters 96 96 'rotate_points.fig';... 97 'RUN_STLIN';...% combine 2 displacement fields for stereo PIV98 97 'series';...% master function for analysis field series, with interface 'series.fig' 99 98 'series.fig';...% interface for 'series' -
trunk/src/get_file_series.m
r809 r863 60 60 Param.IndexRange.PairString={Param.IndexRange.PairString}; 61 61 end 62 if ~isempty(Param.IndexRange.PairString{iview,1}) 62 63 r=regexp(Param.IndexRange.PairString{iview,1},'(?<mode>(Di=)|(Dj=)) -*(?<num1>\d+)\|(?<num2>\d+)','names');%look for mode=Dj or Di 63 64 if isempty(r) 64 65 r=regexp(Param.IndexRange.PairString{iview,1},'(?<num1>\d+)(?<mode>-)(?<num2>\d+)','names');%look for burst pairs 66 end 65 67 end 66 68 % TODO case of free pairs: -
trunk/src/proj_field.m
r854 r863 485 485 end 486 486 487 488 487 %----------------------------------------------------------------- 489 488 %project on a line … … 696 695 end 697 696 elseif isequal(ProjMode,'interp_lin') %filtering %linear interpolation: 697 if ~isequal(errorflag,0) 698 VarName_FF=FieldData.ListVarName{CellInfo{icell}.VarIndex_errorflag}; 699 indsel=find(FieldData.(VarName_FF)==0); 700 coord_x=coord_x(indsel); 701 coord_y=coord_y(indsel); 702 for ivar=1:numel(CellInfo{icell}.VarIndex) 703 VarName=FieldData.ListVarName{CellInfo{icell}.VarIndex(ivar)}; 704 FieldData.(VarName)=FieldData.(VarName)(indsel); 705 end 706 end 698 707 [ProjVar,ListFieldProj,VarAttribute,errormsg]=calc_field_interp([coord_x coord_y],FieldData,CellInfo{icell}.FieldName,XI,YI); 699 708 ProjData.X=Xproj; -
trunk/src/series.m
r857 r863 2265 2265 end 2266 2266 end 2267 case ' first'2267 case 'one' 2268 2268 OutputDirVisible='on'; 2269 2269 SubDirOut=InputTable{1,2}; %use the first subdir name (+OutputDirExt) as output subdirectory 2270 case 'two' 2271 OutputDirVisible='on'; 2272 SubDir=InputTable(1:2,2); %set of subdirectories 2273 SubDirOut=SubDir{1}; 2274 if numel(SubDir)>1 2275 SubDirOut=[SubDirOut '-' regexprep(SubDir{2},'^/','')]; 2276 end 2270 2277 case 'last' 2271 2278 OutputDirVisible='on'; -
trunk/src/series/civ2vel_3C.m
r862 r863 55 55 %% set the input elements needed on the GUI series when the function is selected in the menu ActionName or InputTable refreshed 56 56 if isstruct(Param) && isequal(Param.Action.RUN,0) 57 ParamOut.AllowInputSort='o n';% allow alphabetic sorting of the list of input file SubDir (options 'off'/'on', 'off' by default)57 ParamOut.AllowInputSort='off';% allow alphabetic sorting of the list of input file SubDir (options 'off'/'on', 'off' by default) 58 58 ParamOut.WholeIndexRange='off';% prescribes the file index ranges from min to max (options 'off'/'on', 'off' by default) 59 59 ParamOut.NbSlice='off'; %nbre of slices ('off' by default) … … 62 62 ParamOut.FieldTransform = 'off';%use the phys transform function without choice 63 63 %ParamOut.TransformPath=fullfile(fileparts(which('uvmat')),'transform_field');% path to transform functions (needed for compilation only) 64 ParamOut.ProjObject='o ff';%can use projection object(option 'off'/'on',64 ParamOut.ProjObject='on';%can use projection object(option 'off'/'on', 65 65 ParamOut.Mask='off';%can use mask option (option 'off'/'on', 'off' by default) 66 66 ParamOut.OutputDirExt='.vel3C';%set the output dir extension 67 ParamOut.OutputSubDirMode='two'; % the two first input lines are used to define the output subfolder 67 68 ParamOut.OutputFileMode='NbInput';% '=NbInput': 1 output file per input file index, '=NbInput_i': 1 file per input file index i, '=NbSlice': 1 file per slice 68 69 %check the input files 69 70 first_j=[]; 71 if size(Param.InputTable,1)<2 72 msgbox_uvmat('WARNING',['two or three input file series are needed']) 73 end 70 74 if isfield(Param.IndexRange,'first_j'); first_j=Param.IndexRange.first_j; end 71 75 PairString=''; … … 94 98 WaitbarHandle=findobj(hseries,'Tag','Waitbar');%handle of waitbar in GUI series 95 99 100 101 %% root input file(s) name, type and index series 102 RootPath=Param.InputTable(:,1); 103 RootFile=Param.InputTable(:,3); 104 SubDir=Param.InputTable(:,2); 105 NomType=Param.InputTable(:,4); 106 FileExt=Param.InputTable(:,5); 107 hdisp=disp_uvmat('WAITING...','checking the file series',checkrun); 108 [filecell,i1_series,i2_series,j1_series,j2_series]=get_file_series(Param); 109 if ~isempty(hdisp),delete(hdisp),end; 110 %%%%%%%%%%%% 111 % The cell array filecell is the list of input file names, while 112 % filecell{iview,fileindex}: 113 % iview: line in the table corresponding to a given file series 114 % fileindex: file index within the file series, 115 % i1_series(iview,ref_j,ref_i)... are the corresponding arrays of indices i1,i2,j1,j2, depending on the input line iview and the two reference indices ref_i,ref_j 116 % i1_series(iview,fileindex) expresses the same indices as a 1D array in file indices 117 %%%%%%%%%%%% 118 NbView=numel(i1_series);%number of input file series (lines in InputTable) 119 NbField_j=size(i1_series{1},1); %nb of fields for the j index (bursts or volume slices) 120 NbField_i=size(i1_series{1},2); %nb of fields for the i index 121 NbField=NbField_j*NbField_i; %total number of fields 122 96 123 %% define the directory for result file (with path=RootPath{1}) 97 124 OutputDir=[Param.OutputSubDir Param.OutputDirExt];% subdirectory for output files 98 % 125 % 99 126 % if ~isfield(Param,'InputFields') 100 127 % Param.InputFields.FieldName=''; … … 105 132 if size(time,1)>1 106 133 diff_time=max(max(diff(time))); 107 if diff_time>0 134 if diff_time>0 108 135 disp_uvmat('WARNING',['times of series differ by (max) ' num2str(diff_time) ': the mean time is chosen in result'],checkrun) 109 end 136 end 110 137 end 111 138 if ~isempty(errormsg) 112 139 disp_uvmat('WARNING',errormsg,checkrun) 113 140 end 114 time=mean(time,1); %averaged time taken for the merged field 141 time=mean(time,1); %averaged time taken for the merged field 115 142 if isfield(XmlData{1},'GeometryCalib') 116 117 118 119 120 121 122 123 124 125 126 143 tsaiA=XmlData{1}.GeometryCalib; 144 else 145 disp_uvmat('ERROR','no geometric calibration available for image A',checkrun) 146 return 147 end 148 if isfield(XmlData{2},'GeometryCalib') 149 tsaiB=XmlData{2}.GeometryCalib; 150 else 151 disp_uvmat('ERROR','no geometric calibration available for image B',checkrun) 152 return 153 end 127 154 [filecell,i1_series,i2_series,j1_series,j2_series]=get_file_series(Param); 128 155 129 156 %% grid of physical positions (given by projection plane) 130 157 if ~Param.CheckObject 131 132 158 disp_uvmat('ERROR','a projection plane with interpolation is needed',checkrun) 159 return 133 160 end 134 161 ObjectData=Param.ProjObject; 135 136 [x,y]=meshgrid(ObjectData.RangeX(1):ObjectData.DX:ObjectData.RangeX(2),ObjectData.RangeY(1):ObjectData.DY:ObjectData.RangeY(2)); 137 z=zeros(size(x)); 138 [Field,ParamOut,errormsg] = read_field(FileName,FileType,ParamIn,num) 139 %camera coordinates:initialisation 2 cameras 140 NbCamera=2; 141 X=zeros(NbCamera,size(x,1),size(y,1)); 142 Y=zeros(NbCamera,size(x,1),size(y,1)); 143 for icamera=1:NbCamera 144 %camera coordinates 145 Calib=XmlData{1}.GeometryCalib; 146 xc=R(1)*Xphys+R(2)*Yphys+R(3)*Zphys+Calib.Tx_Ty_Tz(1); 147 yc=R(4)*Xphys+R(5)*Yphys+R(6)*Zphys+Calib.Tx_Ty_Tz(2); 148 zc=R(7)*Xphys+R(8)*Yphys+R(9)*Zphys+Calib.Tx_Ty_Tz(3); 149 150 %undistorted image coordinates 151 X(icamera,:,:)=xc./zc; 152 Y(icamera,:,:)=yc./zc; 153 end 154 155 %% case of fixed planes (for moving interface, coeff need to be calculated for each field 156 if isequal(size(InputTable),2) 157 [S,D]=get_coeff(XmlData,X,Y); 158 end 159 160 %% MAIN LOOP ON FIELDS 162 xI=ObjectData.RangeX(1):ObjectData.DX:ObjectData.RangeX(2); 163 yI=ObjectData.RangeY(1):ObjectData.DY:ObjectData.RangeY(2); 164 [XI,YI]=meshgrid(xI,yI); 165 U=zeros(size(XI,1),size(XI,2)); 166 V=zeros(size(XI,1),size(XI,2)); 167 W=zeros(size(XI,1),size(XI,2)); 168 169 %% MAIN LOOP ON FIELDS 170 warning off 161 171 for index=1:NbField 162 172 update_waitbar(WaitbarHandle,index/NbField) 163 173 if ~isempty(RUNHandle) && ~strcmp(get(RUNHandle,'BusyAction'),'queue') 164 174 disp('program stopped by user') … … 169 179 Data=cell(1,NbView);%initiate the set Data 170 180 timeread=zeros(1,NbView); 171 for iview=1:NbView 181 [Data{3},tild,errormsg] = nc2struct(filecell{3,index}); 182 ZI=griddata(Data{3}.Xphys,Data{3}.Yphys,Data{3}.Zphys,XI,YI); 183 [Xa,Ya]=px_XYZ(XmlData{1}.GeometryCalib,XI,YI,ZI);% set of image coordinates on view a 184 [Xb,Yb]=px_XYZ(XmlData{2}.GeometryCalib,XI,YI,ZI);% set of image coordinates on view b 185 186 %trouver z 187 % trouver les coordonnées px sur chaque image. 188 %A= 189 for iview=1:2 172 190 %% reading input file(s) 173 [Data{iview},tild,errormsg] = read_field(filecell{iview,index},FileType{iview},Param.InputFields,frame_index{iview}(index));191 [Data{iview},tild,errormsg]=read_civdata(filecell{iview,index},{'vec(U,V)'},'*'); 174 192 if ~isempty(errormsg) 175 193 disp_uvmat('ERROR',['ERROR in civ2vel_3C/read_field/' errormsg],checkrun) … … 177 195 end 178 196 % get the time defined in the current file if not already defined from the xml file 179 if ~isempty(time) && isfield(Data{iview},'Time') 180 timeread(iview)=Data{iview}.Time; 181 end 182 if ~isempty(NbSlice_calib) 183 Data{iview}.ZIndex=mod(i1_series{iview}(index)-1,NbSlice_calib{iview})+1;%Zindex for phys transform 184 end 185 186 %% transform the input field (e.g; phys) if requested (no transform involving two input fields) 187 %camera coordinates 188 Data{iview}=phys(Data{iview},XmlData{iview}); 189 190 %% projection on object (gridded plane) 191 % if Param.CheckObject 192 [Data{iview},errormsg]=proj_field(Data{iview},Param.ProjObject); 193 if ~isempty(errormsg) 194 disp_uvmat('ERROR',['ERROR in merge_proge/proj_field: ' errormsg],checkrun) 195 return 196 end 197 198 end 199 %%%%%%%%%%%%%%%% END LOOP ON VIEWS %%%%%%%%%%%%%%%% 200 201 %% merge the NbView fields 202 [MergeData,errormsg]=merge_field(Data); 203 if ~isempty(errormsg) 204 disp_uvmat('ERROR',errormsg,checkrun); 205 return 206 end 207 208 %% time of the merged field: take the average of the different views 209 if ~isempty(time) 210 timeread=time(index); 211 elseif ~isempty(find(timeread))% time defined from ImaDoc 212 timeread=mean(timeread(timeread~=0));% take average over times form the files (when defined) 213 else 214 timeread=index;% take time=file index 215 end 216 197 if isfield(Data{iview},'Time')&& isequal(Data{iview}.Time,Data{1}.Time) 198 Time=Data{iview}.Time; 199 else 200 disp_uvmat('ERROR','Time undefined or not synchronous',checkrun) 201 return 202 end 203 if isfield(Data{iview},'Dt')&& isequal(Data{iview}.Dt,Data{1}.Dt) 204 Dt=Data{iview}.Dt; 205 else 206 disp_uvmat('ERROR','Dt undefined or not synchronous',checkrun) 207 return 208 end 209 end 210 Ua=griddata(Data{1}.X,Data{1}.Y,Data{1}.U,Xa,Ya); 211 Va=griddata(Data{1}.X,Data{1}.Y,Data{1}.V,Xa,Ya); 212 A=get_coeff(XmlData{1}.GeometryCalib,Xa,Ya,YI,YI,ZI); 213 214 Ub=griddata(Data{2}.X,Data{2}.Y,Data{1}.U,Xb,Yb); 215 Vb=griddata(Data{2}.X,Data{2}.Y,Data{2}.V,Xb,Yb); 216 B=get_coeff(XmlData{2}.GeometryCalib,Xb,Yb,YI,YI,ZI); 217 S=ones(size(XI,1),size(XI,2),3); 218 D=ones(size(XI,1),size(XI,2),3,3); 219 S(:,:,1)=A(:,:,1,1).*Ua+A(:,:,2,1).*Va+B(:,:,1,1).*Ub+B(:,:,2,1).*Vb; 220 S(:,:,2)=A(:,:,1,2).*Ua+A(:,:,2,2).*Va+B(:,:,1,2).*Ub+B(:,:,2,2).*Vb; 221 S(:,:,3)=A(:,:,1,3).*Ua+A(:,:,2,3).*Va+B(:,:,1,3).*Ub+B(:,:,2,3).*Vb; 222 D(:,:,1,1)=A(:,:,1,1).*A(:,:,1,1)+A(:,:,2,1).*A(:,:,2,1)+B(:,:,1,1).*B(:,:,1,1)+B(:,:,2,1).*B(:,:,2,1); 223 D(:,:,1,2)=A(:,:,1,1).*A(:,:,1,2)+A(:,:,2,1).*A(:,:,2,2)+B(:,:,1,1).*B(:,:,1,2)+B(:,:,2,1).*B(:,:,2,2); 224 D(:,:,1,3)=A(:,:,1,1).*A(:,:,1,3)+A(:,:,2,1).*A(:,:,2,3)+B(:,:,1,1).*B(:,:,1,3)+B(:,:,2,1).*B(:,:,2,3); 225 D(:,:,2,1)=A(:,:,1,2).*A(:,:,1,1)+A(:,:,2,2).*A(:,:,2,1)+B(:,:,1,2).*B(:,:,1,1)+B(:,:,2,2).*B(:,:,2,1); 226 D(:,:,2,2)=A(:,:,1,2).*A(:,:,1,2)+A(:,:,2,2).*A(:,:,2,2)+B(:,:,1,2).*B(:,:,1,2)+B(:,:,2,2).*B(:,:,2,2); 227 D(:,:,2,3)=A(:,:,1,2).*A(:,:,1,3)+A(:,:,2,2).*A(:,:,2,3)+B(:,:,1,2).*B(:,:,1,3)+B(:,:,2,2).*B(:,:,2,3); 228 D(:,:,3,1)=A(:,:,1,3).*A(:,:,1,1)+A(:,:,2,3).*A(:,:,2,1)+B(:,:,1,3).*B(:,:,1,1)+B(:,:,2,3).*B(:,:,2,1); 229 D(:,:,3,2)=A(:,:,1,3).*A(:,:,1,2)+A(:,:,2,3).*A(:,:,2,2)+B(:,:,1,3).*B(:,:,1,2)+B(:,:,2,3).*B(:,:,2,2); 230 D(:,:,3,3)=A(:,:,1,3).*A(:,:,1,3)+A(:,:,2,3).*A(:,:,2,3)+B(:,:,1,3).*B(:,:,1,3)+B(:,:,2,3).*B(:,:,2,3); 231 for indj=1:size(XI,1) 232 for indi=1:size(XI,2) 233 dxyz=squeeze(S(indj,indi,:))\squeeze(D(indj,indi,:,:)); 234 U(indj,indi)=dxyz(1); 235 V(indj,indi)=dxyz(2); 236 W(indj,indi)=dxyz(3); 237 end 238 end 239 Error=zeros(size(XI,1),size(XI,2),4); 240 Error(:,:,1)=A(:,:,1,1).*U+A(:,:,1,2).*V+A(:,:,1,3).*W-Ua; 241 Error(:,:,2)=A(:,:,2,1).*U+A(:,:,2,2).*V+A(:,:,2,3).*W-Va; 242 Error(:,:,3)=B(:,:,1,1).*U+B(:,:,1,2).*V+B(:,:,1,3).*W-Ub; 243 Error(:,:,4)=B(:,:,2,1).*U+B(:,:,2,2).*V+B(:,:,2,3).*W-Vb; 244 217 245 %% generating the name of the merged field 218 246 i1=i1_series{1}(index); … … 232 260 end 233 261 end 234 OutputFile=fullfile_uvmat(RootPath{1},OutputDir,RootFile Out,FileExtOut,NomType{1},i1,i2,j1,j2);235 262 OutputFile=fullfile_uvmat(RootPath{1},OutputDir,RootFile{1},'.nc','_1-2',i1,i2,j1,j2); 263 236 264 %% recording the merged field 237 238 MergeData.ListGlobalAttribute={'Conventions',' Project','InputFile_1','InputFile_end','nb_coord','nb_dim'};265 if index==1% initiate the structure at first index 266 MergeData.ListGlobalAttribute={'Conventions','Time','Dt'}; 239 267 MergeData.Conventions='uvmat'; 240 MergeData.nb_coord=2; 241 MergeData.nb_dim=2; 242 dt=[]; 243 if isfield(Data{1},'dt')&& isnumeric(Data{1}.dt) 244 dt=Data{1}.dt; 245 end 246 for iview =2:numel(Data) 247 if ~(isfield(Data{iview},'dt')&& isequal(Data{iview}.dt,dt)) 248 dt=[];%dt not the same for all fields 249 end 250 end 251 if ~isempty(timeread) 252 MergeData.ListGlobalAttribute=[MergeData.ListGlobalAttribute {'Time'}]; 253 MergeData.Time=timeread; 254 end 255 if ~isempty(dt) 256 MergeData.ListGlobalAttribute=[MergeData.ListGlobalAttribute {'dt'}]; 257 MergeData.dt=dt; 258 end 259 error=struct2nc(OutputFile,MergeData);%save result file 260 if isempty(error) 261 disp(['output file ' OutputFile ' written']) 262 else 263 disp(error) 264 end 265 end 266 267 % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 268 % %read the velocity fields 269 % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 270 %read field A 271 [Field,VelTypeOut]=read_civxdata(file_A,[],vel_type); 272 %removes false vectors 273 if isfield(Field,'FF') 274 Field.X=Field.X(find(Field.FF==0)); 275 Field.Y=Field.Y(find(Field.FF==0)); 276 Field.U=Field.U(find(Field.FF==0)); 277 Field.V=Field.V(find(Field.FF==0)); 278 end 279 %interpolate on the grid common to both images in phys coordinates 280 dXa= griddata_uvmat(Field.X,Field.Y,Field.U,XimaA,YimaA); 281 dYa= griddata_uvmat(Field.X,Field.Y,Field.V,XimaA,YimaA); 282 dt=Field.dt; 283 time=Field.Time; 284 285 %read field B 286 [Field,VelTypeOut]=read_civxdata(file_B,[],vel_type); 287 if ~isequal(Field.dt,dt) 288 msgbox_uvmat('ERROR','different time intervals for the two velocity fields ') 289 return 290 end 291 if ~isequal(Field.Time,time) 292 msgbox_uvmat('ERROR','different times for the two velocity fields ') 293 return 294 end 295 %removes false vectors 296 if isfield(Field,'FF') 297 Field.X=Field.X(find(Field.FF==0)); 298 Field.Y=Field.Y(find(Field.FF==0)); 299 Field.U=Field.U(find(Field.FF==0)); 300 Field.V=Field.V(find(Field.FF==0)); 301 end 302 %interpolate on XimaB 303 dXb=griddata_uvmat(Field.X,Field.Y,Field.U,XimaB,YimaB); 304 dYb=griddata_uvmat(Field.X,Field.Y,Field.V,XimaB,YimaB); 305 %eliminate Not-a-Number 306 ind_Nan=find(and(~isnan(dXa),~isnan(dXb))); 307 dXa=dXa(ind_Nan); 308 dYa=dYa(ind_Nan); 309 dXb=dXb(ind_Nan); 310 dYb=dYb(ind_Nan); 311 grid_phys1(:,1)=grid_real_x(ind_Nan); 312 grid_phys1(:,2)=grid_real_y(ind_Nan); 313 314 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 315 %compute the differential coefficients of the geometric calibration 316 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 317 [A11,A12,A13,A21,A22,A23]=pxcm_tsai(tsaiA,grid_phys1); 318 [B11,B12,B13,B21,B22,B23]=pxcm_tsai(tsaiB,grid_phys1); 319 320 C1=A11.*A22-A12.*A21; 321 C2=A13.*A22-A12.*A23; 322 C3=A13.*A21-A11.*A23; 323 D1=B11.*B22-B12.*B21; 324 D2=B13.*B22-B12.*B23; 325 D3=B13.*B21-B11.*B23; 326 A1=(A22.*D1.*(C1.*D3-C3.*D1)+A21.*D1.*(C2.*D1-C1.*D2)); 327 A2=(A12.*D1.*(C3.*D1-C1.*D3)+A11.*D1.*(C1.*D2-C2.*D1)); 328 B1=(B22.*C1.*(C3.*D1-C1.*D3)+B21.*C1.*(C1.*D2-C2.*D1)); 329 B2=(B12.*C1.*(C1.*D3-C3.*D1)+B11.*C1.*(C2.*D1-C1.*D2)); 330 Lambda=(A1.*dXa+A2.*dYa+B1.*dXb+B2.*dYb)./(A1.*A1+A2.*A2+B1.*B1+B2.*B2); 331 332 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 333 %Projection for compatible displacements 334 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 335 Ua=dXa-Lambda.*A1; 336 Va=dYa-Lambda.*A2; 337 Ub=dXb-Lambda.*B1; 338 Vb=dYb-Lambda.*B2; 339 340 %%%%%%%%%%%%%%%%%%%%%%%%%%%% 341 %Calculations of displacements and error 342 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 343 U=(A22.*D2.*Ua-A12.*D2.*Va-B22.*C2.*Ub+B12.*C2.*Vb)./(C1.*D2-C2.*D1); 344 V=(A21.*D3.*Ua-A11.*D3.*Va-B21.*C3.*Ub+B11.*C3.*Vb)./(C3.*D1-C1.*D3); 345 W=(A22.*D1.*Ua-A12.*D1.*Va-B22.*C1.*Ub+B12.*C1.*Vb)./(C2.*D1-C1.*D2); 346 W1=(-A21.*D1.*Ua+A11.*D1.*Va+B21.*C1.*Ub-B11.*C1.*Vb)./(C1.*D3-C3.*D1); 347 348 error=sqrt((A1.*dXa+A2.*dYa+B1.*dXb+B2.*dYb).*(A1.*dXa+A2.*dYa+B1.*dXb+B2.*dYb)./(A1.*A1+A2.*A2+B1.*B1+B2.*B2)); 349 350 ind_error=(find(error<thresh_patch)); 351 U=U(ind_error); 352 V=V(ind_error); 353 W=W(ind_error);%correction for water interface 354 error=error(ind_error); 355 356 %create nc grid file 357 Result.ListGlobalAttribute={'nb_coord','nb_dim','constant_pixcm','absolut_time_T0','hart','dt','civ'}; 358 Result.nb_coord=3;%grid file, no velocity 359 Result.nb_dim=2; 360 Result.constant_pixcm=0;%no linear correspondance with images 361 Result.absolut_time_T0=time;%absolute time of the field 362 Result.hart=0; 363 Result.dt=dt;%time interval for image correlation (put by default) 364 % cte.title='grid'; 365 Result.civ=0;%not a civ file (no direct correspondance with an image) 366 % Result.ListDimName={'nb_vectors'} 367 % Result.DimValue=length(U); 368 Result.ListVarName={'vec_X','vec_Y','vec_U','vec_V','vec_W','vec_E'}; 369 Result.VarDimName={'nb_vectors','nb_vectors','nb_vectors','nb_vectors','nb_vectors','nb_vectors'} 370 Result.vec_X= grid_phys1(ind_error,1); 371 Result.vec_Y= grid_phys1(ind_error,2); 372 Result.vec_U=U/dt; 373 Result.vec_V=V/dt; 374 Result.vec_W=W/dt; 375 Result.vec_E=error; 376 % error=write_netcdf(file_st,cte,fieldlabels,grid_phys); 377 error=struct2nc(file_st,Result); 378 display([file_st ' written']) 379 380 function [S,D]=get_coeff(XmlData,X,Y); 381 Calib_a=XmlData{1}.GeometryCalib; 382 R=(Calib_a.R)';%rotation matrix 383 A(1,1)=R(1)-R(7)*X; 384 A(1,2)=R(2)-R(8)*X; 385 A(1,3)=R(3)-R(9)*X; 386 A(2,1)=R(4)-R(7)*Y; 387 A(2,2)=R(5)-R(8)*Y; 388 A(2,3)=R(6)-R(9)*Y; 389 390 %'pxcm_tsai': find differentials of the Tsai calibration 391 function [A11,A12,A13,A21,A22,A23]=pxcm_tsai(a,var_phys) 392 R=(a.R)'; 393 394 x=var_phys(:,1); 395 y=var_phys(:,2); 396 397 if isfield(a,'PlanePos') 398 prompt={'Plane 1 Index','Plane 2 Index'}; 399 Rep=inputdlg(prompt,'Target displacement test'); 400 Z1=str2double(Rep(1)); 401 Z2=str2double(Rep(2)); 402 z=(a.PlanePos(Z2,3)+a.PlanePos(Z1,3))/2 403 else 404 z=0; 405 end 406 407 %transform coeff for differentiels 408 a.C11=R(1)*R(8)-R(2)*R(7); 409 a.C12=R(2)*R(7)-R(1)*R(8); 410 a.C21=R(4)*R(8)-R(5)*R(7); 411 a.C22=R(5)*R(7)-R(4)*R(8); 412 a.C1x=R(3)*R(7)-R(9)*R(1); 413 a.C1y=R(3)*R(8)-R(9)*R(2); 414 a.C2x=R(6)*R(7)-R(9)*R(4); 415 a.C2y=R(6)*R(8)-R(9)*R(5); 416 417 % %dependence in x,y 418 % denom=(R(7)*x+R(8)*y+R(9)*z+a.Tz).*(R(7)*x+R(8)*y+R(9)*z+a.Tz); 419 % A11=(a.f*a.sx*(a.C11*y-a.C1x*z+R(1)*a.Tz-R(7)*a.Tx)./denom)/a.dpx; 420 % A12=(a.f*a.sx*(a.C12*x-a.C1y*z+R(2)*a.Tz-R(8)*a.Tx)./denom)/a.dpx; 421 % A21=(a.f*a.sx*(a.C21*y-a.C2x*z+R(4)*a.Tz-R(7)*a.Ty)./denom)/a.dpy; 422 % A22=(a.f*(a.C22*x-a.C2y*z+R(5)*a.Tz-R(8)*a.Ty)./denom)/a.dpy; 423 % A13=(a.f*(a.C1x*x+a.C1y*y+R(3)*a.Tz-R(9)*a.Tx)./denom)/a.dpx; 424 % A23=(a.f*(a.C2x*x+a.C2y*y+R(6)*a.Tz-R(9)*a.Ty)./denom)/a.dpy; 425 426 %dependence in x,y 427 denom=(R(7)*x+R(8)*y+R(9)*z+a.Tx_Ty_Tz(3)).*(R(7)*x+R(8)*y+R(9)*z+a.Tx_Ty_Tz(3)); 428 A11=(a.fx_fy(1)*(a.C11*y-a.C1x*z+R(1)*a.Tx_Ty_Tz(3)-R(7)*a.Tx_Ty_Tz(1))./denom); 429 A12=(a.fx_fy(1)*(a.C12*x-a.C1y*z+R(2)*a.Tx_Ty_Tz(3)-R(8)*a.Tx_Ty_Tz(1))./denom); 430 A21=(a.fx_fy(1)*(a.C21*y-a.C2x*z+R(4)*a.Tx_Ty_Tz(3)-R(7)*a.Tx_Ty_Tz(2))./denom); 431 A22=(a.fx_fy(2)*(a.C22*x-a.C2y*z+R(5)*a.Tx_Ty_Tz(3)-R(8)*a.Tx_Ty_Tz(2))./denom); 432 A13=(a.fx_fy(2)*(a.C1x*x+a.C1y*y+R(3)*a.Tx_Ty_Tz(3)-R(9)*a.Tx_Ty_Tz(1))./denom); 433 A23=(a.fx_fy(2)*(a.C2x*x+a.C2y*y+R(6)*a.Tx_Ty_Tz(3)-R(9)*a.Tx_Ty_Tz(2))./denom); 434 435 436 437 438 439 440 441 268 MergeData.Time=Time; 269 MergeData.Dt=Dt; 270 MergeData.ListVarName={'coord_x','coord_y','Z','U','V','W','Error'}; 271 MergeData.VarDimName={'coord_x','coord_y',{'coord_y','coord_x'},{'coord_y','coord_x'}... 272 {'coord_y','coord_x'},{'coord_y','coord_x'},{'coord_y','coord_x'}}; 273 MergeData.coord_x=xI; 274 MergeData.coord_y=yI; 275 MergeData.Z=ZI; 276 end 277 MergeData.U=U/Dt; 278 MergeData.V=V/Dt; 279 MergeData.W=W/Dt; 280 MergeData.Error=sqrt(sum(Error.*Error,3)); 281 errormsg=struct2nc(OutputFile,MergeData);%save result file 282 if isempty(errormsg) 283 disp(['output file ' OutputFile ' written']) 284 else 285 disp(errormsg) 286 end 287 end 288 289 290 function A=get_coeff(Calib,X,Y,x,y,z) 291 R=(Calib.R)';%rotation matrix 292 T_z=Calib.Tx_Ty_Tz(3); 293 T=R(7)*x+R(8)*y+R(9)*z+T_z; 294 A(:,:,1,1)=(R(1)-R(7)*X)./T; 295 A(:,:,1,2)=(R(2)-R(8)*X)./T; 296 A(:,:,1,3)=(R(3)-R(9)*X)./T; 297 A(:,:,2,1)=(R(4)-R(7)*Y)./T; 298 A(:,:,2,2)=(R(5)-R(8)*Y)./T; 299 A(:,:,2,3)=(R(6)-R(9)*Y)./T; 300 301 302 303 304 305 306
Note: See TracChangeset
for help on using the changeset viewer.