[37] | 1 | %load_scene Load data of a real scene. |
---|
| 2 | % |
---|
| 3 | % function [M,I] = load_scene([show[, load_all_images]]) |
---|
| 4 | % |
---|
| 5 | % global scene.ID ... contains the number of the scene to load |
---|
| 6 | |
---|
| 7 | function [M,I] = load_scene(show, load_all_images) |
---|
| 8 | |
---|
| 9 | if nargin < 1, show = 0; end |
---|
| 10 | if nargin < 2, load_all_images = 0; end |
---|
| 11 | |
---|
| 12 | global scene Matlab_data; |
---|
| 13 | |
---|
| 14 | if scene.ID == 1 % artificial cubes |
---|
| 15 | if ~isfield(scene,'to_print') |
---|
| 16 | scene.to_print = 0; end % 0..little markers + thin lines, |
---|
| 17 | % 1..big markers + thick lines |
---|
| 18 | if ~isfield(scene,'load') | ~isfield(scene.load,'m') |
---|
| 19 | scene.load.m = 5; end |
---|
| 20 | if ~isfield(scene.load,'predef') |
---|
| 21 | scene.load.predef = 0; end % 2 .. cubes like in the master thesis |
---|
| 22 | if ~isfield(scene.load,'emptyness') |
---|
| 23 | scene.load.emptyness = 0.05; end |
---|
| 24 | [M,I,P0,X0,scene.lp,polys] = ... |
---|
| 25 | create_cubes(2,scene.load.m,scene.load.predef,scene.load.emptyness,[],0); |
---|
| 26 | M(k2idx(find(~I))) = NaN; return |
---|
| 27 | end |
---|
| 28 | |
---|
| 29 | if 1, dir = [ Matlab_data 'cmp/' ]; % data in my directory |
---|
| 30 | else dir = '/data/3DR/Projrec/'; end |
---|
| 31 | |
---|
| 32 | scene.data_type = 'cmp'; % data from Cmp |
---|
| 33 | scene.detection = 'manual'; |
---|
| 34 | switch scene.ID |
---|
| 35 | case 2, scene.name = 'House'; |
---|
| 36 | file='Domek/domek.cor'; %'OK.cor'; |
---|
| 37 | picDir='Domek'; %'tif'; |
---|
| 38 | case 3, scene.name = 'Corridor'; |
---|
| 39 | file='Coridor-Cake/coridorC.cor'; picDir='Coridor-Cake'; |
---|
| 40 | case 4, scene.name = 'Church'; |
---|
| 41 | file='Plec/Plec.cor'; picDir='Plec'; |
---|
| 42 | case 5, scene.name = 'Kampa'; |
---|
| 43 | file='Kampa/Kampa.cor'; picDir='Kampa'; |
---|
| 44 | case 6, scene.name = 'Cubes'; |
---|
| 45 | file='Kostky/Kostky.cor'; picDir='Kostky'; |
---|
| 46 | case 7, scene.name = 'puzzle'; |
---|
| 47 | file='adam/hlavolam.cor'; picDir='adam'; |
---|
| 48 | |
---|
| 49 | otherwise % data from Oxford: |
---|
| 50 | scene.data_type = 'oxford'; |
---|
| 51 | scene.detection = 'Harris'' operator'; |
---|
| 52 | dir = [ Matlab_data 'oxford/' ]; |
---|
| 53 | decimals=3; |
---|
| 54 | switch scene.ID |
---|
| 55 | case 101, scene.name = 'House (Oxford)'; |
---|
| 56 | file='house'; last_index=9; picDir='house/'; |
---|
| 57 | case 102, scene.name = 'Corridor (Oxford)'; |
---|
| 58 | file='bt'; last_index=10; picDir='corridor/'; |
---|
| 59 | |
---|
| 60 | otherwise % data from Oxford: |
---|
| 61 | scene.data_type = 'oxford_'; |
---|
| 62 | switch scene.ID |
---|
| 63 | case 170, scene.name = 'Dinosaur (Oxford)'; |
---|
| 64 | file='viff'; last_index=36; picDir='dinosaur/'; |
---|
| 65 | |
---|
| 66 | otherwise |
---|
| 67 | scene.data_type = 'leuven'; |
---|
| 68 | scene.detection = 'Harris'' operator'; |
---|
| 69 | dir = [ Matlab_data 'leuven/' ]; |
---|
| 70 | decimals=3; first_index = 0; ext=''; |
---|
| 71 | switch scene.ID |
---|
| 72 | case 201, scene.name = 'Castle (Leuven)'; |
---|
| 73 | file='viff'; last_index=21; picDir='Castle/'; |
---|
| 74 | case 202, scene.name = 'Temple (Leuven)'; |
---|
| 75 | file='temple'; first_index=2; last_index=6; |
---|
| 76 | decimals=2; ext='.pgm'; picDir='Temple/'; |
---|
| 77 | otherwise |
---|
| 78 | scene.data_type = 'boujou'; |
---|
| 79 | scene.detection = 'boujou'; |
---|
| 80 | dir = [ Matlab_data 'boujou/' ]; |
---|
| 81 | switch scene.ID |
---|
| 82 | case 301, scene.name = 'Road in Forest'; |
---|
| 83 | file='road'; last_index=1; picDir='Road_in_Forest/'; |
---|
| 84 | case 302, scene.name = 'Corridor (CMP)'; |
---|
| 85 | file='corridorvideo'; last_index=1; picDir='Corridor_CMP/'; |
---|
| 86 | case 303, scene.name = 'Fish eye round'; |
---|
| 87 | file='fish_ray4in_im'; last_index=1; picDir='Fish_eye_round/fish_ray_4_in/'; |
---|
| 88 | decimals=4; |
---|
| 89 | otherwise |
---|
| 90 | disp(sprintf('Error: undefined scene with ID %d.', scene.ID)); |
---|
| 91 | M = []; I = []; return; |
---|
| 92 | end |
---|
| 93 | end |
---|
| 94 | end |
---|
| 95 | end |
---|
| 96 | end |
---|
| 97 | |
---|
| 98 | switch scene.data_type |
---|
| 99 | case 'cmp' |
---|
| 100 | if ~exist('CORR'), load ([dir file],'-mat'); |
---|
| 101 | CORR = CORR_EXCHANGE; |
---|
| 102 | CORR.d.picturesDir=[dir picDir]; |
---|
| 103 | end |
---|
| 104 | x = CORR.d.corr(:,:,1)'; |
---|
| 105 | y = CORR.d.corr(:,:,2)'; |
---|
| 106 | [m n] = size(x); |
---|
| 107 | I = x~=0; |
---|
| 108 | M(1:3:3*m,1:n) = x; |
---|
| 109 | M(2:3:3*m,1:n) = y; |
---|
| 110 | M(3:3:3*m,1:n) = ones(size(I)); |
---|
| 111 | |
---|
| 112 | % kill unknown data |
---|
| 113 | M(k2i(find(~I))) = NaN; |
---|
| 114 | case 'oxford' |
---|
| 115 | [M,I] = oxford2mm([dir picDir file], last_index); |
---|
| 116 | M = e2p(M); % add ones as homogenous coordinates |
---|
| 117 | [m n] = size(I); |
---|
| 118 | case 'oxford_' |
---|
| 119 | [M,I] = oxford_2mm([dir picDir file]); |
---|
| 120 | M = e2p(M); % add ones as homogenous coordinates |
---|
| 121 | [m n] = size(I); |
---|
| 122 | case 'leuven' |
---|
| 123 | scene.mm_file = [ dir picDir kill_spaces(scene.name) '.mat' ]; |
---|
| 124 | convert = 1; to_file = 0; |
---|
| 125 | if 1 %scene.ID == 201 % `Leuven's castle' is too big to compute always again |
---|
| 126 | to_file = 1; |
---|
| 127 | convert = ~file_exists(scene.mm_file); % whether file doesn't exist |
---|
| 128 | end |
---|
| 129 | if convert |
---|
| 130 | [M,I] = leuven2mm([dir picDir], file, last_index, first_index, ... |
---|
| 131 | decimals, ext); |
---|
| 132 | if to_file |
---|
| 133 | disp([ 'Saving to precompiled file ' scene.mm_file '...' ]); |
---|
| 134 | a=[ 'save ' scene.mm_file ' M I']; eval(a); end |
---|
| 135 | else |
---|
| 136 | disp([ 'Loading from precompiled file ' scene.mm_file '...' ]); |
---|
| 137 | a=[ 'load ' scene.mm_file ' M I']; eval(a); |
---|
| 138 | end |
---|
| 139 | M = e2p(M); % add ones as homogenous coordinates |
---|
| 140 | [m n] = size(I); |
---|
| 141 | |
---|
| 142 | case 'boujou' |
---|
| 143 | [M,I] = boujou2mm([dir picDir file '.txt']); |
---|
| 144 | fprintf(1,'Converting from Eucledian to projective coordinates...'); tic; |
---|
| 145 | M = e2p(M); % add ones as homogenous coordinates |
---|
| 146 | disp(['(' num2str(toc) ' sec)']); |
---|
| 147 | [m n] = size(I); |
---|
| 148 | end |
---|
| 149 | |
---|
| 150 | |
---|
| 151 | % take out some points and pictures |
---|
| 152 | % take out some pictures |
---|
| 153 | if scene.ID==3, % take out the first picture |
---|
| 154 | I=I([2:8],:); M=M([2*3-2:3*8],:); m=m-1; |
---|
| 155 | end |
---|
| 156 | |
---|
| 157 | % take out points which are just in two images or less |
---|
| 158 | if 1 %scene.ID==3, |
---|
| 159 | out = find(sum(I)<=1); %<=2 |
---|
| 160 | stay = setdiff(1:n,out); M = M(:,stay); |
---|
| 161 | I = I(:,stay); [m n] = size(I); |
---|
| 162 | end |
---|
| 163 | |
---|
| 164 | % take out points which are not in the first image |
---|
| 165 | %if scene.ID==2, stay=find(I(1,:) == 1); M=M(:,stay); I=I(:,stay); end |
---|
| 166 | |
---|
| 167 | |
---|
| 168 | if strcmp(scene.data_type, 'cmp'), |
---|
| 169 | decimals = ceil(log10(m + .1)); |
---|
| 170 | end |
---|
| 171 | format = sprintf('%%0%dd',decimals); |
---|
| 172 | |
---|
| 173 | % load images |
---|
| 174 | changed = 0; |
---|
| 175 | if show | load_all_images, to_load = m; else to_load = 1; end |
---|
| 176 | if ~isfield(scene,'img') | size(scene.img,2)~=to_load,scene.img{to_load}=[];end |
---|
| 177 | for k=1:to_load |
---|
| 178 | switch scene.data_type |
---|
| 179 | case 'cmp' |
---|
| 180 | nos = sprintf(format,k); |
---|
| 181 | InputFile = strcat(CORR.d.picturesDir,filesep,CORR.d.filePrefix,... |
---|
| 182 | nos,'.', CORR.d.fileExt); |
---|
| 183 | case 'oxford' |
---|
| 184 | InputFile = [[dir picDir file] '.' num2str(k-1,format) '.png' ]; % '.pgm' |
---|
| 185 | % doesn't work in Matlab |
---|
| 186 | case 'oxford_' |
---|
| 187 | InputFile = [[dir picDir file] '.' num2str(k-1,format) '.png' ]; % '.ppm' |
---|
| 188 | % doesn't work in Matlab |
---|
| 189 | case 'leuven' |
---|
| 190 | InputFile = [[dir picDir file] '.' num2str(k-1+first_index,format) ... |
---|
| 191 | '.png' ]; % '.pgm' doesn't work in Matlab |
---|
| 192 | case 'boujou' |
---|
| 193 | InputFile = [[dir picDir file] '.' num2str(k-1+first_index,format) ... |
---|
| 194 | '.jpg' ]; |
---|
| 195 | otherwise |
---|
| 196 | disp('Unknown data type'); |
---|
| 197 | end |
---|
| 198 | |
---|
| 199 | if isempty(scene.img{k}) | ~isfield(scene.img{k}, 'file') ... |
---|
| 200 | | ~strcmp(scene.img{k}.file, InputFile) |
---|
| 201 | disp(sprintf('Loading %s...', InputFile)); |
---|
| 202 | scene.img{k}.file = InputFile; |
---|
| 203 | scene.img{k}.data = imread(InputFile); |
---|
| 204 | |
---|
| 205 | scene.image_size = size(scene.img{1}.data); |
---|
| 206 | if scene.ID == 2 % Domek |
---|
| 207 | % pictures are too big therefore some smaller ones are taken |
---|
| 208 | scene.image_size_show = scene.image_size; |
---|
| 209 | scene.image_size(1:2) = [ 2003 2952 ]; |
---|
| 210 | end |
---|
| 211 | |
---|
| 212 | changed=1; |
---|
| 213 | end |
---|
| 214 | end |
---|
| 215 | |
---|
| 216 | tiles_y=4; if m/tiles_y > 2, tiles_x = 6; else tiles_x = 4; end |
---|
| 217 | global tiles; tiles_set(tiles_x, tiles_y); |
---|
| 218 | |
---|
| 219 | if show & changed % show |
---|
| 220 | for k=1:m |
---|
| 221 | fig = figure(10+k); |
---|
| 222 | [x y] = tiles2xy(k); subfig(tiles.y, tiles.x, y*tiles.x+x+1, fig); |
---|
| 223 | cla; image(scene.img{k}.data); hold on; |
---|
| 224 | drawpointsI(M([k*3-2,k*3-1],:),[1;1]*I(k,:)); |
---|
| 225 | end |
---|
| 226 | end |
---|