| | Algorithm: Multi_Window_SAD |
| for every disparity(d) where d = 0 ⟶ DISP_MAX: |
| for every element(x, y) where x = 0 ⟶ imgW, y = 0 ⟶ imgH: |
| Abs[y][x] = abs(IMG_R[y][x] − IMG_L[y][x + d]); |
| for every element(x, y) where x = winH ⟶ imgW‒winH, y = 0 ⟶ imgH: |
| row[y][x] = row[y][x − 1] + Abs[y][x] − Abs[y][x − winH]; |
| rowE[y][x] = rowE[y][x − 1] + Abs[y][x] − Abs[y][x − 2 cwinH]; |
| for every element(x, y) where x = 0 ⟶ imgW, y = winV ⟶ imgH‒winV: |
| scr[y][x] = scr[y − 1][x] + row[y][x] − row[y − winV][x]; |
| scrE[y][x] = scrE[y − 1][x] + rowE[y][x] − rowE[y − 2 cwinV][x]; |
| for every element(x, y) where x = winH ⟶ imgW‒winH, y = winV ⟶ imgH‒winV: |
| scoreA = scr[y][x]; |
| scoreB = scr[y][x + winH]; |
| scoreC = scr[y + winV][x + winH]; |
| scoreD = scr[y + winV][x]; |
| scoreE = scrE[y + winV − cwinV][x + winH − cwinH]; |
| min_score = scoreE + MIN_2_values{scoreA, scoreB, scoreC, scoreD}; |
| if min_score < bestscoreR[y + winV][x + winH]: |
| bestscoreR[y + winV][x + winH] = min_score; |
| DISP_IMG_R[y + winV][x + winH] = d; |
| if min_score < bestscoreL[y + winV][x + winH + d]: |
| bestscoreL[y + winV][x + winH + d] = min_score; |
| DISP_IMG_L[y + winV][x + winH + d] = d; |
| for every element(x, y) where x = 0 ⟶ imgW, y = 0 ⟶ imgH: |
| dispVal = DISP_IMG_R[y][x]; |
| if abs(DISP_IMG_L[y][x + dispVal] ‒>dispVal) > 1: |
| DISP_IMG_R[y][x] = 0; |