From 0c8fdd4783a7af134c72f5e5b472d038a85ea131 Mon Sep 17 00:00:00 2001 From: Jonathan Guinet <jonathan.guinet@c-s.fr> Date: Mon, 2 Jul 2012 14:38:36 +0200 Subject: [PATCH] BUG: Check out of bound index of disparitymap in adhesion correction filter. --- .../otbAdhesionCorrectionFilter.h | 1 + .../otbAdhesionCorrectionFilter.txx | 87 ++++++++++--------- 2 files changed, 49 insertions(+), 39 deletions(-) diff --git a/Code/DisparityMap/otbAdhesionCorrectionFilter.h b/Code/DisparityMap/otbAdhesionCorrectionFilter.h index 74a1b94e6a..4e1e1ef133 100644 --- a/Code/DisparityMap/otbAdhesionCorrectionFilter.h +++ b/Code/DisparityMap/otbAdhesionCorrectionFilter.h @@ -23,6 +23,7 @@ #include "itkConstNeighborhoodIterator.h" #include "itkImageRegionConstIterator.h" #include "itkImageLinearConstIteratorWithIndex.h" +#include <vcl_algorithm.h> namespace otb { diff --git a/Code/DisparityMap/otbAdhesionCorrectionFilter.txx b/Code/DisparityMap/otbAdhesionCorrectionFilter.txx index c097d338d8..15dd1ea088 100644 --- a/Code/DisparityMap/otbAdhesionCorrectionFilter.txx +++ b/Code/DisparityMap/otbAdhesionCorrectionFilter.txx @@ -1425,7 +1425,7 @@ AdhesionCorrectionFilter<TImage, TMask> /** Vertical lines (perpendicular to epipolar lines) */ - /** Jumps of the disaprity map in the other diection + /** Jumps of the disparity map in the other direction * disparity_jump_2: flag 7---> special case: intersections * flag 5---> jump due to an upper border * flag 6---> jump due to an lower border @@ -1580,77 +1580,86 @@ AdhesionCorrectionFilter<TImage, TMask> index_pos = new_disparityIt.GetIndex(); if (outputriskedgesPtr->GetPixel(index_pos) != 0) { - int l=0-big_dist; - index[0]=index_pos[0]; - index[1]=index_pos[1]+l; + int l = 0 - vcl_min(big_dist,static_cast<int>(index_pos[1]));//out of bound checking + index[0] = index_pos[0]; + index[1] = index_pos[1] + l; + while(l<=0 && disparity_jump2->GetPixel(index) != 5) - { - l++; - index[1]=index_pos[1]+l; - } - index[1]=index_pos[1]+l; + { + l++; + index[1]=index_pos[1]+l; + } + + + index[1] = index_pos[1] + l; disparity_jump2It.SetIndex(index); - if(disparity_jump2It.Get() ==5 && l != 0) disparity_jump2It.Set(0); - for(int i=l; i<=0; i++) + if (disparity_jump2It.Get() == 5 && l != 0) disparity_jump2It.Set(0); + for (int i = l; i <= 0; i++) { - index[1]=index_pos[1]+i; + index[1] = index_pos[1] + i; new_disparityIt.SetIndex(index); new_maskIt.SetIndex(index); new_disparityIt.Set(0); new_maskIt.Set(0); } - l=big_dist; - index[0]=index_pos[0]; - index[1]=index_pos[1]+l; - while(l>=0 && disparity_jump2->GetPixel(index) != 6) + + int maxSize=static_cast<int>(disparity_jump2->GetRequestedRegion().GetSize()[1]); + l = vcl_min(static_cast<int>((maxSize-1)- index_pos[1]),big_dist); //out of bound checking + index[0] = index_pos[0]; + index[1] = index_pos[1] + l; + while (l >= 0 && disparity_jump2->GetPixel(index) != 6) { l--; - index[1]=index_pos[1]+l; + index[1] = index_pos[1] + l; } - index[1]=index_pos[1]+l; + index[1] = index_pos[1] + l; disparity_jump2It.SetIndex(index); - if(disparity_jump2It.Get() == 6 && l != 0) disparity_jump2It.Set(0); - for(int i=l; i>=0; i--) + if (disparity_jump2It.Get() == 6 && l != 0) disparity_jump2It.Set(0); + for (int i = l; i >= 0; i--) { - index[1]=index_pos[1]+i; + index[1] = index_pos[1] + i; new_disparityIt.SetIndex(index); new_maskIt.SetIndex(index); new_disparityIt.Set(0); new_maskIt.Set(0); } - l=-big_dist; - index[0]=index_pos[0]; - index[1]=index_pos[1]+l; - while(l<=0 && disparity_jump2->GetPixel(index) != 8) + l = 0 - vcl_min(big_dist,static_cast<int>(index_pos[1])); + + index[0] = index_pos[0]; + index[1] = index_pos[1]+l; + + while (l <= 0 && disparity_jump2->GetPixel(index) != 8) { l++; - index[1]=index_pos[1]+l; + index[1] = index_pos[1] + l; } - index[1]=index_pos[1]+l; + index[1] = index_pos[1] + l; disparity_jump2It.SetIndex(index); - if(disparity_jump2It.Get() == 8 && l != 0) disparity_jump2It.Set(0); - for(int i=l; i<=0; i++) + if (disparity_jump2It.Get() == 8 && l != 0) disparity_jump2It.Set(0); + for (int i = l; i <= 0; i++) { - index[1]=index_pos[1]+i; + index[1] = index_pos[1] + i; new_disparityIt.SetIndex(index); new_maskIt.SetIndex(index); new_disparityIt.Set(0); new_maskIt.Set(0); } - l=big_dist; - index[0]=index_pos[0]; - index[1]=index_pos[1]+l; - while(l>=0 && disparity_jump2->GetPixel(index) != 9) + + l = vcl_min(static_cast<int>((maxSize-1)- index_pos[1]),big_dist); + + index[0] = index_pos[0]; + index[1] = index_pos[1] + l; + while (l >= 0 && disparity_jump2->GetPixel(index) != 9) { l--; - index[1]=index_pos[1]+l; + index[1] = index_pos[1] + l; } - index[1]=index_pos[1]+l; + index[1] = index_pos[1] + l; disparity_jump2It.SetIndex(index); - if(disparity_jump2It.Get() == 9 && l != 0) disparity_jump2It.Set(0); - for(int i=l; i>=0; i--) + if (disparity_jump2It.Get() == 9 && l != 0) disparity_jump2It.Set(0); + for (int i = l; i >= 0; i--) { - index[1]=index_pos[1]+i; + index[1] = index_pos[1] + i; new_disparityIt.SetIndex(index); new_maskIt.SetIndex(index); new_disparityIt.Set(0); -- GitLab