source: trunk/src/set_grid.m @ 609

Last change on this file since 609 was 591, checked in by sommeria, 12 years ago

various updates, in particular modification of series to do calculations in the cluster

File size: 14.2 KB
RevLine 
[2]1%'set_grid':produce grid for PIV with one or two images (stereo case)
2%------------------------------------------------------------------------
3% function varargout = set_grid(varargin)
4% associated with the GUI set_grid.fig
5%
6%AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
7%  Copyright Joel Sommeria, 2008, LEGI / CNRS-UJF-INPG, sommeria@coriolis-legi.org.
8%AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
9%     This file is part of the toolbox UVMAT.
10%
11%     UVMAT is free software; you can redistribute it and/or modify
12%     it under the terms of the GNU General Public License as published by
13%     the Free Software Foundation; either version 2 of the License, or
14%     (at your option) any later version.
15%
16%     UVMAT is distributed in the hope that it will be useful,
17%     but WITHOUT ANY WARRANTY; without even the implied warranty of
18%     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19%     GNU General Public License (file UVMAT/COPYING.txt) for more details.
20%AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
21
22function varargout = set_grid(varargin)
23
[576]24% Last Modified by GUIDE v2.5 01-Mar-2013 22:41:43
[2]25
[84]26% Begin initialization code - DO NOT PLOT
[2]27gui_Singleton = 1;
28gui_State = struct('gui_Name',       mfilename, ...
29                   'gui_Singleton',  gui_Singleton, ...
30                   'gui_OpeningFcn', @set_grid_OpeningFcn, ...
31                   'gui_OutputFcn',  @set_grid_OutputFcn, ...
32                   'gui_LayoutFcn',  [] , ...
33                   'gui_Callback',   []);
[576]34               
[315]35if nargin && ischar(varargin{1})
[2]36    gui_State.gui_Callback = str2func(varargin{1});
37end
38if nargout
39    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
40else
41    gui_mainfcn(gui_State, varargin{:});
42end
43
44%-------------------------------------------------------------------
45% --- Executes just before set_grid is made visible.
46%INPUT:
47% handles: handles of the set_grid interface elements
48%'IndexObj': index of the object (on the UvData list) that set_grid will modify
49%        if =[] or absent: index still undefined (create mode in uvmat)
50%        if=0; no associated object (used for series), the button 'PLOT' is  then unvisible
51%'data': read from an existing object selected in the interface
52%      .TITLE : class of object ('POINTS','LINE',....)
[576]53%      .num_DX,num_DY,DZ; meshes for regular grids
[2]54%      .Coord: object position coordinates
55%      .ParentButton: handle of the uicontrol object calling the interface
56% PlotHandles: set of handles of the elements contolling the plotting of the projected field:
57%  if =[] or absent, no plot (mask mode in uvmat)
58% parameters on the uvmat interface (obtained by 'get_plot_handle.m')
[576]59function set_grid_OpeningFcn(hObject, eventdata, handles,InputFile,InputField)
[2]60
61% Choose default command line output for set_grid
62handles.output = hObject;
63
64% Update handles structure
65guidata(hObject, handles);
66
[576]67%default
[2]68set(hObject,'DeleteFcn',@closefcn)
[576]69set(hObject,'WindowButtonDownFcn',{'mouse_down'})%set mouse click action function
70set(handles.CoordType,'ListboxTop',1)
71set(handles.CoordType,'Value',1);
72set(handles.CoordType,'String',{'phys';'px'});
73if exist('InputFile','var')
74   set(handles.ImageA,'String',InputFile)
[2]75end
[576]76
77%% use InputField input from uvmat
78check_pixel=0;
79if exist('InputField','var')
80    if strcmp(InputField.CoordUnit,'pixel')
81        set(handles.CoordType,'Value',2)
82        set(handles.TxtWarning,'Visible','on')
83        Mesh=20;%default mesh in pixel
84        check_pixel=1;
85    else
86        set(handles.CoordType,'Value',1)
87        InputField.CoordMesh=20*InputField.CoordMesh; % about 20 pixels
88        % adjust the mesh to a value 1, 2 , 5 *10^n
89        ord=10^(floor(log10(InputField.CoordMesh)));%order of magnitude
90        if InputField.CoordMesh/ord>=5
91            Mesh=5*ord;
92        elseif InputField.CoordMesh/ord>=2
93            Mesh=2*ord;
94        else
95            Mesh=ord;
96        end
[84]97    end
[576]98    Input.DX=Mesh;
99    Input.DY=Mesh;
100    Input.XMin=(Mesh/2)*ceil(InputField.XMin/(Mesh/2))-0.5*check_pixel;
101    Input.XMax=Input.XMin+Mesh*floor((InputField.XMax-Input.XMin)/Mesh)-0.5*check_pixel;
102    Input.YMin=(Mesh/2)*ceil(InputField.YMin/(Mesh/2))-0.5*check_pixel;
103    Input.YMax=Input.YMin+Mesh*floor((InputField.YMax-Input.YMin)/Mesh)-0.5*check_pixel;
[591]104    errormsg=fill_GUI(Input,handles.set_grid);
[84]105end
[2]106
107% --- Outputs from this function are returned to the command line.
108function varargout = set_grid_OutputFcn(hObject, eventdata, handles)
109% Get default command line output from handles structure
110varargout{1} = handles.output;
111varargout{2}=handles;
112
113%----------------------------------------------------
114% executed when closing: set the parent interface button to value 0
115function closefcn(gcbo,eventdata)
116huvmat=findobj(allchild(0),'Name','uvmat');%find the current uvmat interface handle
117parent_button=findobj(huvmat,'Tag','grid');
118if ~isempty(parent_button)
119    set(parent_button,'Value',0)%put unactivated buttons to green
120    tag=get(parent_button,'Tag');
121    if isequal(tag,'edit')
122        set(parent_button,'BackgroundColor',[0.7 0.7 0.7]);
[576]123    else
[2]124        set(parent_button,'BackgroundColor',[0 1 0]);
125    end
126end
127
128%-----------------------------------------------------------------------
[84]129% --- Executes on button press in plot: PLOT the defined object and its projected field
130function plot_Callback(hObject, eventdata, handles)
[576]131[grid_pix_A,grid_pix_B,grid_phys]=get_grid(read_GUI(handles.set_grid));
132huvmat=findobj(allchild(0),'tag','uvmat');
[84]133hhuvmat=guidata(huvmat);
[576]134axes(hhuvmat.PlotAxes);
[84]135hold on
[576]136UvData=get(huvmat,'UserData');
137if isfield(UvData.Field, 'CoordUnit')&& strcmp(UvData.Field.CoordUnit,'pixel')
138    plot(grid_pix_A(:,1),grid_pix_A(:,2),'.')
139else
140    plot(grid_phys(:,1),grid_phys(:,2),'.')
141end
[2]142
[576]143%% display grid in second image defiend
144if ~isempty(grid_pix_B)
145    hviewfield=view_field(get(handles.imageB,'String'));
146    hhviewfield=guidata(hviewfield);
147    axes(hhviewfield.PlotAxes);
148    hold on
149    if isfield(UvData.Field, 'CoordUnit')&& strcmp(UvData.Field.CoordUnit,'pixel')
150        plot(grid_pix_B(:,1),grid_pix_B(:,2),'.')
151    else
152        plot(grid_phys(:,1),grid_phys(:,2),'.')
153    end
154end
[2]155
[576]156%------------------------------------------------------------------------
157% --- Executes on button press in CoordType.
158function CoordType_Callback(hObject, eventdata, handles)
159%------------------------------------------------------------------------
160set(handles.num_XMin,'String','')
161set(handles.num_XMax,'String','')
162set(handles.num_DX,'String','')
163set(handles.num_YMin,'String','')
164set(handles.num_YMax,'String','')
165set(handles.num_DY,'String','')
166set(handles.num_Z,'String','')
167if isequal(get(handles.CoordType,'Value'),2)
168    set(handles.TxtWarning,'visible','on')
169else
170    set(handles.TxtWarning,'visible','on')
171end
[84]172
[2]173%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
174% --- Executes on button press in delete.
175function delete_Callback(hObject, eventdata, handles)
176
177%SetData=get(gcbf,'UserData');%get the interface data
178%IndexObj=SetData.IndexObj;
179huvmat=findobj('Name','uvmat');%find the current uvmat interface handle
180UvData=get(huvmat,'UserData');%Data associated to the current uvmat interface
181if isfield(UvData,'CurrentObjectIndex')
182    IndexObj=UvData.CurrentObjectIndex;
183else
184    IndexObj=[];
185end
186delete_object(IndexObj);
187
188
189% ------------------------------------------------------
[576]190function Save_Callback(hObject, eventdata, handles)
[2]191% ------------------------------------------------------
[576]192[grid_pix_A,grid_pix_B]=get_grid(read_GUI(handles.set_grid));
[84]193
[576]194
[84]195 %ECRIRE FICHIERS
196nbpointsA=size(grid_pix_A);
[576]197XA=grid_pix_A(:,1);%index=position+0.5 rounded at the nearest integer value
[84]198YA=grid_pix_A(:,2);
199unitcolumn=32*ones(size(XA));
200Xchar=num2str(XA);
201blanc=char(unitcolumn);
202Ychar=num2str(YA);
203tete=['1 ' num2str(nbpointsA(1))];
204txt=[Xchar blanc Ychar];
205textgrid={tete;txt};
206textout=char(textgrid);
[576]207imageA=get(handles.ImageA,'String');
[342]208RootPath=fileparts_uvmat(imageA);
209Answer = msgbox_uvmat('INPUT_TXT','grid file name (*.grid)',fullfile(RootPath,'gridA.grid'));
[84]210dlmwrite(Answer,textout,'');
211msgbox_uvmat('CONFIRMATION',[Answer ' written as ASCII text file']);
212if ~isempty(grid_pix_B)
213    nbpointsB=size(grid_pix_B);
[576]214    XB=round(grid_pix_B(:,1)+0.5);%index=position+0.5 rounded at the nearest integer value
215    YB=round(grid_pix_B(:,2)+0.5);
[84]216    unitcolumn=32*ones(size(XB));
217    Xchar=num2str(XB);
218    blanc=char(unitcolumn);
219    Ychar=num2str(YB);
220    tete=['1 ' num2str(nbpointsB(1))];
221    txt=[Xchar blanc Ychar];
222    textgrid={tete;txt};
223    textout=char(textgrid);
[342]224    Answer = msgbox_uvmat('INPUT_TXT','grid file name (*.grid)',fullfile(RootPath,'gridB.grid'));
[84]225    dlmwrite(Answer,textout,'');
226    msgbox_uvmat('CONFIRMATION',[Answer ' written as ASCII text file']);
227end
228
[576]229
230%------------------------------------------------------------------------
231function [grid_pix_A,grid_pix_B,grid_phys]=get_grid(GUI)
232%------------------------------------------------------------------------
[84]233grid_pix_B=[];%default
[576]234array_x=GUI.XMin:GUI.DX:GUI.XMax;% array of x values
235array_y=GUI.YMin:GUI.DY:GUI.YMax;% array of y values
236[grid_x,grid_y]=meshgrid(array_x,array_y);% matrices of x and y values
237grid_x=reshape(grid_x,[],1); %matrix of x  values reshaped in line
238grid_y=reshape(grid_y,[],1);%matrix of y values reshaped in line
239% grid_z=zeros(nx_patch*ny_patch,1);% plane coordinates (TODO: 3D grids)
[2]240
[576]241%% check the input image A
242if ~exist(GUI.ImageA,'file')
[2]243    msgbox_uvmat('ERROR',['input image file' imageA 'does not exist'])
244    return
245end
[576]246[FileType,tild,VideoObject]=get_file_type(GUI.ImageA);
247switch FileType
248    case {'image','multimage','video','mmreader'}% case of input image or movie OK
249    otherwise
250        msgbox_uvmat('ERROR',['error: ' GUI.ImageA ' is not an image type recognized by Matlab '])
251        return
[2]252end
[576]253[RootPath,SubDir,RootFile,tild,tild,tild,tild,FileExt]=fileparts_uvmat(GUI.ImageA);
254
255%% transform to pixels if the grid is defined in phys coordinates
256grid_x_imaA=grid_x;%default grid in image A coordinates
257grid_y_imaA=grid_y;
258% MenuCoord=get(handles.CoordType,'String');% type of coordinates for grid definition, phys or pixel
259if strcmp(GUI.CoordType,'phys')
260    fileAxml=fullfile(RootPath,[SubDir '.xml']);% new convention for xml name
261    if ~exist(fileAxml,'file')
262        fileAxml=[fullfile(RootPath,RootFile) '.xml'];% old convention for xml name
263    end
264    tsaiA=[];%default
265    if exist(fileAxml,'file')
266        [XmlDataA,errormsg]=imadoc2struct(fileAxml);
267        if ~isempty(errormsg)
268            msgbox_uvmat('ERROR',['error in ' fileAxml ': ' errormsg])
269            return
270        end
271        if isfield(XmlDataA,'GeometryCalib')
272            tsaiA=XmlDataA.GeometryCalib;
273        end
274    end
275    if isempty(tsaiA)
276        msgbox_uvmat('WARNING','no geometric calibration available for image A, phys =pixel')
277    else
278        [grid_x_imaA,grid_y_imaA]=px_XYZ(tsaiA,grid_x,grid_y,GUI.Z);
279    end
[2]280end
281
[576]282%% detect the grid points which are inside image A
283A=read_image(GUI.ImageA,FileType,VideoObject,1);
284npxA=size(A,2);
285npyA=size(A,1);
286flag=grid_x_imaA>=1 & grid_x_imaA<=npxA & grid_y_imaA>=1 & grid_y_imaA<=npyA;% ='true' inside the image
[2]287
[576]288%% detect the grid points which are inside image B if relevant (use for stereo PIV)
289if isfield(GUI,'ImageB')
290    if ~exist(imageB,'file')
291        msgbox_uvmat('ERROR',['input image file' GUI.ImageB 'does not exist'])
[2]292        return
293    end
[576]294    [RootPathB,SubDirB,RootFileB,tild,tild,tild,tild,FileExt]=fileparts_uvmat(GUI.ImageB);
295    fileBxml=fullfile(RootPathB,[SubDirB '.xml']);% new convention for xml name
296    if ~exist(fileBxml,'file')
297        fileBxml=[fullfile(RootPathB,RootFileB) '.xml'];% old convention for xml name
[2]298    end
[576]299    tsaiB=[];%default
300    if exist(fileBxml,'file')
301        [XmlDataB,errormsg]=imadoc2struct(fileBxml);
302        if ~isempty(errormsg)
303            msgbox_uvmat('ERROR',['error in ' fileAxml ': ' errormsg])
304            return
305        end
306        if isfield(XmlDataB,'GeometryCalib')
307            tsaiB=XmlDataB.GeometryCalib;
308        end
309    end
310    if isempty(tsaiB)
311        msgbox_uvmat('WARNING','no geometric calibration available for image B, phys =pixel')
312        grid_x_imaB=grid_x;
313        grid_y_imaB=grid_y;
[2]314    else
[576]315        [grid_x_imaB,grid_y_imaB]=px_XYZ(tsaiB,grid_x,grid_y,GUI.Z);
[342]316    end
[576]317    B=imread(GUI.ImageB);
318    npxB=size(B,2);
319    npyB=size(B,1);
320    flagB=grid_x_imaB>=1 & grid_x_imaB<=npxB & grid_y_imaB>=1 & grid_y_imaB<=npyB;
321    flag=flagA & flagB;
322    grid_pix_B(:,1)=round(grid_x_imaB(flag));
323    grid_pix_B(:,2)=round(grid_y_imaB(flag));
[2]324end
325
[576]326grid_x_imaA=grid_x_imaA(flag);
327grid_y_imaA=grid_y_imaA(flag);
328grid_pix_A=[grid_x_imaA grid_y_imaA];
329grid_x=grid_x(flag);
330grid_y=grid_y(flag);
331grid_phys=[grid_x grid_y];
332
333
334function GetImageB_Callback(hObject, eventdata, handles)
335if isequal(get(handles.GetImageB,'Value'),1)
336    set(handles.ImageB,'Visible','on')
337    [FileName, PathName, filterindex] = uigetfile( ...
338            {'*.*', 'All Files (*.*)'}, ...
339            'Pick the second image file',fileparts(fileparts(get(handles.ImageA,'String'))));
340        ImageB=fullfile(PathName,FileName);
341        [FileType,tild,VideoObject]=get_file_type(ImageB);
342    switch FileType
343        case {'image','multimage','video','mmreader'}% case of input image or movie OK
344            set(handles.ImageB,'String',ImageB)
345        otherwise
346            msgbox_uvmat('ERROR',['error: ' imageB ' is not an image type recognized by Matlab '])
347            return
348    end
[73]349else
[576]350    set(handles.ImageB,'Visible','off')
[73]351end
[2]352
353
[84]354%------------------------------------------------------------------------
[2]355% --- Executes on button press in HELP.
356function HELP_Callback(hObject, eventdata, handles)
[84]357%------------------------------------------------------------------------
[2]358path_to_uvmat=which ('uvmat');% check the path of uvmat
359pathelp=fileparts(path_to_uvmat);
[84]360helpfile=fullfile(pathelp,'uvmat_doc','uvmat_doc.html');
[2]361if isempty(dir(helpfile)), errordlg('Please put the help file uvmat_doc.html in the directory UVMAT/UVMAT_DOC')
362else
363web([helpfile '#set_grid'])   
364end
365
[84]366
367
[576]368function ImageA_Callback(hObject, eventdata, handles)
369% hObject    handle to ImageA (see GCBO)
370% eventdata  reserved - to be defined in a future version of MATLAB
371% handles    structure with handles and user data (see GUIDATA)
372
373% Hints: get(hObject,'String') returns contents of ImageA as text
374%        str2double(get(hObject,'String')) returns contents of ImageA as a double
Note: See TracBrowser for help on using the repository browser.