Précédent   Forum du club des développeurs et IT Pro > Environnements de développement > MATLAB > Téléchargez
Téléchargez Récupérez et commentez les sources et outils mis à disposition par la rubrique MATLAB
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 17/12/2012, 22h38   #1
saturn1
Membre confirmé
 
Inscription : janvier 2008
Messages : 576
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 576
Points : 258
Points : 258
Par défaut Stéréovison - AD-census

Bonjour, voici une implémentation d'un algorithme de stéréovision.(adcensus)

Il est très fortement inspiré de ce papier:

http://xing-mei.net/resource/pdf/adcensus.pdf

Il est découpé en plusieurs parties:
- un "matching cost" calculé avec une fenêtre de taille fixe.
- une agrégation de coût qui permet d'obtenir une disparite plus fiable qui se base sur l’homogénéité des régions.(~les changement de disparité importants n'ont lieu que sur les zones de forts gradients.)
- un "disparity refinement" qui permet de "smoother" les resultats avec une methode d'optimisation semi-globale.

Voici le script source en matlab:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
function [dsp pixel_dsp bplan] = adcensus(i1,i2,mins, maxs)

win_size = 4;  %-- larger for less textured surfaces

%refret = inf(maxs + mins + 1, size(i1, 1), size(i1, 2), 3, 3);
tic
costs = mc(i1, i2, win_size, mins, maxs, 1);
dsp =  wta(costs, mins, maxs, 1, i1);
crossaggr = crossaggreg2(costs, mins, maxs, 1);
bplan = wta(crossaggr, mins, maxs, 1, i1);

%pixel_dsp = bplan;
%return;

%pixel_dsp = bplan;

dur = toc;
disp(dur);

%costsscanlines = inf(4, maxs + mins + 1, size(i1, 1), size(i1, 2));
co1 = so(crossaggr, mins, maxs, 1, 0, i1, bplan, 1);
co2 = so(crossaggr, mins, maxs, -1, 0, i1, bplan, 1);
co3 = so(crossaggr, mins, maxs, 0, 1, i1, bplan, 1);
co4 = so(crossaggr, mins, maxs, 0, -1, i1, bplan, 1);
co5 = so(crossaggr, mins, maxs, 1, 1, i1, bplan, 1);
co6 = so(crossaggr, mins, maxs, -1, -1, i1, bplan, 1);
co7 = so(crossaggr, mins, maxs, 1, -1, i1, bplan, 1);
co8 = so(crossaggr, mins, maxs, -1, 1, i1, bplan, 1);
ttco = co1 + co2 + co3 + co4 + co5 + co6 + co7 + co8;

pixel_dsp = wta(ttco, mins, maxs, 1, i1);


    function costsscanline = so(costs, mins, maxs, step, stepy, i1, inidisp, idxso)
        tmpcosts = inf(maxs - mins + 1, size(i1, 1), size(i1, 2));
        tic
        if stepy >= 0
            yst = 1;
            endy = size(i1, 1);
        else
            endy = 1;
            yst = size(i1, 1);
        end
        
        if stepy == 0
            qsy = 1;
        else
            qsy = stepy;
        end
        for y=yst:qsy:endy
            if step >= 0
                xst = 1;
                endx = size(i1, 2);
            else
                endx = 1;
                xst = size(i1, 2);
            end
            
            if step == 0
                qsx = 1;
            else
                qsx = step;
            end
            
            for x=xst:qsx:endx
                ite = 1;
                
                for itedis=mins:1:maxs
                    if x == 1 || x == size(i1, 2) || y == 1 || y == size(i1, 1)
                        tmpcosts(ite, y, x) = costs(ite, y, x);
                    else
                        %myval = costs(ite, y, x);
                        ite2 = 1;
                        minn = inf;
                        theta1 = 50;
                        theta2 = 60;
                        %for itedis2=mins:1:maxs
                        %itedis2 = itedis + 1;
                        %    if diff1 == inf && abs(itedis2 - itedis) == 1
                        
                        diff1 = max(abs(i1(min(max(y-stepy, 1), size(i1, 1)), min(max(x - step, 1), size(i1, 2)), 1)...
                            - i1(y, x, 1)), ...
                            abs(i1(min(max(y-stepy, 1), size(i1, 1)), min(max(x - step, 1), size(i1, 2)), 2) - i1(y, x, 2)));
                        diff1 = max(diff1, abs(i1(min(max(y-stepy, 1), size(i1, 1)), min(max(x - step, 1), size(i1, 2)), 3) - i1(y, x, 3)));
                        %end
                        %itedis2 = itedis + 2;
                        %if diff2 == inf && abs(itedis2 - itedis) > 1
                        diff2 = max(abs(i1(min(max(y-stepy, 1), size(i1, 1)), min(max(x - step + itedis, 1), size(i1, 2)), 1) - i1(y, min(max(x + itedis, 1), size(i1, 2)), 1)), ...
                            abs(i1(min(max(y-stepy, 1), size(i1, 1)), min(max(x - step + itedis, 1), size(i1, 2)), 2) - i1(y, min(max(x + itedis, 1), size(i1, 2)), 2)));
                        diff2 = max(diff2, abs(i1(min(max(y-stepy, 1), size(i1, 1)), min(max(x - step + itedis, 1), size(i1, 2)), 3) - i1(y, min(max(x + itedis, 1), size(i1, 2)), 3)));
                        %end
                        %end
                        thresh = 5;
                        
                        %disp(diff2);
                        
                        if diff1 <= thresh && diff2 <= thresh
                            p1 = theta1;
                            p2 = theta2;
                        end
                        if diff1 <= thresh && diff2 >= thresh
                            p1 = theta1 / 4;
                            p2 = theta2 / 4;
                        end
                        if diff1 >= thresh && diff2 <= thresh
                            p1 = theta1 / 4;
                            p2 = theta2 / 4;
                        end
                        if diff1 >= thresh && diff2 >= thresh
                            p1 = theta1 / 10;
                            p2 = theta2 / 10;
                        end
                        minwpen = 0;
                        for itedis2=mins:1:maxs
                            pen = 0;
                            if abs(itedis2 - itedis) == 1
                                pen = p1;
                            end
                            if abs(itedis2 - itedis) > 1
                                pen = p2;
                            end
                            if tmpcosts(ite2, y - stepy, x - step) + pen < minn
                                minn = tmpcosts(ite2, y - stepy, x - step) + pen;
                                %minwpen = tmpcosts(ite2, y, x - 1);
                            end
                            if tmpcosts(ite2, y - stepy, x - step) < minwpen
                                minwpen = tmpcosts(ite2, y - stepy, x - step);
                            end
                            ite2 = ite2 + 1;
                        end
                        myval = costs(ite, y, x) + minn - minwpen;
                        tmpcosts(ite, y, x) = myval;
                    end
                    ite = ite + 1;
                end
            end
        end
        costsscanline = tmpcosts;
        dur = toc;
        disp(dur);
    end

    function rcosts = crossaggreg2(costs, mins, maxs, step)
        rcosts = costs;
        thresh = 10;
        distmax = 50;
        mrange = zeros(size(i1, 1), size(i1, 2), 4);
        
        for itex=1:1:size(i1, 2)
            for itey=1:1:size(i1, 1)
                cond = true;
                citex = itex;
                while citex > 1 && cond
                    if citex ~= itex
                        mrange(itey, itex, 1) = mrange(itey, itex, 1) + 1;
                    end
                    diffc = abs(max(i1(itey, citex, :) - i1(itey, itex,:)));
                    diffc2 = 0;
                    if citex > 2
                        diffc2 = abs(max(i1(itey, citex, :) - i1(itey, citex - 1,:)));
                    end
                    difflen = sqrt((citex - itex) * (citex - itex));
                    cond = diffc < thresh && difflen < distmax && diffc2 < thresh;
                    
                    citex = citex-1;
                end
                
                cond = true;
                citex = itex;
                while citex < size(i1, 2) && cond
                    if citex ~= itex
                        mrange(itey, itex, 2) = mrange(itey, itex, 2) + 1;
                    end
                    diffc = abs(max(i1(itey, citex, :) - i1(itey, itex,:)));
                    diffc2 = 0;
                    if citex < size(1, 2)
                        diffc2 = abs(max(i1(itey, citex, :) - i1(itey, citex + 1,:)));
                    end
                    difflen = sqrt((citex - itex) * (citex - itex));
                    cond = diffc < thresh && difflen < distmax && diffc2 < thresh;
                    
                    citex = citex + 1;
                end
                
                cond = true;
                citey = itey;
                while citey > 1 && cond
                    if citey ~= itey
                        mrange(itey, itex, 3) = mrange(itey, itex, 3) + 1;
                    end
                    diffc = abs(max(i1(citey, itex, :) - i1(itey, itex,:)));
                    diffc2 = 0;
                    if citey > 2
                        diffc2 = abs(max(i1(citey, itex, :) - i1(citey - 1, itex,:)));
                    end
                    difflen = sqrt((citey - itey) * (citey - itey));
                    cond = diffc < thresh && difflen < distmax && diffc2 < thresh;
                    
                    citey = citey - 1;
                end
                
                cond = true;
                citey = itey;
                while citey < size(i1, 1) && cond
                    if citey ~= itey
                        mrange(itey, itex, 4) = mrange(itey, itex, 4) + 1;
                    end
                    diffc = abs(max(i1(citey, itex, :) - i1(itey, itex,:)));
                    diffc2 = 0;
                    if citey < size(1, 1)
                        diffc2 = abs(max(i1(citey, itex, :) - i1(citey + 1, itex,:)));
                    end
                    difflen = sqrt((citey - itey) * (citey - itey));
                    cond = diffc < thresh && difflen < distmax && diffc2 < thresh;
                    
                    citey = citey + 1;
                end
            end
        end
        ite = 1;
        for iteds=mins:step:maxs
            
            for itex=1:1:size(i1, 2)
                for itey=1:1:size(i1, 1)
                    xleft = mrange(itey, itex, 1);
                    xright = mrange(itey, itex, 2);
                    xtop= mrange(itey, itex, 3);
                    xbot = mrange(itey, itex, 4);
                    
                    mend = itey + xbot;
                    ttsum = 0.0;
                    cc = 0.0;
                    for mstart=itey - xtop:1:mend
                        txleft = mrange(mstart, itex, 1);
                        txright = mrange(mstart, itex, 2);
                        for msx=itex-txleft:1:itex+txright
                            ttsum = ttsum + costs(ite, mstart, msx);
                            cc = cc + 1;
                        end
                    end
                    
                    for mstart=itex - xleft:1:itex + xright
                        tyup = mrange(itey, mstart, 3);
                        tybot = mrange(itey, mstart, 4);
                        for msy=itey-tyup:1:itey+tybot
                            ttsum = ttsum + costs(ite, msy, mstart);
                            cc = cc + 1;
                        end
                    end
                    
                    rcosts(ite, itey, itex) = ttsum;
                end
            end
            ite = ite + 1;
        end
    end

    function dsp = wta(costs, mins, maxs, step, i1)
        dsp = zeros(size(i1, 1), size(i1, 2));
        for itex=1:1:size(i1,2)
            for itey=1:1:size(i1,1)
                minnn = inf;
                ite = 1;
                for i=mins:step:maxs
                    if costs(ite, itey, itex) < minnn
                        minnn = costs(ite, itey, itex);
                        dsp(itey, itex) = i;
                    end
                    
                    ite = ite + 1;
                end
            end
        end
    end

    function [costs] = mc(i1, i2, win_size, mins, maxs, step)
        
        h = 1/win_size.^2*ones(win_size); %-- averaging filter
        hc = 1/10.^2*ones(10); %-- averaging filter
        costs = inf(maxs - mins + 1, size(i1, 1), size(i1, 2));
        ite = 1;
        for i=mins:step:maxs
            s  = shift_image(i2,i);
            
            %--CSAD  is Cost from Sum of Absolute Differences
            %--CGRAD is Cost from Gradient of Absolute Differences
            diffs = sum(abs(i1-s),3);       %-- get CSAD and CGRAD
            CSAD =  imfilter(diffs,h);
            CENSUS = sum(xor(i1, s), 3);
            CENSUS = imfilter(CENSUS, hc);
            
            lambdacensus = 100000;
            lambdasad = 7.5;
            
            funcensus = 1 - exp(-CENSUS / lambdacensus);
            funsad = 1 - exp(-CSAD / lambdasad);
            ttc = funsad + funcensus;
            for itex=1:1:size(i1,2)
                for itey=1:1:size(i1,1)
                    costs(ite, itey, itex) = ttc(itey, itex);
                    %disp(costs(ite, itey, itex));
                end
            end
            
            ite = ite + 1;
        end
        
    end

%-- Shift an image
    function I = shift_image(I,shift)
        dimx = size(I,2);
        if(shift > 0)
            I(:,shift:dimx,:) = I(:,1:dimx-shift+1,:);
            I(:,1:shift-1,:) = 0;
        else
            if(shift<0)
                I(:,1:dimx+shift+1,:) = I(:,-shift:dimx,:);
                I(:,dimx+shift+1:dimx,:) = 0;
            end
        end
    end

end
et un exemple d'utilisation

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
mins = 0;
maxs = 17;

name1 = 'tsuR.png';
name2 = 'tsuL.png';

i2 = single(imread(name2));
i1 = single(imread(name1));

[d p bplan] = adcensus(i1,i2,mins, maxs);

subplot(2,2,1),
imshow(d, []);

subplot(2,2,3),
imshow(bplan, []);

subplot(2,2,4),
imshow(p, []);

Et enfin des résultats sur l'exemple "tsukuba" (voir image attachée)

Les parametres a changes sont "mins" et "maxs" dépendant de votre prise de vue.
Il est possible aussi de modifier les valeurs
"thresh" et "maxdist" dans "costaggregation" pour ajuster la taille des régions.
On peut aussi modifier les valeurs theta1 et theta2 dans le scanline optimisation.

J’espère que ce bout de code pourrait aider des gens a se faire rapidement une idée sur la qualité des carte de disparité estime a partir d'une image droite gauche.

Tous les commentaires sont les bienvenus.
Images attachées
Type de fichier : png 173071adcensustsukuba.png (79,9 Ko, 14 affichages)
saturn1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2013, 06h51   #2
Dut
Responsable MATLAB & Hardware/PC

 
Avatar de Dut
 
Inscription : novembre 2006
Messages : 15 070
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : novembre 2006
Messages : 15 070
Points : 31 143
Points : 31 143
Plusieurs remarque afin de finaliser ce code :
  • supprimer toutes les lignes de code mise en commentaire
  • supprimer tous les appels à tic-toc
  • mettre un bloc de commentaire standard dans l'entête de la fonction

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function [dsp pixel_dsp bplan] = adcensus(i1,i2,mins, maxs)
    % ADCENSUS ...
    %   [A,B] = ADCENSUS(C,D,E,F) ...
    %
    %
    %   See also ...
    
    % Author : 
    % Contact :
    % Date :
    % Version MATLAB : 
    %
__________________
Identification de processeur sous MATLAB (3/3) Identification de processeur sous MATLAB (2/3) Mes contributions MATLAB (R2009a - Windows & Linux)

J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" (Saint Huck)
Dut est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2013, 00h40   #3
magicbibi
Candidat au titre de Membre du Club
 
Homme
Inscription : février 2013
Messages : 8
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : février 2013
Messages : 8
Points : 12
Points : 12
Par défaut Merci

Bravo pour l'implémentation! Manque plus que la CUDA . Sinon, je n'obtiens pas les mêmes disparités que les tiennes en faisant tourner ton algo. Cela vient sans doute des images sources (qui n'ont pas été attachées). Il existe plusieurs paires Tsukuba en fait (peu de gens le savent, mais Tsukuba a été prise avec 5 caméras). Peux-tu fournir la paire Tsukuba utilisée? Merci!

Cédric
magicbibi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2013, 17h37   #4
saturn1
Membre confirmé
 
Inscription : janvier 2008
Messages : 576
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 576
Points : 258
Points : 258
Je posterais les images, mais si tu cherches à générer des bonnes disparity map tu peux regarder ceci:

http://cs.brown.edu/~black/code.html
saturn1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 16h34.


 
 
 
 
Partenaires

Hébergement Web