21 #ifndef otbPixelWiseBlockMatchingImageFilter_hxx
22 #define otbPixelWiseBlockMatchingImageFilter_hxx
25 #include "itkProgressReporter.h"
26 #include "itkConstantBoundaryCondition.h"
30 template <
class TInputImage,
class TOutputMetricImage,
class TOutputDisparityImage,
class TMaskImage,
class TBlockMatchingFunctor>
31 PixelWiseBlockMatchingImageFilter<TInputImage, TOutputMetricImage, TOutputDisparityImage, TMaskImage,
34 this->DynamicMultiThreadingOff();
36 this->SetNumberOfRequiredInputs(6);
37 this->SetNumberOfRequiredInputs(2);
40 this->SetNumberOfRequiredOutputs(3);
41 this->SetNthOutput(0, TOutputMetricImage::New());
42 this->SetNthOutput(1, TOutputDisparityImage::New());
43 this->SetNthOutput(2, TOutputDisparityImage::New());
52 m_MinimumHorizontalDisparity = -10;
53 m_MaximumHorizontalDisparity = 10;
54 m_MinimumVerticalDisparity = 0;
55 m_MaximumVerticalDisparity = 0;
58 m_InitHorizontalDisparity = 0;
59 m_InitVerticalDisparity = 0;
62 m_ExplorationRadius.Fill(0);
73 template <
class TInputImage,
class TOutputMetricImage,
class TOutputDisparityImage,
class TMaskImage,
class TBlockMatchingFunctor>
75 TBlockMatchingFunctor>::~PixelWiseBlockMatchingImageFilter()
80 template <
class TInputImage,
class TOutputMetricImage,
class TOutputDisparityImage,
class TMaskImage,
class TBlockMatchingFunctor>
82 const TInputImage* image)
85 this->SetNthInput(0,
const_cast<TInputImage*
>(image));
88 template <
class TInputImage,
class TOutputMetricImage,
class TOutputDisparityImage,
class TMaskImage,
class TBlockMatchingFunctor>
90 const TInputImage* image)
93 this->SetNthInput(1,
const_cast<TInputImage*
>(image));
96 template <
class TInputImage,
class TOutputMetricImage,
class TOutputDisparityImage,
class TMaskImage,
class TBlockMatchingFunctor>
98 const TMaskImage* image)
101 this->SetNthInput(2,
const_cast<TMaskImage*
>(image));
104 template <
class TInputImage,
class TOutputMetricImage,
class TOutputDisparityImage,
class TMaskImage,
class TBlockMatchingFunctor>
106 const TMaskImage* image)
109 this->SetNthInput(3,
const_cast<TMaskImage*
>(image));
112 template <
class TInputImage,
class TOutputMetricImage,
class TOutputDisparityImage,
class TMaskImage,
class TBlockMatchingFunctor>
116 if (this->GetNumberOfInputs() < 1)
120 return static_cast<const TInputImage*
>(this->itk::ProcessObject::GetInput(0));
123 template <
class TInputImage,
class TOutputMetricImage,
class TOutputDisparityImage,
class TMaskImage,
class TBlockMatchingFunctor>
127 if (this->GetNumberOfInputs() < 2)
131 return static_cast<const TInputImage*
>(this->itk::ProcessObject::GetInput(1));
134 template <
class TInputImage,
class TOutputMetricImage,
class TOutputDisparityImage,
class TMaskImage,
class TBlockMatchingFunctor>
138 if (this->GetNumberOfInputs() < 3)
142 return static_cast<const TMaskImage*
>(this->itk::ProcessObject::GetInput(2));
145 template <
class TInputImage,
class TOutputMetricImage,
class TOutputDisparityImage,
class TMaskImage,
class TBlockMatchingFunctor>
149 if (this->GetNumberOfInputs() < 4)
153 return static_cast<const TMaskImage*
>(this->itk::ProcessObject::GetInput(3));
156 template <
class TInputImage,
class TOutputMetricImage,
class TOutputDisparityImage,
class TMaskImage,
class TBlockMatchingFunctor>
157 const TOutputMetricImage*
160 if (this->GetNumberOfOutputs() < 1)
164 return static_cast<const TOutputMetricImage*
>(this->itk::ProcessObject::GetOutput(0));
167 template <
class TInputImage,
class TOutputMetricImage,
class TOutputDisparityImage,
class TMaskImage,
class TBlockMatchingFunctor>
171 if (this->GetNumberOfOutputs() < 1)
175 return static_cast<TOutputMetricImage*
>(this->itk::ProcessObject::GetOutput(0));
179 template <
class TInputImage,
class TOutputMetricImage,
class TOutputDisparityImage,
class TMaskImage,
class TBlockMatchingFunctor>
181 TBlockMatchingFunctor>::GetHorizontalDisparityOutput()
const
183 if (this->GetNumberOfOutputs() < 2)
187 return static_cast<const TOutputDisparityImage*
>(this->itk::ProcessObject::GetOutput(1));
190 template <
class TInputImage,
class TOutputMetricImage,
class TOutputDisparityImage,
class TMaskImage,
class TBlockMatchingFunctor>
191 TOutputDisparityImage*
194 if (this->GetNumberOfOutputs() < 2)
198 return static_cast<TOutputDisparityImage*
>(this->itk::ProcessObject::GetOutput(1));
201 template <
class TInputImage,
class TOutputMetricImage,
class TOutputDisparityImage,
class TMaskImage,
class TBlockMatchingFunctor>
202 const TOutputDisparityImage*
205 if (this->GetNumberOfOutputs() < 3)
209 return static_cast<const TOutputDisparityImage*
>(this->itk::ProcessObject::GetOutput(2));
212 template <
class TInputImage,
class TOutputMetricImage,
class TOutputDisparityImage,
class TMaskImage,
class TBlockMatchingFunctor>
213 TOutputDisparityImage*
216 if (this->GetNumberOfOutputs() < 3)
220 return static_cast<TOutputDisparityImage*
>(this->itk::ProcessObject::GetOutput(2));
223 template <
class TInputImage,
class TOutputMetricImage,
class TOutputDisparityImage,
class TMaskImage,
class TBlockMatchingFunctor>
225 const TOutputDisparityImage* hfield)
228 this->SetNthInput(4,
const_cast<TOutputDisparityImage*
>(hfield));
231 template <
class TInputImage,
class TOutputMetricImage,
class TOutputDisparityImage,
class TMaskImage,
class TBlockMatchingFunctor>
233 const TOutputDisparityImage* vfield)
236 this->SetNthInput(5,
const_cast<TOutputDisparityImage*
>(vfield));
239 template <
class TInputImage,
class TOutputMetricImage,
class TOutputDisparityImage,
class TMaskImage,
class TBlockMatchingFunctor>
241 TBlockMatchingFunctor>::GetHorizontalDisparityInput()
const
243 if (this->GetNumberOfInputs() < 5)
247 return static_cast<const TOutputDisparityImage*
>(this->itk::ProcessObject::GetInput(4));
250 template <
class TInputImage,
class TOutputMetricImage,
class TOutputDisparityImage,
class TMaskImage,
class TBlockMatchingFunctor>
251 const TOutputDisparityImage*
254 if (this->GetNumberOfInputs() < 6)
258 return static_cast<const TOutputDisparityImage*
>(this->itk::ProcessObject::GetInput(5));
261 template <
class TInputImage,
class TOutputMetricImage,
class TOutputDisparityImage,
class TMaskImage,
class TBlockMatchingFunctor>
265 Superclass::GenerateOutputInformation();
268 if (this->m_Step == 0)
270 this->m_GridIndex[0] = this->m_GridIndex[0] % this->m_Step;
271 this->m_GridIndex[1] = this->m_GridIndex[1] % this->m_Step;
274 const TInputImage* inLeftPtr = this->GetLeftInput();
276 RegionType outputLargest = this->ConvertFullToSubsampledRegion(inLeftPtr->GetLargestPossibleRegion(), this->m_Step, this->m_GridIndex);
278 TOutputMetricImage* outMetricPtr =
const_cast<TOutputMetricImage*
>(this->GetMetricOutput());
279 TOutputDisparityImage* outHDispPtr =
const_cast<TOutputDisparityImage*
>(this->GetHorizontalDisparityOutput());
280 TOutputDisparityImage* outVDispPtr =
const_cast<TOutputDisparityImage*
>(this->GetVerticalDisparityOutput());
282 outMetricPtr->SetLargestPossibleRegion(outputLargest);
283 outHDispPtr->SetLargestPossibleRegion(outputLargest);
284 outVDispPtr->SetLargestPossibleRegion(outputLargest);
287 SpacingType outSpacing = inLeftPtr->GetSignedSpacing();
288 outSpacing[0] *=
static_cast<double>(this->m_Step);
289 outSpacing[1] *=
static_cast<double>(this->m_Step);
291 outMetricPtr->SetSignedSpacing(outSpacing);
292 outHDispPtr->SetSignedSpacing(outSpacing);
293 outVDispPtr->SetSignedSpacing(outSpacing);
296 PointType outOrigin = inLeftPtr->GetOrigin();
297 SpacingType inSpacing = inLeftPtr->GetSignedSpacing();
298 outOrigin[0] += inSpacing[0] *
static_cast<double>(this->m_GridIndex[0]);
299 outOrigin[1] += inSpacing[1] *
static_cast<double>(this->m_GridIndex[1]);
301 outMetricPtr->SetOrigin(outOrigin);
302 outHDispPtr->SetOrigin(outOrigin);
303 outVDispPtr->SetOrigin(outOrigin);
306 template <
class TInputImage,
class TOutputMetricImage,
class TOutputDisparityImage,
class TMaskImage,
class TBlockMatchingFunctor>
308 TBlockMatchingFunctor>::GenerateInputRequestedRegion()
311 Superclass::GenerateInputRequestedRegion();
314 TInputImage* inLeftPtr =
const_cast<TInputImage*
>(this->GetLeftInput());
315 TInputImage* inRightPtr =
const_cast<TInputImage*
>(this->GetRightInput());
316 TMaskImage* inLeftMaskPtr =
const_cast<TMaskImage*
>(this->GetLeftMaskInput());
317 TMaskImage* inRightMaskPtr =
const_cast<TMaskImage*
>(this->GetRightMaskInput());
318 TOutputDisparityImage* inHDispPtr =
const_cast<TOutputDisparityImage*
>(this->GetHorizontalDisparityInput());
319 TOutputDisparityImage* inVDispPtr =
const_cast<TOutputDisparityImage*
>(this->GetVerticalDisparityInput());
321 TOutputMetricImage* outMetricPtr = this->GetMetricOutput();
322 TOutputDisparityImage* outHDispPtr = this->GetHorizontalDisparityOutput();
323 TOutputDisparityImage* outVDispPtr = this->GetVerticalDisparityOutput();
326 if (!inLeftPtr || !inRightPtr || !outMetricPtr || !outHDispPtr || !outVDispPtr)
332 if (inLeftPtr->GetLargestPossibleRegion() != inRightPtr->GetLargestPossibleRegion())
334 itkExceptionMacro(<<
"Left and right images do not have the same size ! Left largest region: " << inLeftPtr->GetLargestPossibleRegion()
335 <<
", right largest region: " << inRightPtr->GetLargestPossibleRegion());
339 if (inLeftMaskPtr && inLeftPtr->GetLargestPossibleRegion() != inLeftMaskPtr->GetLargestPossibleRegion())
341 itkExceptionMacro(<<
"Left and mask images do not have the same size ! Left largest region: " << inLeftPtr->GetLargestPossibleRegion()
342 <<
", mask largest region: " << inLeftMaskPtr->GetLargestPossibleRegion());
346 if (inRightMaskPtr && inRightPtr->GetLargestPossibleRegion() != inRightMaskPtr->GetLargestPossibleRegion())
348 itkExceptionMacro(<<
"Right and mask images do not have the same size ! Right largest region: " << inRightPtr->GetLargestPossibleRegion()
349 <<
", mask largest region: " << inRightMaskPtr->GetLargestPossibleRegion());
353 if (inHDispPtr && inLeftPtr->GetLargestPossibleRegion() != inHDispPtr->GetLargestPossibleRegion())
355 itkExceptionMacro(<<
"Left image and initial horizontal disparity map do not have the same size ! Left largest region: "
356 << inLeftPtr->GetLargestPossibleRegion() <<
", horizontal disparity largest region: " << inHDispPtr->GetLargestPossibleRegion());
358 if (inVDispPtr && inLeftPtr->GetLargestPossibleRegion() != inVDispPtr->GetLargestPossibleRegion())
360 itkExceptionMacro(<<
"Left image and initial vertical disparity map do not have the same size ! Left largest region: "
361 << inLeftPtr->GetLargestPossibleRegion() <<
", vertical disparity largest region: " << inVDispPtr->GetLargestPossibleRegion());
365 if (this->m_Step == 0)
367 this->m_GridIndex[0] = this->m_GridIndex[0] % this->m_Step;
368 this->m_GridIndex[1] = this->m_GridIndex[1] % this->m_Step;
372 RegionType inputLeftRegion = this->ConvertSubsampledToFullRegion(outMetricPtr->GetRequestedRegion(), this->m_Step, this->m_GridIndex);
375 inputLeftRegion.PadByRadius(m_Radius);
378 IndexType rightRequestedRegionIndex = inputLeftRegion.GetIndex();
379 rightRequestedRegionIndex[0] += m_MinimumHorizontalDisparity;
380 rightRequestedRegionIndex[1] += m_MinimumVerticalDisparity;
382 SizeType rightRequestedRegionSize = inputLeftRegion.GetSize();
383 rightRequestedRegionSize[0] += m_MaximumHorizontalDisparity - m_MinimumHorizontalDisparity;
384 rightRequestedRegionSize[1] += m_MaximumVerticalDisparity - m_MinimumVerticalDisparity;
387 inputRightRegion.SetIndex(rightRequestedRegionIndex);
388 inputRightRegion.SetSize(rightRequestedRegionSize);
391 if (inputLeftRegion.Crop(inLeftPtr->GetLargestPossibleRegion()))
393 inLeftPtr->SetRequestedRegion(inputLeftRegion);
400 inLeftPtr->SetRequestedRegion(inputLeftRegion);
403 itk::InvalidRequestedRegionError e(__FILE__, __LINE__);
404 std::ostringstream msg;
405 msg << this->GetNameOfClass() <<
"::GenerateInputRequestedRegion()";
406 e.SetLocation(msg.str());
407 e.SetDescription(
"Requested region is (at least partially) outside the largest possible region of left image.");
408 e.SetDataObject(inLeftPtr);
414 if (inputRightRegion.Crop(inRightPtr->GetLargestPossibleRegion()))
416 inRightPtr->SetRequestedRegion(inputRightRegion);
423 inRightPtr->SetRequestedRegion(inputRightRegion);
426 itk::InvalidRequestedRegionError e(__FILE__, __LINE__);
427 std::ostringstream msg;
428 msg << this->GetNameOfClass() <<
"::GenerateInputRequestedRegion()";
429 e.SetLocation(msg.str());
430 e.SetDescription(
"Requested region is (at least partially) outside the largest possible region of right image.");
431 e.SetDataObject(inRightPtr);
438 inLeftMaskPtr->SetRequestedRegion(inputLeftRegion);
444 inRightMaskPtr->SetRequestedRegion(inputRightRegion);
447 if (inHDispPtr && inVDispPtr)
449 inHDispPtr->SetRequestedRegion(inputLeftRegion);
450 inVDispPtr->SetRequestedRegion(inputLeftRegion);
453 template <
class TInputImage,
class TOutputMetricImage,
class TOutputDisparityImage,
class TMaskImage,
class TBlockMatchingFunctor>
456 TOutputMetricImage* outMetricPtr = this->GetMetricOutput();
457 TOutputDisparityImage* outHDispPtr = this->GetHorizontalDisparityOutput();
458 TOutputDisparityImage* outVDispPtr = this->GetVerticalDisparityOutput();
461 if (this->m_Step == 0)
463 this->m_GridIndex[0] = this->m_GridIndex[0] % this->m_Step;
464 this->m_GridIndex[1] = this->m_GridIndex[1] % this->m_Step;
467 outMetricPtr->FillBuffer(0.);
472 template <
class TInputImage,
class TOutputMetricImage,
class TOutputDisparityImage,
class TMaskImage,
class TBlockMatchingFunctor>
474 const RegionType& outputRegionForThread, itk::ThreadIdType threadId)
477 const TInputImage* inLeftPtr = this->GetLeftInput();
478 const TInputImage* inRightPtr = this->GetRightInput();
479 const TMaskImage* inLeftMaskPtr = this->GetLeftMaskInput();
480 const TMaskImage* inRightMaskPtr = this->GetRightMaskInput();
481 const TOutputDisparityImage* inHDispPtr = this->GetHorizontalDisparityInput();
482 const TOutputDisparityImage* inVDispPtr = this->GetVerticalDisparityInput();
483 TOutputMetricImage* outMetricPtr = this->GetMetricOutput();
484 TOutputDisparityImage* outHDispPtr = this->GetHorizontalDisparityOutput();
485 TOutputDisparityImage* outVDispPtr = this->GetVerticalDisparityOutput();
489 itk::ProgressReporter progress(
this, threadId, outputRegionForThread.GetNumberOfPixels() * (m_MaximumHorizontalDisparity - m_MinimumHorizontalDisparity + 1) *
490 (m_MaximumVerticalDisparity - m_MinimumVerticalDisparity + 1),
495 typename InputMaskImageType::Pointer initMaskPtr = InputMaskImageType::New();
496 initMaskPtr->SetRegions(outputRegionForThread);
497 initMaskPtr->Allocate();
498 initMaskPtr->FillBuffer(0);
501 RegionType fullRegionForThread = this->ConvertSubsampledToFullRegion(outputRegionForThread, this->m_Step, this->m_GridIndex);
504 bool useExplorationRadius =
false;
505 bool useInitDispMaps =
false;
506 if (m_ExplorationRadius[0] >= 1 || m_ExplorationRadius[1] >= 1)
508 useExplorationRadius =
true;
509 if (inHDispPtr && inVDispPtr)
511 useInitDispMaps =
true;
519 for (
int vdisparity = m_MinimumVerticalDisparity; vdisparity <= m_MaximumVerticalDisparity; ++vdisparity)
521 for (
int hdisparity = m_MinimumHorizontalDisparity; hdisparity <= m_MaximumHorizontalDisparity; ++hdisparity)
524 IndexType rightRequestedRegionIndex = fullRegionForThread.GetIndex();
525 rightRequestedRegionIndex[0] += hdisparity;
526 rightRequestedRegionIndex[1] += vdisparity;
530 inputRightRegion.SetIndex(rightRequestedRegionIndex);
531 inputRightRegion.SetSize(fullRegionForThread.GetSize());
532 inputRightRegion.Crop(inRightPtr->GetLargestPossibleRegion());
535 IndexType leftRequestedRegionIndex = inputRightRegion.GetIndex();
536 leftRequestedRegionIndex[0] -= hdisparity;
537 leftRequestedRegionIndex[1] -= vdisparity;
540 inputLeftRegion.SetIndex(leftRequestedRegionIndex);
541 inputLeftRegion.SetSize(inputRightRegion.GetSize());
544 RegionType outputRegion = this->ConvertFullToSubsampledRegion(inputLeftRegion, this->m_Step, this->m_GridIndex);
547 itk::ConstNeighborhoodIterator<TInputImage> leftIt(m_Radius, inLeftPtr, inputLeftRegion);
548 itk::ConstNeighborhoodIterator<TInputImage> rightIt(m_Radius, inRightPtr, inputRightRegion);
549 itk::ImageRegionIterator<TOutputMetricImage> outMetricIt(outMetricPtr, outputRegion);
550 itk::ImageRegionIterator<TOutputDisparityImage> outHDispIt(outHDispPtr, outputRegion);
551 itk::ImageRegionIterator<TOutputDisparityImage> outVDispIt(outVDispPtr, outputRegion);
552 itk::ImageRegionConstIterator<TMaskImage> inLeftMaskIt;
553 itk::ImageRegionConstIterator<TMaskImage> inRightMaskIt;
554 itk::ImageRegionConstIterator<TOutputDisparityImage> inHDispIt;
555 itk::ImageRegionConstIterator<TOutputDisparityImage> inVDispIt;
556 itk::ImageRegionIterator<TMaskImage> initIt(initMaskPtr, outputRegion);
558 itk::ConstantBoundaryCondition<TInputImage> nbc1;
559 itk::ConstantBoundaryCondition<TInputImage> nbc2;
561 leftIt.OverrideBoundaryCondition(&nbc1);
562 rightIt.OverrideBoundaryCondition(&nbc2);
567 inLeftMaskIt = itk::ImageRegionConstIterator<TMaskImage>(inLeftMaskPtr, inputLeftRegion);
568 inLeftMaskIt.GoToBegin();
572 inRightMaskIt = itk::ImageRegionConstIterator<TMaskImage>(inRightMaskPtr, inputRightRegion);
573 inRightMaskIt.GoToBegin();
579 inHDispIt = itk::ImageRegionConstIterator<TOutputDisparityImage>(inHDispPtr, inputLeftRegion);
580 inVDispIt = itk::ImageRegionConstIterator<TOutputDisparityImage>(inVDispPtr, inputLeftRegion);
581 inHDispIt.GoToBegin();
582 inVDispIt.GoToBegin();
588 outMetricIt.GoToBegin();
589 outHDispIt.GoToBegin();
590 outVDispIt.GoToBegin();
594 while (!leftIt.IsAtEnd() || !rightIt.IsAtEnd() || !outMetricIt.IsAtEnd() || !outHDispIt.IsAtEnd() || !outVDispIt.IsAtEnd() || !initIt.IsAtEnd())
597 IndexType tmpIndex = leftIt.GetIndex(leftIt.GetCenterNeighborhoodIndex());
598 if (((tmpIndex[0] - this->m_GridIndex[0] + this->m_Step) % this->m_Step == 0) &&
599 ((tmpIndex[1] - this->m_GridIndex[1] + this->m_Step) % this->m_Step == 0))
602 if (!inLeftMaskPtr || (inLeftMaskIt.Get() > 0))
604 if (!inRightMaskPtr || (inRightMaskIt.Get() > 0))
606 int estimatedMinHDisp = m_MinimumHorizontalDisparity;
607 int estimatedMinVDisp = m_MinimumVerticalDisparity;
608 int estimatedMaxHDisp = m_MaximumHorizontalDisparity;
609 int estimatedMaxVDisp = m_MaximumVerticalDisparity;
610 if (useExplorationRadius)
615 estimatedMinHDisp = inHDispIt.Get() - m_ExplorationRadius[0];
616 estimatedMinVDisp = inVDispIt.Get() - m_ExplorationRadius[1];
617 estimatedMaxHDisp = inHDispIt.Get() + m_ExplorationRadius[0];
618 estimatedMaxVDisp = inVDispIt.Get() + m_ExplorationRadius[1];
622 estimatedMinHDisp = m_InitHorizontalDisparity - m_ExplorationRadius[0];
623 estimatedMinVDisp = m_InitVerticalDisparity - m_ExplorationRadius[1];
624 estimatedMaxHDisp = m_InitHorizontalDisparity + m_ExplorationRadius[0];
625 estimatedMaxVDisp = m_InitVerticalDisparity + m_ExplorationRadius[1];
628 if (estimatedMinHDisp < m_MinimumHorizontalDisparity)
630 estimatedMinHDisp = m_MinimumHorizontalDisparity;
632 if (estimatedMinVDisp < m_MinimumVerticalDisparity)
634 estimatedMinVDisp = m_MinimumVerticalDisparity;
638 if (vdisparity >= estimatedMinVDisp && vdisparity <= estimatedMaxVDisp && hdisparity >= estimatedMinHDisp && hdisparity <= estimatedMaxHDisp)
641 double metric = m_Functor(leftIt, rightIt);
645 if (initIt.Get() == 0)
649 outMetricIt.Set(metric);
652 else if (m_Minimize && metric < outMetricIt.Get())
656 outMetricIt.Set(metric);
658 else if (!m_Minimize && metric > outMetricIt.Get())
662 outMetricIt.Set(metric);
671 progress.CompletedPixel();
696 template <
class TInputImage,
class TOutputMetricImage,
class TOutputDisparityImage,
class TMaskImage,
class TBlockMatchingFunctor>
702 shiftedFull[0] -= index[0];
703 shiftedFull[1] -= index[1];
706 subIndex[0] = (shiftedFull[0]) / step;
707 subIndex[1] = (shiftedFull[1]) / step;
708 if (shiftedFull[0] % step)
710 if (shiftedFull[1] % step)
713 if (shiftedFull[0] < 0)
715 if (shiftedFull[1] < 0)
719 subSize[0] = (full.GetSize(0) - (subIndex[0] * step) + shiftedFull[0]) / step;
720 subSize[1] = (full.GetSize(1) - (subIndex[1] * step) + shiftedFull[1]) / step;
722 if ((full.GetSize(0) - (subIndex[0] * step) + shiftedFull[0]) % step)
724 if ((full.GetSize(1) - (subIndex[1] * step) + shiftedFull[1]) % step)
728 subRegion.SetIndex(subIndex);
729 subRegion.SetSize(subSize);
733 template <
class TInputImage,
class TOutputMetricImage,
class TOutputDisparityImage,
class TMaskImage,
class TBlockMatchingFunctor>
739 fullIndex[0] = sub.GetIndex(0) * step + index[0];
740 fullIndex[1] = sub.GetIndex(1) * step + index[1];
743 fullSize[0] = sub.GetSize(0) * step;
744 fullSize[1] = sub.GetSize(1) * step;
746 fullSize[0] -= (step - 1);
748 fullSize[1] -= (step - 1);
751 fullRegion.SetIndex(fullIndex);
752 fullRegion.SetSize(fullSize);
Perform 2D block matching between two images.
static RegionType ConvertSubsampledToFullRegion(RegionType sub, unsigned int step, IndexType index)
void SetLeftMaskInput(const TMaskImage *image)
const TOutputDisparityImage * GetVerticalDisparityInput() const
const TInputImage * GetRightInput() const
const TInputImage * GetLeftInput() const
static RegionType ConvertFullToSubsampledRegion(RegionType full, unsigned int step, IndexType index)
const TMaskImage * GetLeftMaskInput() const
void SetHorizontalDisparityInput(const TOutputDisparityImage *hfield)
void BeforeThreadedGenerateData() override
void SetRightMaskInput(const TMaskImage *image)
const TMaskImage * GetRightMaskInput() const
const TOutputMetricImage * GetMetricOutput() const
InputImageType::PointType PointType
InputImageType::SizeType SizeType
OutputDisparityImageType::PixelType DisparityPixelType
const TOutputDisparityImage * GetHorizontalDisparityOutput() const
void GenerateOutputInformation() override
const TOutputDisparityImage * GetVerticalDisparityOutput() const
InputImageType::IndexType IndexType
InputImageType::SpacingType SpacingType
void SetLeftInput(const TInputImage *image)
InputImageType::RegionType RegionType
void ThreadedGenerateData(const RegionType &outputRegionForThread, itk::ThreadIdType threadId) override
void SetVerticalDisparityInput(const TOutputDisparityImage *vfield)
void SetRightInput(const TInputImage *image)
The "otb" namespace contains all Orfeo Toolbox (OTB) classes.