diff --git a/Applications/DisparityMap/otbPixelWiseBlockMatching.cxx b/Applications/DisparityMap/otbPixelWiseBlockMatching.cxx index 919ae74770943040289a24058ce93b8713011dab..6fd1fa60dc78e6a805325456dda092a02be894b3 100644 --- a/Applications/DisparityMap/otbPixelWiseBlockMatching.cxx +++ b/Applications/DisparityMap/otbPixelWiseBlockMatching.cxx @@ -108,10 +108,15 @@ private: AddParameter(ParameterType_OutputImage, "io.out", "The output disparity map"); SetParameterDescription("io.out","An image containing the estimated disparities as well as the metric values if the option is used"); - AddParameter(ParameterType_OutputImage, "io.outmask", "The output mask corresponding to all criterions"); - SetParameterDescription("io.outmask","A mask image corresponding to all citerions (see masking parameters). Only required if variance threshold or nodata criterions are set."); - DisableParameter("io.outmask"); - MandatoryOff("io.outmask"); + AddParameter(ParameterType_OutputImage, "io.outmaskleft", "The left output mask corresponding to all criterions"); + SetParameterDescription("io.outmaskleft","A left mask image corresponding to all citerions (see masking parameters). Only required if variance threshold or nodata criterions are set."); + DisableParameter("io.outmaskleft"); + MandatoryOff("io.outmaskleft"); + + AddParameter(ParameterType_OutputImage, "io.outmaskright", "The right output mask corresponding to all criterions"); + SetParameterDescription("io.outmaskright","A right mask image corresponding to all citerions (see masking parameters). Only required if variance threshold or nodata criterions are set."); + DisableParameter("io.outmaskright"); + MandatoryOff("io.outmaskright"); AddParameter(ParameterType_Empty,"io.outmetric","Output optimal metric values as well"); SetParameterDescription("io.outmetric","If used, the output image will have a second component with metric optimal values"); @@ -119,12 +124,16 @@ private: AddParameter(ParameterType_Group,"mask","Image masking parameters"); SetParameterDescription("mask","This group of parameters allows to determine the masking parameters to prevent disparities estimation for some pixels of the left image"); - AddParameter(ParameterType_InputImage,"mask.in","Discard pixels from mask image"); - SetParameterDescription("mask.in","This parameter allows to provide a custom mask"); - MandatoryOff("mask.in"); + AddParameter(ParameterType_InputImage,"mask.inleft","Discard left pixels from mask image"); + SetParameterDescription("mask.inleft","This parameter allows to provide a custom mask for the left image"); + MandatoryOff("mask.inleft"); + + AddParameter(ParameterType_InputImage,"mask.inright","Discard right pixels from mask image"); + SetParameterDescription("mask.inright","This parameter allows to provide a custom mask for the right image"); + MandatoryOff("mask.inright"); AddParameter(ParameterType_Float,"mask.nodata","Discard pixels with no-data value"); - SetParameterDescription("mask.in","This parameter allows to discard pixels whose value is equal to the user-defined no-data value."); + SetParameterDescription("mask.nodata","This parameter allows to discard pixels whose value is equal to the user-defined no-data value."); MandatoryOff("mask.nodata"); SetDefaultParameterFloat("mask.nodata",0.); DisableParameter("mask.nodata"); @@ -223,11 +232,13 @@ private: { if(IsParameterEnabled("mask.variancet") || IsParameterEnabled("mask.nodata")) { - EnableParameter("io.outmask"); + EnableParameter("io.outmaskleft"); + EnableParameter("io.outmaskright"); } else { - DisableParameter("io.outmask"); + DisableParameter("io.outmaskleft"); + DisableParameter("io.outmaskright"); } // enforce positive radii if (GetParameterInt("bm.radius") < 1) @@ -273,9 +284,9 @@ private: bool useInitialDispMap = false; // Handle input mask if present - if(IsParameterEnabled("mask.in")) + if(IsParameterEnabled("mask.inleft")) { - leftmask = GetParameterFloatImage("mask.in"); + leftmask = GetParameterFloatImage("mask.inleft"); m_BandMathFilter->SetNthInput(inputId,leftmask,"inmask"); masking = true; ++inputId; @@ -332,7 +343,7 @@ private: // Initial disparity map case if (GetParameterInt("bm.initdisp") == 2) { - if (GetParameterInt("bm.initdisp.map.hrad") > 0 && GetParameterInt("bm.initdisp.map.vrad") > 0) + if (GetParameterInt("bm.initdisp.maps.hrad") > 0 && GetParameterInt("bm.initdisp.maps.vrad") > 0) { useInitialDispMap = true; } @@ -352,9 +363,10 @@ private: m_SSDBlockMatcher->SetMaximumHorizontalDisparity(maxhdisp); m_SSDBlockMatcher->SetMinimumVerticalDisparity(minvdisp); m_SSDBlockMatcher->SetMaximumVerticalDisparity(maxvdisp); + AddProcess(m_SSDBlockMatcher,"SSD block matching"); if(masking) { - m_SSDBlockMatcher->SetMaskInput(m_BandMathFilter->GetOutput()); + m_SSDBlockMatcher->SetLeftMaskInput(m_BandMathFilter->GetOutput()); } if(useInitialDispUniform) { @@ -390,10 +402,11 @@ private: m_NCCBlockMatcher->SetMinimumVerticalDisparity(minvdisp); m_NCCBlockMatcher->SetMaximumVerticalDisparity(maxvdisp); m_NCCBlockMatcher->MinimizeOff(); + AddProcess(m_NCCBlockMatcher,"NCC block matching"); if(masking) { - m_NCCBlockMatcher->SetMaskInput(m_BandMathFilter->GetOutput()); + m_NCCBlockMatcher->SetLeftMaskInput(m_BandMathFilter->GetOutput()); } if(useInitialDispUniform) { @@ -407,11 +420,11 @@ private: if(useInitialDispMap) { FloatImageType::SizeType expRadius; - expRadius[0] = GetParameterInt("bm.initdisp.map.hrad"); - expRadius[1] = GetParameterInt("bm.initdisp.map.vrad"); + expRadius[0] = GetParameterInt("bm.initdisp.maps.hrad"); + expRadius[1] = GetParameterInt("bm.initdisp.maps.vrad"); m_NCCBlockMatcher->SetExplorationRadius(expRadius); - m_NCCBlockMatcher->SetHorizontalDisparityInput(GetParameterFloatImage("bm.initdisp.map.hmap")); - m_NCCBlockMatcher->SetVerticalDisparityInput(GetParameterFloatImage("bm.initdisp.map.vmap")); + m_NCCBlockMatcher->SetHorizontalDisparityInput(GetParameterFloatImage("bm.initdisp.maps.hmap")); + m_NCCBlockMatcher->SetVerticalDisparityInput(GetParameterFloatImage("bm.initdisp.maps.vmap")); } hdispImage = m_NCCBlockMatcher->GetHorizontalDisparityOutput(); @@ -434,9 +447,9 @@ private: SetParameterOutputImage("io.out",m_ImageListFilter->GetOutput()); - if(IsParameterEnabled("io.outmask")) + if(IsParameterEnabled("io.outmaskleft")) { - SetParameterOutputImage("io.outmask",m_BandMathFilter->GetOutput()); + SetParameterOutputImage("io.outmaskleft",m_BandMathFilter->GetOutput()); } } diff --git a/Code/DisparityMap/otbPixelWiseBlockMatchingImageFilter.h b/Code/DisparityMap/otbPixelWiseBlockMatchingImageFilter.h index 35b3ad05145151020c67b67ef4bdf0f3ae987bdc..14eb653bde1564c73017c5ba48e123d6d3a91395 100644 --- a/Code/DisparityMap/otbPixelWiseBlockMatchingImageFilter.h +++ b/Code/DisparityMap/otbPixelWiseBlockMatchingImageFilter.h @@ -201,12 +201,16 @@ public: void SetRightInput( const TInputImage * image); /** Set mask input (optional) */ - void SetMaskInput(const TMaskImage * image); + void SetLeftMaskInput(const TMaskImage * image); + + /** Set right mask input (optional) */ + void SetRightMaskInput(const TMaskImage * image); /** Get the inputs */ const TInputImage * GetLeftInput() const; const TInputImage * GetRightInput() const; - const TMaskImage * GetMaskInput() const; + const TMaskImage * GetLeftMaskInput() const; + const TMaskImage * GetRightMaskInput() const; /** Get the metric output */ const TOutputMetricImage * GetMetricOutput() const; diff --git a/Code/DisparityMap/otbPixelWiseBlockMatchingImageFilter.txx b/Code/DisparityMap/otbPixelWiseBlockMatchingImageFilter.txx index 87421374400bf2c85ad384b13d924b62f1ab71f4..6010e1dca66150f9ac3705f9c5f29ee9b32e95f4 100644 --- a/Code/DisparityMap/otbPixelWiseBlockMatchingImageFilter.txx +++ b/Code/DisparityMap/otbPixelWiseBlockMatchingImageFilter.txx @@ -33,7 +33,7 @@ TOutputDisparityImage,TMaskImage,TBlockMatchingFunctor> ::PixelWiseBlockMatchingImageFilter() { // Set the number of inputs - this->SetNumberOfInputs(5); + this->SetNumberOfInputs(6); this->SetNumberOfRequiredInputs(2); // Set the outputs @@ -98,12 +98,23 @@ class TOutputDisparityImage, class TMaskImage, class TBlockMatchingFunctor> void PixelWiseBlockMatchingImageFilter<TInputImage,TOutputMetricImage, TOutputDisparityImage,TMaskImage,TBlockMatchingFunctor> -::SetMaskInput(const TMaskImage * image) +::SetLeftMaskInput(const TMaskImage * image) { // Process object is not const-correct so the const casting is required. this->SetNthInput(2, const_cast<TMaskImage *>( image )); } +template <class TInputImage, class TOutputMetricImage, +class TOutputDisparityImage, class TMaskImage, class TBlockMatchingFunctor> +void +PixelWiseBlockMatchingImageFilter<TInputImage,TOutputMetricImage, +TOutputDisparityImage,TMaskImage,TBlockMatchingFunctor> +::SetRightMaskInput(const TMaskImage * image) +{ +// Process object is not const-correct so the const casting is required. + this->SetNthInput(3, const_cast<TMaskImage *>( image )); +} + template <class TInputImage, class TOutputMetricImage, class TOutputDisparityImage, class TMaskImage, class TBlockMatchingFunctor> const TInputImage * @@ -137,7 +148,7 @@ class TOutputDisparityImage, class TMaskImage, class TBlockMatchingFunctor> const TMaskImage * PixelWiseBlockMatchingImageFilter<TInputImage,TOutputMetricImage, TOutputDisparityImage,TMaskImage,TBlockMatchingFunctor> -::GetMaskInput() const +::GetLeftMaskInput() const { if(this->GetNumberOfInputs()<3) { @@ -146,6 +157,20 @@ TOutputDisparityImage,TMaskImage,TBlockMatchingFunctor> return static_cast<const TMaskImage *>(this->itk::ProcessObject::GetInput(2)); } +template <class TInputImage, class TOutputMetricImage, +class TOutputDisparityImage, class TMaskImage, class TBlockMatchingFunctor> +const TMaskImage * +PixelWiseBlockMatchingImageFilter<TInputImage,TOutputMetricImage, +TOutputDisparityImage,TMaskImage,TBlockMatchingFunctor> +::GetRightMaskInput() const +{ + if(this->GetNumberOfInputs()<4) + { + return 0; + } + return static_cast<const TMaskImage *>(this->itk::ProcessObject::GetInput(3)); +} + template <class TInputImage, class TOutputMetricImage, class TOutputDisparityImage, class TMaskImage, class TBlockMatchingFunctor> const TOutputMetricImage * @@ -239,7 +264,7 @@ TOutputDisparityImage,TMaskImage,TBlockMatchingFunctor> ::SetHorizontalDisparityInput( const TOutputDisparityImage * hfield) { // Process object is not const-correct so the const casting is required. - this->SetNthInput(3, const_cast<TOutputDisparityImage *>( hfield )); + this->SetNthInput(4, const_cast<TOutputDisparityImage *>( hfield )); } template <class TInputImage, class TOutputMetricImage, @@ -250,7 +275,7 @@ TOutputDisparityImage,TMaskImage,TBlockMatchingFunctor> ::SetVerticalDisparityInput( const TOutputDisparityImage * vfield) { // Process object is not const-correct so the const casting is required. - this->SetNthInput(4, const_cast<TOutputDisparityImage *>( vfield )); + this->SetNthInput(5, const_cast<TOutputDisparityImage *>( vfield )); } template <class TInputImage, class TOutputMetricImage, @@ -260,11 +285,11 @@ PixelWiseBlockMatchingImageFilter<TInputImage,TOutputMetricImage, TOutputDisparityImage,TMaskImage,TBlockMatchingFunctor> ::GetHorizontalDisparityInput() const { - if(this->GetNumberOfInputs()<4) + if(this->GetNumberOfInputs()<5) { return 0; } - return static_cast<const TOutputDisparityImage *>(this->itk::ProcessObject::GetInput(3)); + return static_cast<const TOutputDisparityImage *>(this->itk::ProcessObject::GetInput(4)); } template <class TInputImage, class TOutputMetricImage, @@ -274,11 +299,11 @@ PixelWiseBlockMatchingImageFilter<TInputImage,TOutputMetricImage, TOutputDisparityImage,TMaskImage,TBlockMatchingFunctor> ::GetVerticalDisparityInput() const { - if(this->GetNumberOfInputs()<5) + if(this->GetNumberOfInputs()<6) { return 0; } - return static_cast<const TOutputDisparityImage *>(this->itk::ProcessObject::GetInput(4)); + return static_cast<const TOutputDisparityImage *>(this->itk::ProcessObject::GetInput(5)); } @@ -295,7 +320,8 @@ TOutputDisparityImage,TMaskImage,TBlockMatchingFunctor> // Retrieve input pointers TInputImage * inLeftPtr = const_cast<TInputImage *>(this->GetLeftInput()); TInputImage * inRightPtr = const_cast<TInputImage *>(this->GetRightInput()); - TMaskImage * inMaskPtr = const_cast<TMaskImage * >(this->GetMaskInput()); + TMaskImage * inLeftMaskPtr = const_cast<TMaskImage * >(this->GetLeftMaskInput()); + TMaskImage * inRightMaskPtr = const_cast<TMaskImage * >(this->GetRightMaskInput()); TOutputDisparityImage * inHDispPtr = const_cast<TOutputDisparityImage * >(this->GetHorizontalDisparityInput()); TOutputDisparityImage * inVDispPtr = const_cast<TOutputDisparityImage * >(this->GetVerticalDisparityInput()); @@ -316,10 +342,16 @@ TOutputDisparityImage,TMaskImage,TBlockMatchingFunctor> itkExceptionMacro(<<"Left and right images do not have the same size ! Left largest region: "<<inLeftPtr->GetLargestPossibleRegion()<<", right largest region: "<<inRightPtr->GetLargestPossibleRegion()); } - // We also check that mask image has same size if present - if(inMaskPtr && inLeftPtr->GetLargestPossibleRegion() != inMaskPtr->GetLargestPossibleRegion()) + // We also check that left mask image has same size if present + if(inLeftMaskPtr && inLeftPtr->GetLargestPossibleRegion() != inLeftMaskPtr->GetLargestPossibleRegion()) + { + itkExceptionMacro(<<"Left and mask images do not have the same size ! Left largest region: "<<inLeftPtr->GetLargestPossibleRegion()<<", mask largest region: "<<inLeftMaskPtr->GetLargestPossibleRegion()); + } + + // We also check that right mask image has same size if present + if(inRightMaskPtr && inRightPtr->GetLargestPossibleRegion() != inRightMaskPtr->GetLargestPossibleRegion()) { - itkExceptionMacro(<<"Left and mask images do not have the same size ! Left largest region: "<<inLeftPtr->GetLargestPossibleRegion()<<", mask largest region: "<<inMaskPtr->GetLargestPossibleRegion()); + itkExceptionMacro(<<"Right and mask images do not have the same size ! Right largest region: "<<inRightPtr->GetLargestPossibleRegion()<<", mask largest region: "<<inRightMaskPtr->GetLargestPossibleRegion()); } // We check that the input initial disparity maps have the same size if present @@ -400,30 +432,16 @@ TOutputDisparityImage,TMaskImage,TBlockMatchingFunctor> throw e; } - if(inMaskPtr) + if(inLeftMaskPtr) { - // crop the mask region at the mask's largest possible region - if ( inputLeftRegion.Crop(inMaskPtr->GetLargestPossibleRegion())) - { - inMaskPtr->SetRequestedRegion( inputLeftRegion ); - } - else - { - // Couldn't crop the region (requested region is outside the largest - // possible region). Throw an exception. - // store what we tried to request (prior to trying to crop) - inMaskPtr->SetRequestedRegion( inputLeftRegion ); - - // build an exception - itk::InvalidRequestedRegionError e(__FILE__, __LINE__); - std::ostringstream msg; - msg << this->GetNameOfClass() - << "::GenerateInputRequestedRegion()"; - e.SetLocation(msg.str().c_str()); - e.SetDescription("Requested region is (at least partially) outside the largest possible region of mask image."); - e.SetDataObject(inMaskPtr); - throw e; - } + // no need to crop the mask region : left mask and left image have same largest possible region + inLeftMaskPtr->SetRequestedRegion( inputLeftRegion ); + } + + if(inRightMaskPtr) + { + // no need to crop the mask region : right mask and right image have same largest possible region + inRightMaskPtr->SetRequestedRegion( inputRightRegion ); } if (inHDispPtr && inVDispPtr) @@ -460,7 +478,8 @@ TOutputDisparityImage,TMaskImage,TBlockMatchingFunctor> // Retrieve pointers const TInputImage * inLeftPtr = this->GetLeftInput(); const TInputImage * inRightPtr = this->GetRightInput(); - const TMaskImage * inMaskPtr = this->GetMaskInput(); + const TMaskImage * inLeftMaskPtr = this->GetLeftMaskInput(); + const TMaskImage * inRightMaskPtr = this->GetRightMaskInput(); const TOutputDisparityImage * inHDispPtr = this->GetHorizontalDisparityInput(); const TOutputDisparityImage * inVDispPtr = this->GetVerticalDisparityInput(); TOutputMetricImage * outMetricPtr = this->GetMetricOutput(); @@ -469,7 +488,7 @@ TOutputDisparityImage,TMaskImage,TBlockMatchingFunctor> // Set-up progress reporting (this is not exact, since we do not // account for pixels that are out of range for a given disparity - itk::ProgressReporter progress(this, threadId, (m_MaximumHorizontalDisparity - m_MinimumHorizontalDisparity + 1)*(m_MaximumVerticalDisparity - m_MinimumVerticalDisparity + 1)); + itk::ProgressReporter progress(this, threadId, outputRegionForThread.GetNumberOfPixels()*(m_MaximumHorizontalDisparity - m_MinimumHorizontalDisparity + 1)*(m_MaximumVerticalDisparity - m_MinimumVerticalDisparity + 1),100); // Check if we use initial disparities and exploration radius @@ -518,7 +537,8 @@ TOutputDisparityImage,TMaskImage,TBlockMatchingFunctor> itk::ImageRegionIterator<TOutputMetricImage> outMetricIt(outMetricPtr,inputLeftRegion); itk::ImageRegionIterator<TOutputDisparityImage> outHDispIt(outHDispPtr,inputLeftRegion); itk::ImageRegionIterator<TOutputDisparityImage> outVDispIt(outVDispPtr,inputLeftRegion); - itk::ImageRegionConstIterator<TMaskImage> inMaskIt; + itk::ImageRegionConstIterator<TMaskImage> inLeftMaskIt; + itk::ImageRegionConstIterator<TMaskImage> inRightMaskIt; itk::ImageRegionConstIterator<TOutputDisparityImage> inHDispIt; itk::ImageRegionConstIterator<TOutputDisparityImage> inVDispIt; @@ -529,10 +549,15 @@ TOutputDisparityImage,TMaskImage,TBlockMatchingFunctor> rightIt.OverrideBoundaryCondition(&nbc2); // If we have a mask, define the iterator - if(inMaskPtr) + if(inLeftMaskPtr) { - inMaskIt = itk::ImageRegionConstIterator<TMaskImage>(inMaskPtr,inputLeftRegion); - inMaskIt.GoToBegin(); + inLeftMaskIt = itk::ImageRegionConstIterator<TMaskImage>(inLeftMaskPtr,inputLeftRegion); + inLeftMaskIt.GoToBegin(); + } + if(inRightMaskPtr) + { + inRightMaskIt = itk::ImageRegionConstIterator<TMaskImage>(inRightMaskPtr,inputRightRegion); + inRightMaskIt.GoToBegin(); } // If we use initial disparity maps, define the iterators @@ -560,64 +585,67 @@ TOutputDisparityImage,TMaskImage,TBlockMatchingFunctor> { // If the mask is present and valid - if(!inMaskPtr || (inMaskPtr && inMaskIt.Get() > 0) ) + if(!inLeftMaskPtr || (inLeftMaskPtr && inLeftMaskIt.Get() > 0) ) { - int estimatedMinHDisp = m_MinimumHorizontalDisparity; - int estimatedMinVDisp = m_MinimumVerticalDisparity; - int estimatedMaxHDisp = m_MaximumHorizontalDisparity; - int estimatedMaxVDisp = m_MaximumVerticalDisparity; - if (useExplorationRadius) + if(!inRightMaskPtr || (inRightMaskPtr && inRightMaskIt.Get() > 0) ) { - // compute disparity bounds from initial position and exploration radius - if (useInitDispMaps) - { - estimatedMinHDisp = inHDispIt.Get() - m_ExplorationRadius[0]; - estimatedMinVDisp = inVDispIt.Get() - m_ExplorationRadius[1]; - estimatedMaxHDisp = inHDispIt.Get() + m_ExplorationRadius[0]; - estimatedMaxVDisp = inVDispIt.Get() + m_ExplorationRadius[1]; - } - else + int estimatedMinHDisp = m_MinimumHorizontalDisparity; + int estimatedMinVDisp = m_MinimumVerticalDisparity; + int estimatedMaxHDisp = m_MaximumHorizontalDisparity; + int estimatedMaxVDisp = m_MaximumVerticalDisparity; + if (useExplorationRadius) { - estimatedMinHDisp = m_InitHorizontalDisparity - m_ExplorationRadius[0]; - estimatedMinVDisp = m_InitVerticalDisparity - m_ExplorationRadius[1]; - estimatedMaxHDisp = m_InitHorizontalDisparity + m_ExplorationRadius[0]; - estimatedMaxVDisp = m_InitVerticalDisparity + m_ExplorationRadius[1]; + // compute disparity bounds from initial position and exploration radius + if (useInitDispMaps) + { + estimatedMinHDisp = inHDispIt.Get() - m_ExplorationRadius[0]; + estimatedMinVDisp = inVDispIt.Get() - m_ExplorationRadius[1]; + estimatedMaxHDisp = inHDispIt.Get() + m_ExplorationRadius[0]; + estimatedMaxVDisp = inVDispIt.Get() + m_ExplorationRadius[1]; + } + else + { + estimatedMinHDisp = m_InitHorizontalDisparity - m_ExplorationRadius[0]; + estimatedMinVDisp = m_InitVerticalDisparity - m_ExplorationRadius[1]; + estimatedMaxHDisp = m_InitHorizontalDisparity + m_ExplorationRadius[0]; + estimatedMaxVDisp = m_InitVerticalDisparity + m_ExplorationRadius[1]; + } + // clamp to the minimum disparities + if (estimatedMinHDisp < m_MinimumHorizontalDisparity) + { + estimatedMinHDisp = m_MinimumHorizontalDisparity; + } + if (estimatedMinVDisp < m_MinimumVerticalDisparity) + { + estimatedMinVDisp = m_MinimumVerticalDisparity; + } } - // clamp to the minimum disparities - if (estimatedMinHDisp < m_MinimumHorizontalDisparity) + + if (vdisparity >= estimatedMinVDisp && vdisparity <= estimatedMaxVDisp && + hdisparity >= estimatedMinHDisp && hdisparity <= estimatedMaxHDisp) { - estimatedMinHDisp = m_MinimumHorizontalDisparity; - } - if (estimatedMinVDisp < m_MinimumVerticalDisparity) - { - estimatedMinVDisp = m_MinimumVerticalDisparity; - } - } - - if (vdisparity >= estimatedMinVDisp && vdisparity <= estimatedMaxVDisp && - hdisparity >= estimatedMinHDisp && hdisparity <= estimatedMaxHDisp) - { - // Compute the block matching value - double metric = m_Functor(leftIt,rightIt); - - // If we are at first loop, fill both outputs - if(vdisparity == estimatedMinVDisp && hdisparity == estimatedMinHDisp) - { - outHDispIt.Set(hdisparity); - outVDispIt.Set(vdisparity); - outMetricIt.Set(metric); - } - else if(m_Minimize && metric < outMetricIt.Get()) - { - outHDispIt.Set(hdisparity); - outVDispIt.Set(vdisparity); - outMetricIt.Set(metric); - } - else if(!m_Minimize && metric > outMetricIt.Get()) - { - outHDispIt.Set(hdisparity); - outVDispIt.Set(vdisparity); - outMetricIt.Set(metric); + // Compute the block matching value + double metric = bmFunctor(leftIt,rightIt); + + // If we are at first loop, fill both outputs + if(vdisparity == estimatedMinVDisp && hdisparity == estimatedMinHDisp) + { + outHDispIt.Set(hdisparity); + outVDispIt.Set(vdisparity); + outMetricIt.Set(metric); + } + else if(m_Minimize && metric < outMetricIt.Get()) + { + outHDispIt.Set(hdisparity); + outVDispIt.Set(vdisparity); + outMetricIt.Set(metric); + } + else if(!m_Minimize && metric > outMetricIt.Get()) + { + outHDispIt.Set(hdisparity); + outVDispIt.Set(vdisparity); + outMetricIt.Set(metric); + } } } } @@ -627,9 +655,14 @@ TOutputDisparityImage,TMaskImage,TBlockMatchingFunctor> ++outHDispIt; ++outVDispIt; - if(inMaskPtr) + if(inLeftMaskPtr) { - ++inMaskIt; + ++inLeftMaskIt; + } + + if(inRightMaskPtr) + { + ++inRightMaskIt; } if(useInitDispMaps) @@ -637,9 +670,9 @@ TOutputDisparityImage,TMaskImage,TBlockMatchingFunctor> ++inHDispIt; ++inVDispIt; } - + progress.CompletedPixel(); } - progress.CompletedPixel(); + } } } diff --git a/Testing/Code/DisparityMap/otbPixelWiseBlockMatchingImageFilter.cxx b/Testing/Code/DisparityMap/otbPixelWiseBlockMatchingImageFilter.cxx index 1dab53f8e2ec722bbce3ef4e07f546d6e83d8b02..8beac5f50fb4b10322d3e5da6f0e22a3644cde1c 100644 --- a/Testing/Code/DisparityMap/otbPixelWiseBlockMatchingImageFilter.cxx +++ b/Testing/Code/DisparityMap/otbPixelWiseBlockMatchingImageFilter.cxx @@ -60,7 +60,7 @@ int otbPixelWiseBlockMatchingImageFilter(int argc, char * argv[]) if(argc > 8) { maskReader->SetFileName(argv[8]); - bmFilter->SetMaskInput(maskReader->GetOutput()); + bmFilter->SetLeftMaskInput(maskReader->GetOutput()); } FloatWriterType::Pointer dispWriter = FloatWriterType::New(); @@ -104,7 +104,7 @@ int otbPixelWiseBlockMatchingImageFilterNCC(int argc, char * argv[]) if(argc > 8) { maskReader->SetFileName(argv[8]); - bmFilter->SetMaskInput(maskReader->GetOutput()); + bmFilter->SetLeftMaskInput(maskReader->GetOutput()); } FloatWriterType::Pointer dispWriter = FloatWriterType::New();