source: trunk/src/uvmat_doc/FUNCTIONS_DOC/phys.html @ 37

Last change on this file since 37 was 37, checked in by sommeria, 14 years ago

create_grid.fig ,
uvmat_doc and all the included files added

File size: 19.4 KB
Line 
1<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
2                "http://www.w3.org/TR/REC-html40/loose.dtd">
3<html>
4<head>
5  <title>Description of phys</title>
6  <meta name="keywords" content="phys">
7  <meta name="description" content="'phys': transforms image (px) to real world (phys) coordinates using geometric calibration parameters">
8  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
9  <meta name="generator" content="m2html &copy; 2003 Guillaume Flandin">
10  <meta name="robots" content="index, follow">
11  <link type="text/css" rel="stylesheet" href="../m2html.css">
12</head>
13<body>
14<a name="_top"></a>
15<div><a href="../index.html">Home</a> &gt;  <a href="index.html">.</a> &gt; phys.m</div>
16
17<!--<table width="100%"><tr><td align="left"><a href="../index.html"><img alt="<" border="0" src="../left.png">&nbsp;Master index</a></td>
18<td align="right"><a href="index.html">Index for .&nbsp;<img alt=">" border="0" src="../right.png"></a></td></tr></table>-->
19
20<h1>phys
21</h1>
22
23<h2><a name="_name"></a>PURPOSE <a href="#_top"><img alt="^" border="0" src="../up.png"></a></h2>
24<div class="box"><strong>'phys': transforms image (px) to real world (phys) coordinates using geometric calibration parameters</strong></div>
25
26<h2><a name="_synopsis"></a>SYNOPSIS <a href="#_top"><img alt="^" border="0" src="../up.png"></a></h2>
27<div class="box"><strong>function [DataOut,DataOut_1]=phys(varargin) </strong></div>
28
29<h2><a name="_description"></a>DESCRIPTION <a href="#_top"><img alt="^" border="0" src="../up.png"></a></h2>
30<div class="fragment"><pre class="comment">'phys': transforms image (px) to real world (phys) coordinates using geometric calibration parameters
31 OUTPUT:
32 DataOut:   structure of modified data (like UvData)
33
34INPUT:
35 Data:  structure of input data (like UvData)
36       with fields A (image or scalar matrix), AX, AY
37       X,Y,U,V, DjUi
38 Data.CoordType='phys' or 'px', The function ACTS ONLY IF .CoordType='px'
39 Calib: structure containing calibration parameters or a subtree Calib.GeometryCalib =calibration data (tsai parameters)</pre></div>
40
41<!-- crossreference -->
42<h2><a name="_cross"></a>CROSS-REFERENCE INFORMATION <a href="#_top"><img alt="^" border="0" src="../up.png"></a></h2>
43This function calls:
44<ul style="list-style-image:url(../matlabicon.gif)">
45<li><a href="phys_XYZ.html" class="code" title="function [Xphys,Yphys,Zphys]=phys_XYZ(Calib,X,Y,Z)">phys_XYZ</a>        'phys_XYZ':transforms image (px) to real world (phys) coordinates using geometric calibration parameters</li><li><a href="px_XYZ.html" class="code" title="function [X,Y]=px_XYZ(Calib,Xphys,Yphys,Zphys)">px_XYZ</a>   'px_XYZ': transform phys coordinates to image coordinates (px)</li></ul>
46This function is called by:
47<ul style="list-style-image:url(../matlabicon.gif)">
48</ul>
49<!-- crossreference -->
50
51<h2><a name="_subfunctions"></a>SUBFUNCTIONS <a href="#_top"><img alt="^" border="0" src="../up.png"></a></h2>
52<ul style="list-style-image:url(../matlabicon.gif)">
53<li><a href="#_sub1" class="code">function DataOut=phys_1(Data,Calib)</a></li><li><a href="#_sub2" class="code">function [A_out,Rangx,Rangy]=phys_Ima(A,CalibIn,ZIndex)</a></li></ul>
54<h2><a name="_source"></a>SOURCE CODE <a href="#_top"><img alt="^" border="0" src="../up.png"></a></h2>
55<div class="fragment"><pre>0001 <span class="comment">%'phys': transforms image (px) to real world (phys) coordinates using geometric calibration parameters</span>
560002 <span class="comment">% OUTPUT:</span>
570003 <span class="comment">% DataOut:   structure of modified data (like UvData)</span>
580004 <span class="comment">%</span>
590005 <span class="comment">%INPUT:</span>
600006 <span class="comment">% Data:  structure of input data (like UvData)</span>
610007 <span class="comment">%       with fields A (image or scalar matrix), AX, AY</span>
620008 <span class="comment">%       X,Y,U,V, DjUi</span>
630009 <span class="comment">% Data.CoordType='phys' or 'px', The function ACTS ONLY IF .CoordType='px'</span>
640010 <span class="comment">% Calib: structure containing calibration parameters or a subtree Calib.GeometryCalib =calibration data (tsai parameters)</span>
650011
660012 <a name="_sub0" href="#_subfunctions" class="code">function [DataOut,DataOut_1]=phys(varargin)</a>
670013 <span class="comment">% A FAIRE: 1- verifier si DataIn est une 'field structure'(.ListVarName'):</span>
680014 <span class="comment">% chercher ListVarAttribute, for each field (cell of variables):</span>
690015 <span class="comment">%   .CoordType: 'phys' or 'px'   (default==phys, no transform)</span>
700016 <span class="comment">%   .scale_factor: =dt (to transform displacement into velocity) default=1</span>
710017 <span class="comment">%   .covariance: 'scalar', 'coord', 'D_i': covariant (like velocity), 'D^i': contravariant (like gradient), 'D^jD_i' (like strain tensor)</span>
720018 <span class="comment">%   (default='coord' if .Role='coord_x,_y...,</span>
730019 <span class="comment">%            'D_i' if '.Role='vector_x,...',</span>
740020 <span class="comment">%              'scalar', else (thenno change except scale factor)</span>
750021 Calib{1}=[];
760022 <span class="keyword">if</span> nargin==2||nargin==4 <span class="comment">% nargin =nbre of input variables</span>
770023     Data=varargin{1};
780024     DataOut=Data;<span class="comment">%default</span>
790025     DataOut_1=[];<span class="comment">%default</span>
800026     CalibData=varargin{2};
810027     <span class="keyword">if</span> isfield(CalibData,<span class="string">'GeometryCalib'</span>)
820028         Calib{1}=CalibData.GeometryCalib;
830029     <span class="keyword">end</span>
840030     Calib{2}=Calib{1};
850031 <span class="keyword">else</span>
860032     DataOut.Txt=<span class="string">'wrong input: need two or four structures'</span>;
870033 <span class="keyword">end</span>
880034 test_1=0;
890035 <span class="keyword">if</span> nargin==4
900036     test_1=1;
910037     Data_1=varargin{3};
920038     DataOut_1=Data_1;<span class="comment">%default</span>
930039     CalibData_1=varargin{4};
940040     <span class="keyword">if</span> isfield(CalibData_1,<span class="string">'GeometryCalib'</span>)
950041         Calib{2}=CalibData_1.GeometryCalib;
960042     <span class="keyword">end</span>
970043 <span class="keyword">end</span>
980044 iscalar=0;
990045 <span class="keyword">if</span>  ~isempty(Calib{1})
1000046     DataOut=<a href="#_sub1" class="code" title="subfunction DataOut=phys_1(Data,Calib)">phys_1</a>(Data,Calib{1});
1010047     <span class="comment">%case of images or scalar</span>
1020048     <span class="keyword">if</span> isfield(Data,<span class="string">'A'</span>) &amp;&amp; isfield(Data,<span class="string">'AX'</span>) &amp;&amp; ~isempty(Data.AX) &amp;&amp; isfield(Data,<span class="string">'AY'</span>)&amp;&amp;<span class="keyword">...</span>
1030049                                            ~isempty(Data.AY) &amp;&amp; length(Data.A)&gt;1
1040050         iscalar=1;
1050051         A{1}=Data.A;
1060052     <span class="keyword">end</span>
1070053 <span class="keyword">end</span>
1080054 <span class="comment">%transform of X,Y coordinates for vector fields</span>
1090055 <span class="keyword">if</span> isfield(Data,<span class="string">'ZIndex'</span>)&amp;&amp;~isempty(Data.ZIndex)
1100056     ZIndex=Data.ZIndex;
1110057 <span class="keyword">else</span>
1120058     ZIndex=0;
1130059 <span class="keyword">end</span>
1140060 <span class="keyword">if</span> test_1
1150061     DataOut_1=<a href="#_sub1" class="code" title="subfunction DataOut=phys_1(Data,Calib)">phys_1</a>(Data_1,Calib{2});
1160062     <span class="keyword">if</span> isfield(Data_1,<span class="string">'A'</span>)&amp;&amp;isfield(Data_1,<span class="string">'AX'</span>)&amp;&amp;~isempty(Data_1.AX) &amp;&amp; isfield(Data_1,<span class="string">'AY'</span>)&amp;&amp;<span class="keyword">...</span>
1170063                                        ~isempty(Data_1.AY)&amp;&amp;length(Data_1.A)&gt;1
1180064           iscalar=iscalar+1;
1190065           Calib{iscalar}=Calib{2};
1200066           A{iscalar}=Data_1.A;
1210067           <span class="keyword">if</span> isfield(Data_1,<span class="string">'ZIndex'</span>) &amp;&amp; ~isequal(Data_1.ZIndex,ZIndex)
1220068               DataOut.Txt=<span class="string">'inconsistent plane indexes in the two input fields'</span>;
1230069           <span class="keyword">end</span>
1240070           <span class="keyword">if</span> iscalar==1<span class="comment">% case for which only the second field is a scalar</span>
1250071                [A,AX,AY]=<a href="#_sub2" class="code" title="subfunction [A_out,Rangx,Rangy]=phys_Ima(A,CalibIn,ZIndex)">phys_Ima</a>(A,Calib,ZIndex);
1260072                DataOut_1.A=A{1};
1270073                DataOut_1.AX=AX;
1280074                DataOut_1.AY=AY;
1290075                <span class="keyword">return</span>
1300076           <span class="keyword">end</span>
1310077     <span class="keyword">end</span>
1320078 <span class="keyword">end</span>
1330079 <span class="keyword">if</span> iscalar~=0
1340080     [A,AX,AY]=<a href="#_sub2" class="code" title="subfunction [A_out,Rangx,Rangy]=phys_Ima(A,CalibIn,ZIndex)">phys_Ima</a>(A,Calib,ZIndex);<span class="comment">%TODO : introduire interp2_uvmat ds phys_ima</span>
1350081     DataOut.A=A{1};
1360082     DataOut.AX=AX;
1370083     DataOut.AY=AY;
1380084     <span class="keyword">if</span> iscalar==2
1390085         DataOut_1.A=A{2};
1400086         DataOut_1.AX=AX;
1410087         DataOut_1.AY=AY;
1420088     <span class="keyword">end</span>
1430089 <span class="keyword">end</span>
1440090
1450091 <span class="comment">%------------------------------------------------</span>
1460092 <a name="_sub1" href="#_subfunctions" class="code">function DataOut=phys_1(Data,Calib)</a>
1470093 <span class="comment">% for icell=1:length(Data)</span>
1480094
1490095 DataOut=Data;<span class="comment">%default</span>
1500096 DataOut.CoordType=<span class="string">'phys'</span>; <span class="comment">%put flag for physical coordinates</span>
1510097 <span class="comment">% The transform ACTS ONLY IF .CoordType='px'and Calib defined</span>
1520098 <span class="keyword">if</span> isfield(Data,<span class="string">'CoordType'</span>)&amp;&amp; isequal(Data.CoordType,<span class="string">'px'</span>)&amp;&amp; ~isempty(Calib)
1530099     <span class="keyword">if</span> isfield(Calib,<span class="string">'CoordUnit'</span>)
1540100         DataOut.CoordUnit=Calib.CoordUnit;
1550101     <span class="keyword">else</span>
1560102         DataOut.CoordUnit=<span class="string">'cm'</span>; <span class="comment">%default</span>
1570103 <span class="comment">%     elseif isfield(DataOut,'CoordUnit')</span>
1580104 <span class="comment">%         DataOut=rmfield(DataOut,'CoordUnit');</span>
1590105     <span class="keyword">end</span>
1600106     DataOut.TimeUnit=<span class="string">'s'</span>;
1610107     <span class="comment">%transform of X,Y coordinates for vector fields</span>
1620108     <span class="keyword">if</span> isfield(Data,<span class="string">'ZIndex'</span>) &amp;&amp; ~isempty(Data.ZIndex)
1630109         Z=Data.ZIndex;
1640110     <span class="keyword">else</span>
1650111         Z=0;
1660112     <span class="keyword">end</span>
1670113     <span class="keyword">if</span> isfield(Data,<span class="string">'X'</span>) &amp;&amp;isfield(Data,<span class="string">'Y'</span>)&amp;&amp;~isempty(Data.X) &amp;&amp; ~isempty(Data.Y)
1680114         [DataOut.X,DataOut.Y,DataOut.Z]=<a href="phys_XYZ.html" class="code" title="function [Xphys,Yphys,Zphys]=phys_XYZ(Calib,X,Y,Z)">phys_XYZ</a>(Calib,Data.X,Data.Y,Z);
1690115         <span class="keyword">if</span> isfield(Data,<span class="string">'U'</span>)&amp;&amp;isfield(Data,<span class="string">'V'</span>)&amp;&amp;~isempty(Data.U) &amp;&amp; ~isempty(Data.V)&amp;&amp; isfield(Data,<span class="string">'dt'</span>)
1700116             <span class="keyword">if</span> ~isempty(Data.dt)
1710117             [XOut_1,YOut_1]=<a href="phys_XYZ.html" class="code" title="function [Xphys,Yphys,Zphys]=phys_XYZ(Calib,X,Y,Z)">phys_XYZ</a>(Calib,Data.X-Data.U/2,Data.Y-Data.V/2,Z);
1720118             [XOut_2,YOut_2]=<a href="phys_XYZ.html" class="code" title="function [Xphys,Yphys,Zphys]=phys_XYZ(Calib,X,Y,Z)">phys_XYZ</a>(Calib,Data.X+Data.U/2,Data.Y+Data.V/2,Z);
1730119             DataOut.U=(XOut_2-XOut_1)/Data.dt;
1740120             DataOut.V=(YOut_2-YOut_1)/Data.dt;
1750121             <span class="keyword">end</span>
1760122         <span class="keyword">end</span>
1770123     <span class="keyword">end</span>
1780124     <span class="comment">%transform of an image or scalar: done in phys_ima</span>
1790125       
1800126     <span class="comment">%transform of spatial derivatives</span>
1810127     <span class="keyword">if</span> isfield(Data,<span class="string">'X'</span>) &amp;&amp; ~isempty(Data.X) &amp;&amp; isfield(Data,<span class="string">'DjUi'</span>) &amp;&amp; ~isempty(Data.DjUi)<span class="keyword">...</span>
1820128           &amp;&amp; isfield(Data,<span class="string">'dt'</span>)   
1830129         <span class="keyword">if</span> ~isempty(Data.dt)
1840130             <span class="comment">% estimate the Jacobian matrix DXpx/DXphys</span>
1850131             <span class="keyword">for</span> ip=1:length(Data.X)
1860132                 [Xp1,Yp1]=<a href="phys_XYZ.html" class="code" title="function [Xphys,Yphys,Zphys]=phys_XYZ(Calib,X,Y,Z)">phys_XYZ</a>(Calib,Data.X(ip)+0.5,Data.Y(ip),Z);
1870133                 [Xm1,Ym1]=<a href="phys_XYZ.html" class="code" title="function [Xphys,Yphys,Zphys]=phys_XYZ(Calib,X,Y,Z)">phys_XYZ</a>(Calib,Data.X(ip)-0.5,Data.Y(ip),Z);
1880134                 [Xp2,Yp2]=<a href="phys_XYZ.html" class="code" title="function [Xphys,Yphys,Zphys]=phys_XYZ(Calib,X,Y,Z)">phys_XYZ</a>(Calib,Data.X(ip),Data.Y(ip)+0.5,Z);
1890135                 [Xm2,Ym2]=<a href="phys_XYZ.html" class="code" title="function [Xphys,Yphys,Zphys]=phys_XYZ(Calib,X,Y,Z)">phys_XYZ</a>(Calib,Data.X(ip),Data.Y(ip)-0.5,Z);
1900136             <span class="comment">%Jacobian matrix DXpphys/DXpx</span>
1910137                DjXi(1,1)=(Xp1-Xm1);
1920138                DjXi(2,1)=(Yp1-Ym1);
1930139                DjXi(1,2)=(Xp2-Xm2);
1940140                DjXi(2,2)=(Yp2-Ym2);
1950141                DjUi(:,:)=Data.DjUi(ip,:,:);
1960142                DjUi=(DjXi*DjUi')/DjXi;<span class="comment">% =J-1*M*J , curvature effects (derivatives of J) neglected</span>
1970143                DataOut.DjUi(ip,:,:)=DjUi';
1980144             <span class="keyword">end</span>
1990145             DataOut.DjUi =  DataOut.DjUi/Data.dt;   <span class="comment">%     min(Data.DjUi(:,1,1))=DUDX</span>
2000146         <span class="keyword">end</span>
2010147     <span class="keyword">end</span>
2020148 <span class="keyword">end</span>
2030149
2040150
2050151 <span class="comment">%%%%%%%%%%%%%%%%%%%%</span>
2060152 <a name="_sub2" href="#_subfunctions" class="code">function [A_out,Rangx,Rangy]=phys_Ima(A,CalibIn,ZIndex)</a>
2070153 xcorner=[];
2080154 ycorner=[];
2090155 npx=[];
2100156 npy=[];
2110157 <span class="keyword">for</span> icell=1:length(A)
2120158     siz=size(A{icell});
2130159     npx=[npx siz(2)];
2140160     npy=[npy siz(1)];
2150161     Calib=CalibIn{icell};
2160162     xima=[0.5 siz(2)-0.5 0.5 siz(2)-0.5];<span class="comment">%image coordiantes of corners</span>
2170163     yima=[0.5 0.5 siz(1)-0.5 siz(1)-0.5];
2180164     [xcorner_new,ycorner_new]=<a href="phys_XYZ.html" class="code" title="function [Xphys,Yphys,Zphys]=phys_XYZ(Calib,X,Y,Z)">phys_XYZ</a>(Calib,xima,yima,ZIndex);<span class="comment">%corresponding physical coordinates</span>
2190165     xcorner=[xcorner xcorner_new];
2200166     ycorner=[ycorner ycorner_new];
2210167 <span class="keyword">end</span>
2220168 Rangx(1)=min(xcorner);
2230169 Rangx(2)=max(xcorner);
2240170 Rangy(2)=min(ycorner);
2250171 Rangy(1)=max(ycorner);
2260172 test_multi=(max(npx)~=min(npx)) | (max(npy)~=min(npy));
2270173 npx=max(npx);
2280174 npy=max(npy);
2290175 x=linspace(Rangx(1),Rangx(2),npx);
2300176 y=linspace(Rangy(1),Rangy(2),npy);
2310177 [X,Y]=meshgrid(x,y);<span class="comment">%grid in physical coordiantes</span>
2320178 vec_B=[];
2330179 A_out={};
2340180 <span class="keyword">for</span> icell=1:length(A)
2350181     Calib=CalibIn{icell};
2360182     <span class="keyword">if</span> (isfield(Calib,<span class="string">'R'</span>) &amp;&amp; ~isequal(Calib.R(2,1),0) &amp;&amp; ~isequal(Calib.R(1,2),0)) ||<span class="keyword">...</span>
2370183         ((isfield(Calib,<span class="string">'kappa1'</span>)&amp;&amp; ~isequal(Calib.kappa1,0))) || test_multi || ~isequal(Calib,CalibIn{1})
2380184         zphys=0; <span class="comment">%default</span>
2390185         <span class="keyword">if</span> isfield(Calib,<span class="string">'SliceCoord'</span>) <span class="comment">%.Z= index of plane</span>
2400186            SliceCoord=Calib.SliceCoord(ZIndex,:);
2410187            zphys=SliceCoord(3); <span class="comment">%to generalize for non-parallel planes</span>
2420188         <span class="keyword">end</span>
2430189         [XIMA,YIMA]=<a href="px_XYZ.html" class="code" title="function [X,Y]=px_XYZ(Calib,Xphys,Yphys,Zphys)">px_XYZ</a>(CalibIn{icell},X,Y,zphys);<span class="comment">%corresponding image indices for each point in the real space grid</span>
2440190         XIMA=reshape(round(XIMA),1,npx*npy);<span class="comment">%indices reorganized in 'line'</span>
2450191         YIMA=reshape(round(YIMA),1,npx*npy);
2460192         flagin=XIMA&gt;=1 &amp; XIMA&lt;=npx &amp; YIMA &gt;=1 &amp; YIMA&lt;=npy;<span class="comment">%flagin=1 inside the original image</span>
2470193         <span class="keyword">if</span> numel(siz)==2 <span class="comment">%(B/W images)</span>
2480194             vec_A=reshape(A{icell},1,npx*npy);<span class="comment">%put the original image in line</span>
2490195             ind_in=find(flagin);
2500196             ind_out=find(~flagin);
2510197             ICOMB=((XIMA-1)*npy+(npy+1-YIMA));
2520198             ICOMB=ICOMB(flagin);<span class="comment">%index corresponding to XIMA and YIMA in the aligned original image vec_A</span>
2530199             vec_B(ind_in)=vec_A(ICOMB);
2540200             vec_B(ind_out)=zeros(size(ind_out));
2550201             A_out{icell}=reshape(vec_B,npy,npx);<span class="comment">%new image in real coordinates</span>
2560202         <span class="keyword">elseif</span> numel(siz)==3     
2570203             <span class="keyword">for</span> icolor=1:siz(3)
2580204                 vec_A=reshape(A{icell}(:,:,icolor),1,npx*npy);<span class="comment">%put the original image in line</span>
2590205                 ind_in=find(flagin);
2600206                 ind_out=find(~flagin);
2610207                 ICOMB=((XIMA-1)*npy+(npy+1-YIMA));
2620208                 ICOMB=ICOMB(flagin);<span class="comment">%index corresponding to XIMA and YIMA in the aligned original image vec_A</span>
2630209                 vec_B(ind_in)=vec_A(ICOMB);
2640210                 vec_B(ind_out)=zeros(size(ind_out));
2650211                 A_out{icell}(:,:,icolor)=reshape(vec_B,npy,npx);<span class="comment">%new image in real coordinates</span>
2660212             <span class="keyword">end</span>
2670213         <span class="keyword">end</span>
2680214     <span class="keyword">else</span><span class="comment">%</span>
2690215         
2700216         A_out{icell}=A{icell};<span class="comment">%no transform</span>
2710217         Rangx=[0.5 npx-0.5];<span class="comment">%image coordiantes of corners</span>
2720218         Rangy=[npy-0.5 0.5];
2730219         [Rangx]=<a href="phys_XYZ.html" class="code" title="function [Xphys,Yphys,Zphys]=phys_XYZ(Calib,X,Y,Z)">phys_XYZ</a>(Calib,Rangx,[0.5 0.5],[ZIndex ZIndex]);<span class="comment">%case of translations without rotation and quadratic deformation</span>
2740220         [xx,Rangy]=<a href="phys_XYZ.html" class="code" title="function [Xphys,Yphys,Zphys]=phys_XYZ(Calib,X,Y,Z)">phys_XYZ</a>(Calib,[0.5 0.5],Rangy,[ZIndex ZIndex]);
2750221     <span class="keyword">end</span>
2760222 <span class="keyword">end</span></pre></div>
277<hr><address>Generated on Fri 13-Nov-2009 11:17:03 by <strong><a href="http://www.artefact.tk/software/matlab/m2html/">m2html</a></strong> &copy; 2003</address>
278</body>
279</html>
Note: See TracBrowser for help on using the repository browser.