From e349847adcaabb1a14ea38a37c67823a91a18d34 Mon Sep 17 00:00:00 2001
From: Jonathan Guinet <jonathan.guinet@c-s.fr>
Date: Mon, 1 Jul 2013 16:31:44 +0200
Subject: [PATCH] BUG: DisparityTranslate called with empty sensor buffered
 region results in segfault (occurs when lauching StereFramework with too
 coarse grid parameter.)

---
 .../otbDisparityTranslateFilter.txx           | 255 +++++++++---------
 1 file changed, 135 insertions(+), 120 deletions(-)

diff --git a/Code/DisparityMap/otbDisparityTranslateFilter.txx b/Code/DisparityMap/otbDisparityTranslateFilter.txx
index c3190f4fd2..a7c67910b1 100644
--- a/Code/DisparityMap/otbDisparityTranslateFilter.txx
+++ b/Code/DisparityMap/otbDisparityTranslateFilter.txx
@@ -228,7 +228,7 @@ DisparityTranslateFilter<TDisparityImage,TGridImage,TSensorImage,TMaskImage>
   emptyRegion.SetSize(0,0);
   emptyRegion.SetSize(1,0);
   leftIn->SetRequestedRegion(emptyRegion);
-  
+
   TDisparityImage * horizOut = this->GetHorizontalDisparityMapOutput();
   
   TDisparityImage * horizIn = const_cast<TDisparityImage*>(this->GetHorizontalDisparityMapInput());
@@ -323,113 +323,80 @@ DisparityTranslateFilter<TDisparityImage,TGridImage,TSensorImage,TMaskImage>
 {
   const TGridImage * leftGrid = this->GetInverseEpipolarLeftGrid();
   const TGridImage * rightGrid = this->GetDirectEpipolarRightGrid();
-  
+
   TDisparityImage * horizOut = this->GetHorizontalDisparityMapOutput();
   TDisparityImage * vertiOut = this->GetVerticalDisparityMapOutput();
-  
+
   const TDisparityImage * horizIn = this->GetHorizontalDisparityMapInput();
   const TDisparityImage * vertiIn = this->GetVerticalDisparityMapInput();
-  
+
   const TMaskImage * maskIn = this->GetDisparityMaskInput();
-  
+
   GridRegionType leftLargest = leftGrid->GetLargestPossibleRegion();
   GridRegionType rightLargest = rightGrid->GetLargestPossibleRegion();
   RegionType buffered = horizIn->GetBufferedRegion();
-  
-  typedef itk::ImageRegionIteratorWithIndex<TDisparityImage> DispIterator;
-  DispIterator horizIter(horizOut,outputRegionForThread);
-  DispIterator vertiIter(vertiOut,outputRegionForThread);
-  
-  horizIter.GoToBegin();
-  vertiIter.GoToBegin();
-  
-  while (!horizIter.IsAtEnd() && !vertiIter.IsAtEnd())
-    {
-    PointType pointSensor;
-    horizOut->TransformIndexToPhysicalPoint(horizIter.GetIndex(),pointSensor);
-    
-    itk::ContinuousIndex<double,2> indexGrid;
-    leftGrid->TransformPhysicalPointToContinuousIndex(pointSensor,indexGrid);
-    
-    // Interpolate in left grid
-    IndexType ul;
-    ul[0] = static_cast<long>(vcl_floor(indexGrid[0]));
-    ul[1] = static_cast<long>(vcl_floor(indexGrid[1]));
-    if (ul[0]<leftLargest.GetIndex()[0]) ul[0]=leftLargest.GetIndex()[0];
-    if (ul[1]<leftLargest.GetIndex()[1]) ul[1]=leftLargest.GetIndex()[1];
-    if (ul[0]>(unsigned int)(leftLargest.GetIndex()[0]+leftLargest.GetSize()[0]-2)) ul[0]=(leftLargest.GetIndex()[0]+leftLargest.GetSize()[0]-2);
-    if (ul[1]>(unsigned int)(leftLargest.GetIndex()[1]+leftLargest.GetSize()[1]-2)) ul[1]=(leftLargest.GetIndex()[1]+leftLargest.GetSize()[1]-2);
-  
-    IndexType ur = ul;
-    ur[0] += 1;
-    IndexType ll = ul;
-    ll[1] += 1;
-    IndexType lr = ul;
-    lr[0] += 1;
-    lr[1] += 1;
-    
-    double rx = indexGrid[0] - static_cast<double>(ul[0]);
-    double ry = indexGrid[1] - static_cast<double>(ul[1]);
-    PointType pointEpi = pointSensor;
-    
-    pointEpi[0] += (1. - ry) * ((1. - rx) * leftGrid->GetPixel(ul)[0] + rx * leftGrid->GetPixel(ur)[0]) +
-                           ry * ((1. - rx) * leftGrid->GetPixel(ll)[0] + rx * leftGrid->GetPixel(lr)[0]);
-    pointEpi[1] += (1. - ry) * ((1. - rx) * leftGrid->GetPixel(ul)[1] + rx * leftGrid->GetPixel(ur)[1]) +
-                           ry * ((1. - rx) * leftGrid->GetPixel(ll)[1] + rx * leftGrid->GetPixel(lr)[1]);
-    
-    itk::ContinuousIndex<double,2> indexEpi;
-    horizIn->TransformPhysicalPointToContinuousIndex(pointEpi,indexEpi);
-    
-    // Interpolate in disparity map
-    ul[0] = static_cast<long>(vcl_floor(indexEpi[0]));
-    ul[1] = static_cast<long>(vcl_floor(indexEpi[1]));
-    if (ul[0]<buffered.GetIndex()[0]) ul[0]=buffered.GetIndex()[0];
-    if (ul[1]<buffered.GetIndex()[1]) ul[1]=buffered.GetIndex()[1];
-    if (ul[0]>(unsigned int)(buffered.GetIndex()[0]+buffered.GetSize()[0]-2)) ul[0]=(buffered.GetIndex()[0]+buffered.GetSize()[0]-2);
-    if (ul[1]>(unsigned int)(buffered.GetIndex()[1]+buffered.GetSize()[1]-2)) ul[1]=(buffered.GetIndex()[1]+buffered.GetSize()[1]-2);
-  
-    ur = ul;
-    ur[0] += 1;
-    ll = ul;
-    ll[1] += 1;
-    lr = ul;
-    lr[0] += 1;
-    lr[1] += 1;
-    
-    // check if all corners are valid
-    if (!maskIn || (maskIn &&
-        maskIn->GetPixel(ul) > 0 &&
-        maskIn->GetPixel(ur) > 0 &&
-        maskIn->GetPixel(ll) > 0 &&
-        maskIn->GetPixel(lr) > 0))
+
+  const bool emptyInputRegion=buffered.GetNumberOfPixels() == 0;
+
+    typedef itk::ImageRegionIteratorWithIndex<TDisparityImage> DispIterator;
+    DispIterator horizIter(horizOut, outputRegionForThread);
+    DispIterator vertiIter(vertiOut, outputRegionForThread);
+
+    horizIter.GoToBegin();
+    vertiIter.GoToBegin();
+
+    while (!horizIter.IsAtEnd() && !vertiIter.IsAtEnd())
       {
-      rx = indexEpi[0] - static_cast<double>(ul[0]);
-      ry = indexEpi[1] - static_cast<double>(ul[1]);
-      
-      itk::ContinuousIndex<double,2> indexRight(indexEpi);
-      
-      indexRight[0] += (1. - ry) * ((1. - rx) * horizIn->GetPixel(ul) + rx * horizIn->GetPixel(ur)) +
-                            ry * ((1. - rx) * horizIn->GetPixel(ll) + rx * horizIn->GetPixel(lr));
-      if (vertiIn)
+
+      if(!emptyInputRegion)
         {
-        indexRight[1] += (1. - ry) * ((1. - rx) * vertiIn->GetPixel(ul) + rx * vertiIn->GetPixel(ur)) +
-                            ry * ((1. - rx) * vertiIn->GetPixel(ll) + rx * vertiIn->GetPixel(lr));
-        }
-      
-      PointType pointRight;
-      horizIn->TransformContinuousIndexToPhysicalPoint(indexRight,pointRight);
-      
-      itk::ContinuousIndex<double,2> indexGridRight;
-      rightGrid->TransformPhysicalPointToContinuousIndex(pointRight,indexGridRight);
-      
-      // Interpolate in right grid
-      ul[0] = static_cast<long>(vcl_floor(indexGridRight[0]));
-      ul[1] = static_cast<long>(vcl_floor(indexGridRight[1]));
-      if (ul[0]<rightLargest.GetIndex()[0]) ul[0]=rightLargest.GetIndex()[0];
-      if (ul[1]<rightLargest.GetIndex()[1]) ul[1]=rightLargest.GetIndex()[1];
-      if (ul[0]>(unsigned int)(rightLargest.GetIndex()[0]+rightLargest.GetSize()[0]-2)) ul[0]=(rightLargest.GetIndex()[0]+rightLargest.GetSize()[0]-2);
-      if (ul[1]>(unsigned int)(rightLargest.GetIndex()[1]+rightLargest.GetSize()[1]-2)) ul[1]=(rightLargest.GetIndex()[1]+rightLargest.GetSize()[1]-2);
-    
+      PointType pointSensor;
+      horizOut->TransformIndexToPhysicalPoint(horizIter.GetIndex(), pointSensor);
+
+      itk::ContinuousIndex<double, 2> indexGrid;
+      leftGrid->TransformPhysicalPointToContinuousIndex(pointSensor, indexGrid);
+
+      // Interpolate in left grid
+      IndexType ul;
+      ul[0] = static_cast<long> (vcl_floor(indexGrid[0]));
+      ul[1] = static_cast<long> (vcl_floor(indexGrid[1]));
+      if (ul[0] < leftLargest.GetIndex()[0]) ul[0] = leftLargest.GetIndex()[0];
+      if (ul[1] < leftLargest.GetIndex()[1]) ul[1] = leftLargest.GetIndex()[1];
+      if (ul[0] > (unsigned int) (leftLargest.GetIndex()[0] + leftLargest.GetSize()[0] - 2)) ul[0] = (
+          leftLargest.GetIndex()[0] + leftLargest.GetSize()[0] - 2);
+      if (ul[1] > (unsigned int) (leftLargest.GetIndex()[1] + leftLargest.GetSize()[1] - 2)) ul[1] = (
+          leftLargest.GetIndex()[1] + leftLargest.GetSize()[1] - 2);
+
+      IndexType ur = ul;
+      ur[0] += 1;
+      IndexType ll = ul;
+      ll[1] += 1;
+      IndexType lr = ul;
+      lr[0] += 1;
+      lr[1] += 1;
+
+      double rx = indexGrid[0] - static_cast<double> (ul[0]);
+      double ry = indexGrid[1] - static_cast<double> (ul[1]);
+      PointType pointEpi = pointSensor;
+
+      pointEpi[0] += (1. - ry) * ((1. - rx) * leftGrid->GetPixel(ul)[0] + rx * leftGrid->GetPixel(ur)[0]) + ry * ((1.
+          - rx) * leftGrid->GetPixel(ll)[0] + rx * leftGrid->GetPixel(lr)[0]);
+      pointEpi[1] += (1. - ry) * ((1. - rx) * leftGrid->GetPixel(ul)[1] + rx * leftGrid->GetPixel(ur)[1]) + ry * ((1.
+          - rx) * leftGrid->GetPixel(ll)[1] + rx * leftGrid->GetPixel(lr)[1]);
+
+      itk::ContinuousIndex<double, 2> indexEpi;
+      horizIn->TransformPhysicalPointToContinuousIndex(pointEpi, indexEpi);
+
+      // Interpolate in disparity map
+      ul[0] = static_cast<long> (vcl_floor(indexEpi[0]));
+      ul[1] = static_cast<long> (vcl_floor(indexEpi[1]));
+      if (ul[0] < buffered.GetIndex()[0]) ul[0] = buffered.GetIndex()[0];
+      if (ul[1] < buffered.GetIndex()[1]) ul[1] = buffered.GetIndex()[1];
+      if (ul[0] > (unsigned int) (buffered.GetIndex()[0] + buffered.GetSize()[0] - 2)) ul[0] = (buffered.GetIndex()[0]
+          + buffered.GetSize()[0] - 2);
+      if (ul[1] > (unsigned int) (buffered.GetIndex()[1] + buffered.GetSize()[1] - 2)) ul[1] = (buffered.GetIndex()[1]
+          + buffered.GetSize()[1] - 2);
+
       ur = ul;
       ur[0] += 1;
       ll = ul;
@@ -437,29 +404,77 @@ DisparityTranslateFilter<TDisparityImage,TGridImage,TSensorImage,TMaskImage>
       lr = ul;
       lr[0] += 1;
       lr[1] += 1;
-      
-      rx = indexGridRight[0] - static_cast<double>(ul[0]);
-      ry = indexGridRight[1] - static_cast<double>(ul[1]);
-      
-      PointType pointSensorRight = pointRight;
-      
-      pointSensorRight[0] += (1. - ry) * ((1. - rx) * rightGrid->GetPixel(ul)[0] + rx * rightGrid->GetPixel(ur)[0]) +
-                                    ry * ((1. - rx) * rightGrid->GetPixel(ll)[0] + rx * rightGrid->GetPixel(lr)[0]);
-      pointSensorRight[1] += (1. - ry) * ((1. - rx) * rightGrid->GetPixel(ul)[1] + rx * rightGrid->GetPixel(ur)[1]) +
-                                    ry * ((1. - rx) * rightGrid->GetPixel(ll)[1] + rx * rightGrid->GetPixel(lr)[1]);
-      
-      horizIter.Set(pointSensorRight[0] - pointSensor[0]);
-      vertiIter.Set(pointSensorRight[1] - pointSensor[1]);
-      }
-    else
-      {
-      horizIter.Set(m_NoDataValue);
-      vertiIter.Set(m_NoDataValue);
+
+      // check if all corners are valid
+      if (!maskIn || (maskIn && maskIn->GetPixel(ul) > 0 && maskIn->GetPixel(ur) > 0 && maskIn->GetPixel(ll) > 0 &&
+          maskIn->GetPixel(lr) > 0))
+        {
+        rx = indexEpi[0] - static_cast<double> (ul[0]);
+        ry = indexEpi[1] - static_cast<double> (ul[1]);
+
+        itk::ContinuousIndex<double, 2> indexRight(indexEpi);
+
+        indexRight[0] += (1. - ry) * ((1. - rx) * horizIn->GetPixel(ul) + rx * horizIn->GetPixel(ur)) + ry * ((1. - rx)
+            * horizIn->GetPixel(ll) + rx * horizIn->GetPixel(lr));
+        if (vertiIn)
+          {
+          indexRight[1] += (1. - ry) * ((1. - rx) * vertiIn->GetPixel(ul) + rx * vertiIn->GetPixel(ur)) + ry * ((1.
+              - rx) * vertiIn->GetPixel(ll) + rx * vertiIn->GetPixel(lr));
+          }
+
+        PointType pointRight;
+        horizIn->TransformContinuousIndexToPhysicalPoint(indexRight, pointRight);
+
+        itk::ContinuousIndex<double, 2> indexGridRight;
+        rightGrid->TransformPhysicalPointToContinuousIndex(pointRight, indexGridRight);
+
+        // Interpolate in right grid
+        ul[0] = static_cast<long> (vcl_floor(indexGridRight[0]));
+        ul[1] = static_cast<long> (vcl_floor(indexGridRight[1]));
+        if (ul[0] < rightLargest.GetIndex()[0]) ul[0] = rightLargest.GetIndex()[0];
+        if (ul[1] < rightLargest.GetIndex()[1]) ul[1] = rightLargest.GetIndex()[1];
+        if (ul[0] > (unsigned int) (rightLargest.GetIndex()[0] + rightLargest.GetSize()[0] - 2)) ul[0] = (
+            rightLargest.GetIndex()[0] + rightLargest.GetSize()[0] - 2);
+        if (ul[1] > (unsigned int) (rightLargest.GetIndex()[1] + rightLargest.GetSize()[1] - 2)) ul[1] = (
+            rightLargest.GetIndex()[1] + rightLargest.GetSize()[1] - 2);
+
+        ur = ul;
+        ur[0] += 1;
+        ll = ul;
+        ll[1] += 1;
+        lr = ul;
+        lr[0] += 1;
+        lr[1] += 1;
+
+        rx = indexGridRight[0] - static_cast<double> (ul[0]);
+        ry = indexGridRight[1] - static_cast<double> (ul[1]);
+
+        PointType pointSensorRight = pointRight;
+
+        pointSensorRight[0] += (1. - ry) * ((1. - rx) * rightGrid->GetPixel(ul)[0] + rx * rightGrid->GetPixel(ur)[0]) +
+            ry * ((1. - rx) * rightGrid->GetPixel(ll)[0] + rx * rightGrid->GetPixel(lr)[0]);
+        pointSensorRight[1] += (1. - ry) * ((1. - rx) * rightGrid->GetPixel(ul)[1] + rx * rightGrid->GetPixel(ur)[1]) +
+            ry * ((1. - rx) * rightGrid->GetPixel(ll)[1] + rx * rightGrid->GetPixel(lr)[1]);
+
+        horizIter.Set(pointSensorRight[0] - pointSensor[0]);
+        vertiIter.Set(pointSensorRight[1] - pointSensor[1]);
+        }
+      else
+        {
+        horizIter.Set(m_NoDataValue);
+        vertiIter.Set(m_NoDataValue);
+        }
+        }
+      else
+        {
+        horizIter.Set(m_NoDataValue);
+        vertiIter.Set(m_NoDataValue);
+        }
+      ++horizIter;
+      ++vertiIter;
       }
-    
-    ++horizIter;
-    ++vertiIter;
-    }
+
+
 }
 
 
-- 
GitLab