Hi allemaal,
Ik ben nu een tijdje bezig met een 'depth map' te maken mbv 2 foto's, die parallel op een paar cm van elkaar zijn genomen, ala je ogen. Om onderscheid te maken tussen verschillende objecten heb ik gekozen voor een cross-correlation. Het probleem is nu echter dat ik moet gaan werken met grote matrices (foto's) en dat gaat allemaal erg traag.
Voor de cross-correlation op een bepaald punt x,y heb je de volgende gegevens nodig (zie formule link):
1) De waarden van een matrix gekwadrateerd (inwendig product van zichzelf?) en opgeteld
2) Van alle waarden in de matrix een getal aftrekken
3) De sommatie van een matrix
4) De werkelijke correlatie uitrekenen
Bij de toepassing van 1, 2 en 3 heb ik het volgende:
Voor het laatste heb ik dit
Het vervelende is dat dit gewoon vreselijk traag is! Bij een afbeelding van 100*75 duurt het hele proces toch al snel een seconde of 2, dus 1024*768 hoef ik nieteens te proberen (is trouwens op een E8400@3,6).
Nu is mijn vraag:
Is er een manier om in c(#) heel snel matrix operaties, zoals die uit het lijstje, uit te voeren? Op deze manier gaat het namelijk gewoon echt TE traag!
Alvast bedankt
Ik ben nu een tijdje bezig met een 'depth map' te maken mbv 2 foto's, die parallel op een paar cm van elkaar zijn genomen, ala je ogen. Om onderscheid te maken tussen verschillende objecten heb ik gekozen voor een cross-correlation. Het probleem is nu echter dat ik moet gaan werken met grote matrices (foto's) en dat gaat allemaal erg traag.
Voor de cross-correlation op een bepaald punt x,y heb je de volgende gegevens nodig (zie formule link):
1) De waarden van een matrix gekwadrateerd (inwendig product van zichzelf?) en opgeteld
2) Van alle waarden in de matrix een getal aftrekken
3) De sommatie van een matrix
4) De werkelijke correlatie uitrekenen
Bij de toepassing van 1, 2 en 3 heb ik het volgende:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| y = 0; x = 0; while (x < width) { while (y < height) { leftCorrArr[x, y] = leftDataArr[x, y] - leftAvr; //Getal aftrekken van waarde norml += leftCorrArr[x, y] * leftCorrArr[x, y]; //Waarde kwadrateren rightCorrArr[x, y] = rightDataArr[x, y] - rightAvr; normr += rightCorrArr[x, y] * rightCorrArr[x, y]; y++; } x++; y = 0; } |
Voor het laatste heb ik dit
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
| normt = (int) Math.Pow(norml * normr, 0.5); y = 0; x = 0; u = 0; v = 0; while (u < width) { while (v < height) { while (x < width) { while (y < height) { xt = x; yt = y; if (x - u < 0) xt = width + (x - u); //Wanneer hij bij het begin van de matrix is aangekomen, verder vanaf de rechter kant van de afbeelding if (y - v < 0) yt = height + (y - v); //,, corrDataArr[u, v] += leftCorrArr[x, y] * rightCorrArr[xt, yt]; y++; } x++; y = 0; } corrDataArr[u, v] = (int) ((255f * (float) corrDataArr[u, v]) / (float)normt); //Uiteindelijke data v++; x = 0; } u++; v = 0; } |
Het vervelende is dat dit gewoon vreselijk traag is! Bij een afbeelding van 100*75 duurt het hele proces toch al snel een seconde of 2, dus 1024*768 hoef ik nieteens te proberen (is trouwens op een E8400@3,6).
Nu is mijn vraag:
Is er een manier om in c(#) heel snel matrix operaties, zoals die uit het lijstje, uit te voeren? Op deze manier gaat het namelijk gewoon echt TE traag!
Alvast bedankt
-- All science is either physics or stamp collecting