/normxcorr/trunk

To get this branch, use:
bzr branch http://suren.me/webbzr/normxcorr/trunk
1 by Suren A. Chilingaryan
Initial import
1
function [validx,validy]=automate_image(grid_x,grid_y,filenamelist,validx,validy);
2
3
% Code to start actual image correlation
4
% Programmed by Chris and Rob
5
% Last revision: 09/10/08
6
7
% The automation function is the central function and processes all markers and 
8
% images by the use of the matlab function cpcorr.m. 
9
% Therefore the Current directory in matlab has to be the folder where 
10
%  automate_image.m finds the filenamelist.mat, grid_x.dat and grid_y.dat as well 
11
% as the images specified in filenamelist.mat. Just type automate_image; and 
12
% press ENTER at the command line of matlab. 
13
% At first, automate_image.m will open the first image in the filenamelist.mat and 
14
% plot the grid as green crosses on top. The next step will need some time since 
15
% all markers in that image have to be processed for the first image. After correlating 
16
% image one and two the new raster positions will be plotted as red crosses. On top 
17
% of the image and the green crosses. The next dialog will ask you if you want to 
18
% continue with this correlation or cancel. If you press continue, automate_image.m 
19
% will process all images in the filenamelist.mat. The time it will take to process 
20
% all images will be plotted on the figure but can easily be estimated by knowing the 
21
% raster point processing speed (see processing speed). 
22
% Depending on the number of images and markers you are tracking, this process 
23
% can take between seconds and days. For 100 images and 200 markers a decent 
24
% computer should need 200 seconds. To get a better resolution you can always 
25
% run jobs overnight (e.g. 6000 markers in 1000 images) with higher resolutions. 
26
% Keep in mind that CORRSIZE which you changed in cpcorr.m will limit your 
27
% resolution. If you chose to use the 15 pixel as suggested a marker distance of 
28
% 30 pixel will lead to a full cover of the strain field. Choosing smaller marker 
29
% distances will lead to an interpolation since two neighboring markers share 
30
% pixels. Nevertheless a higher marker density can reduce the noise of the strain field.
31
% When all images are processed, automate_image will write the files validx.mat, 
32
% validy.mat, validx.txt and validy.txt. The text files are meant to store the result in a 
33
% format which can be accessed by other programs also in the future.
34
2 by Suren A. Chilingaryan
Support for different optimization modes
35
% Changed by Suren A. Chilingaryan <csa@dside.dyndns.org> to optimize performance
36
% by tighter integration with Matlab images toolkit (few sources from the toolkit
37
% are moved to the current source tree and adjusted to benefit from knowledge of 
38
% tasks we are solving here. As well CUDA framework, if available, is used to
39
% speed-up core computations using parallel processors of latest NVidia video
40
% cards.
41
% OPTIMIZE parameter is controlling which optimizations should be used. 
42
%  0 - The original version, no optimizations
43
%  1 - The modified sources from images toolkit are used
44
%  2 - The CUDA matlab plugin is used to compute FFT's
45
%  3 - Most of computations are performed on NVidia card
16 by Suren A. Chilingaryan
Optimize FFT size
46
%  4 - Optimize FFT sizes for better performance (affects precision)
24 by Suren A. Chilingaryan
Optimization mode 5 for matlab: image loading in C code
47
%  5 - Load images in C code
2 by Suren A. Chilingaryan
Support for different optimization modes
48
% You can safely set an optimization level to 3. If NVidia card is not available
49
% the level will be automatically reduced to 1.
6 by Suren A. Chilingaryan
A little more computations are moved to CUDA
50
%
51
% SAVEDATA controls if data is saved per iteration or at the end
52
% 0 - in the end
53
% 1 - per iteration
2 by Suren A. Chilingaryan
Support for different optimization modes
54
24 by Suren A. Chilingaryan
Optimization mode 5 for matlab: image loading in C code
55
OPTIMIZE = 5;
2 by Suren A. Chilingaryan
Support for different optimization modes
56
CORRSIZE = 15;	
1 by Suren A. Chilingaryan
Initial import
57
PRECISION = 1000;
4 by Suren A. Chilingaryan
Instead of transfer compute local sums and denormals on board
58
SILENT = 1;
6 by Suren A. Chilingaryan
A little more computations are moved to CUDA
59
SAVEDATA = 0;
2 by Suren A. Chilingaryan
Support for different optimization modes
60
1 by Suren A. Chilingaryan
Initial import
61
% exist('grid_x')
62
% exist('grid_y')
63
% exist('filenamelist')
64
% exist('validx')
65
% exist('validy')
66
67
if exist('data', 'dir')
68
    datadir = 'data/';
69
else
70
    datadir = '';
71
end
72
73
if exist('images', 'dir')
74
    imagedir = 'images/';
75
else
76
    imagedir = '';
77
end
78
79
% Load necessary files
80
if exist('grid_x')==0
81
    load([datadir, 'grid_x.dat'])              % file with x position, created by grid_generator.m
82
end
83
if exist('grid_y')==0
84
    load([datadir, 'grid_y.dat'])              % file with y position, created by grid_generator.m
85
end
86
if exist('filenamelist')==0
87
    load([datadir, 'filenamelist'])            % file with the list of filenames to be processed
88
end
89
90
91
resume=0;
92
if exist('validx')==1
93
    if exist('validy')==1
94
        resume=1;
95
        [Rasternum Imagenum]=size(validx);
96
    end
97
end
98
99
[r,c]=size(filenamelist);           % this will determine the number of images we have to loop through
100
101
% Open new figure so previous ones (if open) are not overwritten
102
if (~SILENT)
24 by Suren A. Chilingaryan
Optimization mode 5 for matlab: image loading in C code
103
    if OPTIMIZE > 4
104
	OPTIMIZE = 4
105
    end
106
    
1 by Suren A. Chilingaryan
Initial import
107
    h=figure;
108
    imshow([imagedir, filenamelist(1,:)])           % show the first image
109
    title('Initial Grid For Image Correlation (Note green crosses)')        % put a title
110
    hold on
111
    plot(grid_x,grid_y,'g+')            % plot the grid onto the image
112
    hold off
113
114
    % Start image correlation using cpcorr.m
115
    g = waitbar(0,sprintf('Processing images'));        % initialize the waitbar
116
    set(g,'Position',[275,50,275,50])                   % set the position of the waitbar [left bottom width height]
117
end
118
119
firstimage=1;
120
121
if resume==1
122
    firstimage=Imagenum+1
123
end
124
125
%Initializing hardware code
126
8 by Suren A. Chilingaryan
Complete elimination of cpcorr
127
ncp = prod(size(grid_x));
1 by Suren A. Chilingaryan
Initial import
128
2 by Suren A. Chilingaryan
Support for different optimization modes
129
if OPTIMIZE > 2
130
    hwid = normxcorr_hw();
4 by Suren A. Chilingaryan
Instead of transfer compute local sums and denormals on board
131
2 by Suren A. Chilingaryan
Support for different optimization modes
132
    if hwid > 0
16 by Suren A. Chilingaryan
Optimize FFT size
133
	err = normxcorr_hw(hwid, 1, ncp, CORRSIZE, PRECISION, OPTIMIZE);
3 by Suren A. Chilingaryan
Add error checking to initialization process
134
	if (err ~= 0)
135
	    normxcorr_hw(1);
136
	    OPTIMIZE = 2;
137
	end
2 by Suren A. Chilingaryan
Support for different optimization modes
138
    else
139
	if hwid < 0
140
	    OPTIMIZE = 1;
141
	else
142
	    OPTIMIZE = 2;
143
	end
144
    end
145
else
146
    hwid = 0;
147
end
1 by Suren A. Chilingaryan
Initial import
148
8 by Suren A. Chilingaryan
Complete elimination of cpcorr
149
% Initialize variables
150
if OPTIMIZE>2
151
    base_points_x=single(grid_x);
152
    base_points_y=single(grid_y);
153
else
154
    base_points_x=grid_x;
155
    base_points_y=grid_y;
156
end
157
158
if resume==1
159
    if OPTIMIZE>2
160
	input_points_x=single(validx(:,Imagenum));
161
	input_points_y=single(validy(:,Imagenum));
162
    else
163
	input_points_x=validx(:,Imagenum);
164
	input_points_y=validy(:,Imagenum);
165
    end
166
    inputpoints=1;
167
else
168
    if OPTIMIZE>2
169
	input_points_x=single(grid_x);
170
	input_points_y=single(grid_y);
171
    else
172
	input_points_x=grid_x;
173
	input_points_y=grid_y;
174
    end
175
end
176
177
178
if OPTIMIZE > 2
179
%    Verification of GPU local sum and denom computations
180
%    dic_basecorr3(CORRSIZE, PRECISION, OPTIMIZE, hwid, base_points_x, base_points_y, base);
181
182
    normxcorr_hw(hwid, 3, base_points_x, base_points_y);
24 by Suren A. Chilingaryan
Optimization mode 5 for matlab: image loading in C code
183
    if OPTIMIZE > 4
184
	normxcorr_hw(hwid, 4, strcat(imagedir, filenamelist(1,:)));
185
    else
186
	base = uint8(mean(double(imread([imagedir, filenamelist(1,:)])),3));            % read in the base image ( which is always  image number one. You might want to change that to improve correlation results in case the light conditions are changing during the experiment
187
	normxcorr_hw(hwid, 4, base);
188
    end	
8 by Suren A. Chilingaryan
Complete elimination of cpcorr
189
else
24 by Suren A. Chilingaryan
Optimization mode 5 for matlab: image loading in C code
190
  base = uint8(mean(double(imread([imagedir, filenamelist(1,:)])),3));            % read in the base image ( which is always  image number one. You might want to change that to improve correlation results in case the light conditions are changing during the experiment
8 by Suren A. Chilingaryan
Complete elimination of cpcorr
191
  base_points_for(:,1)=reshape(base_points_x,[],1);
192
  base_points_for(:,2)=reshape(base_points_y,[],1);
193
194
  %some checks (moved here from cpcorr)
195
  if any(base_points_for(:)<0.5) || any(base_points_for(:,1)>size(base,2)+0.5) || any(base_points_for(:,2)>size(base,1)+0.5)
196
    msg = sprintf('In function %s, Control Points must be in pixel coordinates.',mfilename);
197
    eid = sprintf('Images:%s:cpPointsMustBeInPixCoord',mfilename);
198
    error(eid, msg);
199
  end
200
201
  if OPTIMIZE > 0
202
     data_base = struct;
1 by Suren A. Chilingaryan
Initial import
203
    
8 by Suren A. Chilingaryan
Complete elimination of cpcorr
204
     %moved from normxcorr2
205
     % We can precalculate it here, since near-edge images are dropped and, therefore, A,T always have the same size 
206
     % n is width and height of T, but following computations are done for A
207
     % outsize is sum if widths and heights of T and A - 1 (outsize = size(A) + size(T) - 1)
208
209
     outsize = 6 * CORRSIZE + 1;
210
     n = 2*CORRSIZE + 1;
211
     mn = n*n;
212
213
     rects_base = dic_calc_rects(base_points_for,2*CORRSIZE,base);
214
215
     for icp = 1:ncp
216
	if isequal(rects_base(icp,3:4),[0 0])
217
	    %near edge
218
	    data_base(icp).skip = 1;
219
	    continue
4 by Suren A. Chilingaryan
Instead of transfer compute local sums and denormals on board
220
	end
8 by Suren A. Chilingaryan
Complete elimination of cpcorr
221
222
	sub_base = imcrop(base,rects_base(icp,:));
223
    
224
	data_base(icp).skip = 0;
225
4 by Suren A. Chilingaryan
Instead of transfer compute local sums and denormals on board
226
	double_sub_base = double(sub_base);
227
228
	if (numel(sub_base) < 2) ||  (std(double_sub_base(:)) == 0)
229
	    % This check is moved here for normxcorr2
230
	    eid = sprintf('Images:%s:sameElementsInTemplate',mfilename);
231
	    msg = 'The values of TEMPLATE cannot all be the same.';
232
	    error(eid,'%s',msg);
233
	end
234
235
	local_sum_A = dic_local_sum(double_sub_base,n,n);
236
	local_sum_A2 = dic_local_sum(double_sub_base.*double_sub_base,n,n);
237
238
	% Note: diff_local_sums should be nonnegative, but may have negative
239
	% values due to round off errors. Below, we use max to ensure the
240
	% radicand is nonnegative.
241
	denom_A = sqrt( max(( local_sum_A2 - (local_sum_A.^2)/mn ) / (mn-1), 0) );
242
	i_nonzero = find(denom_A~=0);
243
    
2 by Suren A. Chilingaryan
Support for different optimization modes
244
	data_base(icp).denom_A = denom_A;
245
	data_base(icp).i_nonzero = i_nonzero;
246
247
	data_base(icp).local_sum_A = local_sum_A;
248
	data_base(icp).sub_base = sub_base;
249
	
250
	if (OPTIMIZE > 1)
251
	    data_base(icp).sub_base_fft = fft2_cuda(double_sub_base, outsize, outsize);
252
	else
253
	    data_base(icp).sub_base_fft = fft2(double_sub_base, outsize, outsize);
254
	end
8 by Suren A. Chilingaryan
Complete elimination of cpcorr
255
256
	data_base(icp).base_fractional_offset = base_points_for(icp,:) - round(base_points_for(icp,:)*PRECISION)/PRECISION;
2 by Suren A. Chilingaryan
Support for different optimization modes
257
    end
258
  end
1 by Suren A. Chilingaryan
Initial import
259
end
260
261
%normxcorr_hw(hwid);
262
%return;
263
8 by Suren A. Chilingaryan
Complete elimination of cpcorr
264
if OPTIMIZE > 2
265
    normxcorr_hw(hwid, 12, input_points_x, input_points_y);
266
else
6 by Suren A. Chilingaryan
A little more computations are moved to CUDA
267
    input_correl(:,1)=reshape(input_points_x,[],1);         % we reshape the input points to one row of values since this is the shape cpcorr will accept
268
    input_correl(:,2)=reshape(input_points_y,[],1);
8 by Suren A. Chilingaryan
Complete elimination of cpcorr
269
end
6 by Suren A. Chilingaryan
A little more computations are moved to CUDA
270
1 by Suren A. Chilingaryan
Initial import
271
for i=firstimage:(r-1)               % run through all images
272
    tic             % start the timer
273
274
24 by Suren A. Chilingaryan
Optimization mode 5 for matlab: image loading in C code
275
    if OPTIMIZE > 4
276
	normxcorr_hw(hwid, 13, strcat(imagedir, filenamelist((i+1),:)));
277
	input_correl = normxcorr_hw(hwid, 14);
278
    elseif OPTIMIZE > 2
8 by Suren A. Chilingaryan
Complete elimination of cpcorr
279
	%Validate findpeak
280
	%dic_cpcorr3(CORRSIZE, PRECISION, OPTIMIZE, hwid, ncp, input);
24 by Suren A. Chilingaryan
Optimization mode 5 for matlab: image loading in C code
281
282
	input = uint8(mean(double(imread([imagedir, filenamelist((i+1),:)])),3));       % read in the image which has to be correlated
8 by Suren A. Chilingaryan
Complete elimination of cpcorr
283
	normxcorr_hw(hwid, 13, input)
284
	input_correl = normxcorr_hw(hwid, 14);
6 by Suren A. Chilingaryan
A little more computations are moved to CUDA
285
    elseif OPTIMIZE > 0
24 by Suren A. Chilingaryan
Optimization mode 5 for matlab: image loading in C code
286
	input = uint8(mean(double(imread([imagedir, filenamelist((i+1),:)])),3));       % read in the image which has to be correlated
6 by Suren A. Chilingaryan
A little more computations are moved to CUDA
287
	input_correl(:,:)=dic_cpcorr(CORRSIZE, PRECISION, OPTIMIZE, hwid, data_base, input_correl, input);
2 by Suren A. Chilingaryan
Support for different optimization modes
288
    else
24 by Suren A. Chilingaryan
Optimization mode 5 for matlab: image loading in C code
289
	input = uint8(mean(double(imread([imagedir, filenamelist((i+1),:)])),3));       % read in the image which has to be correlated
6 by Suren A. Chilingaryan
A little more computations are moved to CUDA
290
	input_correl(:,:)=cpcorr(input_correl, base_points_for, input, base);
291
    end
19 by Suren A. Chilingaryan
Provide stand-alone library
292
    
8 by Suren A. Chilingaryan
Complete elimination of cpcorr
293
    %We need to copy
6 by Suren A. Chilingaryan
A little more computations are moved to CUDA
294
    validx(:,i)=double(input_correl(:,1));                                       % the results we get from cpcorr for the x-direction
295
    validy(:,i)=double(input_correl(:,2));                                       % the results we get from cpcorr for the y-direction
296
297
    if (SAVEDATA)    
298
	savelinex=validx(:,i)';
299
	dlmwrite([datadir, 'resultsimcorrx.txt'], savelinex , 'delimiter', '\t', '-append');       % Here we save the result from each image; if you are desperately want to run this function with e.g. matlab 6.5 then you should comment this line out. If you do that the data will be saved at the end of the correlation step - good luck ;-)
300
    
301
	saveliney=validy(:,i)';
302
	dlmwrite([datadir, 'resultsimcorry.txt'], saveliney , 'delimiter', '\t', '-append');
303
    end
1 by Suren A. Chilingaryan
Initial import
304
    
305
    if (~SILENT) 
306
	waitbar(i/(r-1))                                % update the waitbar
307
308
	imshow([imagedir, filenamelist(i+1,:)])                     % update image
309
	hold on
310
	plot(grid_x,grid_y,'g+')                                % plot start position of raster
6 by Suren A. Chilingaryan
A little more computations are moved to CUDA
311
	plot(input_correl(:,1),input_correl(:,2),'r+')        % plot actual postition of raster
1 by Suren A. Chilingaryan
Initial import
312
	hold off
313
	drawnow
314
	time(i)=toc;                                                 % take time
315
	estimatedtime=sum(time)/i*(r-1);            % estimate time to process
316
	title(['# Im.: ', num2str((r-1)),'; Proc. Im. #: ', num2str((i)),'; # Rasterp.:',num2str(row*col), '; Est. Time [s] ', num2str(round(estimatedtime)), ';  Elapsed Time [s] ', num2str(round(sum(time)))]);    % plot a title onto the image
317
	drawnow
318
    end
319
end    
320
2 by Suren A. Chilingaryan
Support for different optimization modes
321
if OPTIMIZE > 2
322
    normxcorr_hw(hwid);
323
end
1 by Suren A. Chilingaryan
Initial import
324
325
if (~SILENT)
326
    close(g)
327
end
328
329
close all
330
331
% save
332
333
if (~SILENT)
334
    save ([datadir,'time.dat'], 'time', '-ascii', '-tabs');
335
end
336
337
save ([datadir,'validx.dat'], 'validx', '-ascii', '-tabs');
338
save ([datadir,'validy.dat'], 'validy', '-ascii', '-tabs');