18 #ifndef __otbSubPixelDisparityImageFilter_txx
19 #define __otbSubPixelDisparityImageFilter_txx
24 template <
class TInputImage,
class TOutputMetricImage,
25 class TDisparityImage,
class TMaskImage,
class TBlockMatchingFunctor>
26 SubPixelDisparityImageFilter<TInputImage,TOutputMetricImage,
27 TDisparityImage,TMaskImage,TBlockMatchingFunctor>
31 this->SetNumberOfInputs(7);
32 this->SetNumberOfRequiredInputs(3);
35 this->SetNumberOfOutputs(3);
36 this->SetNthOutput(0,TDisparityImage::New());
37 this->SetNthOutput(1,TDisparityImage::New());
38 this->SetNthOutput(2,TOutputMetricImage::New());
47 m_MinimumHorizontalDisparity = -10;
48 m_MaximumHorizontalDisparity = 10;
49 m_MinimumVerticalDisparity = 0;
50 m_MaximumVerticalDisparity = 0;
63 template <
class TInputImage,
class TOutputMetricImage,
64 class TDisparityImage,
class TMaskImage,
class TBlockMatchingFunctor>
66 TDisparityImage,TMaskImage,TBlockMatchingFunctor>
67 ::~SubPixelDisparityImageFilter()
70 template <
class TInputImage,
class TOutputMetricImage,
71 class TDisparityImage,
class TMaskImage,
class TBlockMatchingFunctor>
74 TDisparityImage,TMaskImage,TBlockMatchingFunctor>
75 ::SetLeftInput(
const TInputImage * image)
78 this->SetNthInput(0, const_cast<TInputImage *>( image ));
81 template <
class TInputImage,
class TOutputMetricImage,
82 class TDisparityImage,
class TMaskImage,
class TBlockMatchingFunctor>
85 TDisparityImage,TMaskImage,TBlockMatchingFunctor>
86 ::SetRightInput(
const TInputImage * image)
89 this->SetNthInput(1, const_cast<TInputImage *>( image ));
92 template <
class TInputImage,
class TOutputMetricImage,
93 class TDisparityImage,
class TMaskImage,
class TBlockMatchingFunctor>
96 TDisparityImage,TMaskImage,TBlockMatchingFunctor>
97 ::SetHorizontalDisparityInput(
const TDisparityImage * hfield)
100 this->SetNthInput(2, const_cast<TDisparityImage *>( hfield ));
103 template <
class TInputImage,
class TOutputMetricImage,
104 class TDisparityImage,
class TMaskImage,
class TBlockMatchingFunctor>
107 TDisparityImage,TMaskImage,TBlockMatchingFunctor>
108 ::SetVerticalDisparityInput(
const TDisparityImage * vfield)
111 this->SetNthInput(3, const_cast<TDisparityImage *>( vfield ));
114 template <
class TInputImage,
class TOutputMetricImage,
115 class TDisparityImage,
class TMaskImage,
class TBlockMatchingFunctor>
118 TDisparityImage,TMaskImage,TBlockMatchingFunctor>
119 ::SetLeftMaskInput(
const TMaskImage * image)
122 this->SetNthInput(4, const_cast<TMaskImage *>( image ));
125 template <
class TInputImage,
class TOutputMetricImage,
126 class TDisparityImage,
class TMaskImage,
class TBlockMatchingFunctor>
129 TDisparityImage,TMaskImage,TBlockMatchingFunctor>
130 ::SetRightMaskInput(
const TMaskImage * image)
133 this->SetNthInput(5, const_cast<TMaskImage *>( image ));
136 template <
class TInputImage,
class TOutputMetricImage,
137 class TDisparityImage,
class TMaskImage,
class TBlockMatchingFunctor>
140 TDisparityImage,TMaskImage,TBlockMatchingFunctor>
141 ::SetMetricInput(
const TOutputMetricImage * image)
144 this->SetNthInput(6, const_cast<TOutputMetricImage *>( image ));
147 template <
class TInputImage,
class TOutputMetricImage,
148 class TDisparityImage,
class TMaskImage,
class TBlockMatchingFunctor>
151 TDisparityImage,TMaskImage,TBlockMatchingFunctor>
152 ::GetLeftInput()
const
154 if (this->GetNumberOfInputs()<1)
161 template <
class TInputImage,
class TOutputMetricImage,
162 class TDisparityImage,
class TMaskImage,
class TBlockMatchingFunctor>
165 TDisparityImage,TMaskImage,TBlockMatchingFunctor>
166 ::GetRightInput()
const
168 if(this->GetNumberOfInputs()<2)
175 template <
class TInputImage,
class TOutputMetricImage,
176 class TDisparityImage,
class TMaskImage,
class TBlockMatchingFunctor>
177 const TDisparityImage *
179 TDisparityImage,TMaskImage,TBlockMatchingFunctor>
180 ::GetHorizontalDisparityInput()
const
182 if(this->GetNumberOfInputs()<3)
189 template <
class TInputImage,
class TOutputMetricImage,
190 class TDisparityImage,
class TMaskImage,
class TBlockMatchingFunctor>
191 const TDisparityImage *
193 TDisparityImage,TMaskImage,TBlockMatchingFunctor>
194 ::GetVerticalDisparityInput()
const
196 if(this->GetNumberOfInputs()<4)
203 template <
class TInputImage,
class TOutputMetricImage,
204 class TDisparityImage,
class TMaskImage,
class TBlockMatchingFunctor>
207 TDisparityImage,TMaskImage,TBlockMatchingFunctor>
208 ::GetLeftMaskInput()
const
210 if(this->GetNumberOfInputs()<5)
217 template <
class TInputImage,
class TOutputMetricImage,
218 class TDisparityImage,
class TMaskImage,
class TBlockMatchingFunctor>
221 TDisparityImage,TMaskImage,TBlockMatchingFunctor>
222 ::GetRightMaskInput()
const
224 if(this->GetNumberOfInputs()<6)
231 template <
class TInputImage,
class TOutputMetricImage,
232 class TDisparityImage,
class TMaskImage,
class TBlockMatchingFunctor>
233 const TDisparityImage *
235 TDisparityImage,TMaskImage,TBlockMatchingFunctor>
236 ::GetHorizontalDisparityOutput()
const
238 if (this->GetNumberOfOutputs()<1)
245 template <
class TInputImage,
class TOutputMetricImage,
246 class TDisparityImage,
class TMaskImage,
class TBlockMatchingFunctor>
249 TDisparityImage,TMaskImage,TBlockMatchingFunctor>
250 ::GetHorizontalDisparityOutput()
252 if (this->GetNumberOfOutputs()<1)
259 template <
class TInputImage,
class TOutputMetricImage,
260 class TDisparityImage,
class TMaskImage,
class TBlockMatchingFunctor>
261 const TDisparityImage *
263 TDisparityImage,TMaskImage,TBlockMatchingFunctor>
264 ::GetVerticalDisparityOutput()
const
266 if (this->GetNumberOfOutputs()<2)
273 template <
class TInputImage,
class TOutputMetricImage,
274 class TDisparityImage,
class TMaskImage,
class TBlockMatchingFunctor>
277 TDisparityImage,TMaskImage,TBlockMatchingFunctor>
278 ::GetVerticalDisparityOutput()
280 if (this->GetNumberOfOutputs()<2)
287 template <
class TInputImage,
class TOutputMetricImage,
288 class TDisparityImage,
class TMaskImage,
class TBlockMatchingFunctor>
289 const TOutputMetricImage *
291 TDisparityImage,TMaskImage,TBlockMatchingFunctor>
292 ::GetMetricOutput()
const
294 if (this->GetNumberOfOutputs()<3)
301 template <
class TInputImage,
class TOutputMetricImage,
302 class TDisparityImage,
class TMaskImage,
class TBlockMatchingFunctor>
305 TDisparityImage,TMaskImage,TBlockMatchingFunctor>
308 if (this->GetNumberOfOutputs()<3)
315 template <
class TInputImage,
class TOutputMetricImage,
316 class TDisparityImage,
class TMaskImage,
class TBlockMatchingFunctor>
319 TDisparityImage,TMaskImage,TBlockMatchingFunctor>
356 template <
class TInputImage,
class TOutputMetricImage,
357 class TDisparityImage,
class TMaskImage,
class TBlockMatchingFunctor>
360 TDisparityImage,TMaskImage,TBlockMatchingFunctor>
361 ::GenerateOutputInformation()
364 const TInputImage * inLeftPtr = this->GetLeftInput();
365 const TDisparityImage * inHDispPtr = this->GetHorizontalDisparityInput();
367 TOutputMetricImage * outMetricPtr = this->GetMetricOutput();
368 TDisparityImage * outHDispPtr = this->GetHorizontalDisparityOutput();
369 TDisparityImage * outVDispPtr = this->GetVerticalDisparityOutput();
373 itkExceptionMacro(<<
"Input horizontal disparity map is missing");
376 outMetricPtr->CopyInformation(inHDispPtr);
377 outHDispPtr->CopyInformation(inHDispPtr);
378 outVDispPtr->CopyInformation(inHDispPtr);
382 SpacingType dispSpacing = inHDispPtr->GetSpacing();
383 PointType leftOrigin = inLeftPtr->GetOrigin();
384 PointType dispOrigin = inHDispPtr->GetOrigin();
386 double ratioX = dispSpacing[0] / leftSpacing[0];
387 double ratioY = dispSpacing[1] / leftSpacing[1];
388 int stepX =
static_cast<int>(vcl_floor(ratioX + 0.5));
389 int stepY =
static_cast<int>(vcl_floor(ratioY + 0.5));
390 if (stepX < 1 || stepY < 1 || stepX != stepY)
392 itkExceptionMacro(<<
"Incompatible spacing values between disparity map and input image. Left spacing: "<<leftSpacing<<
", disparity spacing: "<< dispSpacing);
394 this->m_Step =
static_cast<unsigned int>(stepX);
396 double shiftX = (dispOrigin[0] - leftOrigin[0]) / leftSpacing[0];
397 double shiftY = (dispOrigin[1] - leftOrigin[1]) / leftSpacing[1];
399 this->m_GridIndex[0] =
static_cast<int>(vcl_floor(shiftX + 0.5));
400 this->m_GridIndex[1] =
static_cast<int>(vcl_floor(shiftY + 0.5));
403 template <
class TInputImage,
class TOutputMetricImage,
404 class TDisparityImage,
class TMaskImage,
class TBlockMatchingFunctor>
407 TDisparityImage,TMaskImage,TBlockMatchingFunctor>
408 ::GenerateInputRequestedRegion()
411 Superclass::GenerateInputRequestedRegion();
414 TInputImage * inLeftPtr =
const_cast<TInputImage *
>(this->GetLeftInput());
415 TInputImage * inRightPtr =
const_cast<TInputImage *
>(this->GetRightInput());
416 TMaskImage * inLeftMaskPtr =
const_cast<TMaskImage *
>(this->GetLeftMaskInput());
417 TMaskImage * inRightMaskPtr =
const_cast<TMaskImage *
>(this->GetRightMaskInput());
418 TDisparityImage * inHDispPtr =
const_cast<TDisparityImage *
>(this->GetHorizontalDisparityInput());
419 TDisparityImage * inVDispPtr =
const_cast<TDisparityImage *
>(this->GetVerticalDisparityInput());
421 TOutputMetricImage * outMetricPtr = this->GetMetricOutput();
422 TDisparityImage * outHDispPtr = this->GetHorizontalDisparityOutput();
423 TDisparityImage * outVDispPtr = this->GetVerticalDisparityOutput();
426 if(!inLeftPtr || !inRightPtr || !outMetricPtr || !outHDispPtr || !outVDispPtr)
432 if(inLeftPtr->GetLargestPossibleRegion()
433 != inRightPtr->GetLargestPossibleRegion())
435 itkExceptionMacro(<<
"Left and right images do not have the same size ! Left largest region: "<<inLeftPtr->GetLargestPossibleRegion()<<
", right largest region: "<<inRightPtr->GetLargestPossibleRegion());
439 if(inLeftMaskPtr && inLeftPtr->GetLargestPossibleRegion() != inLeftMaskPtr->GetLargestPossibleRegion())
441 itkExceptionMacro(<<
"Left and mask images do not have the same size ! Left largest region: "<<inLeftPtr->GetLargestPossibleRegion()<<
", mask largest region: "<<inLeftMaskPtr->GetLargestPossibleRegion());
445 if(inRightMaskPtr && inRightPtr->GetLargestPossibleRegion() != inRightMaskPtr->GetLargestPossibleRegion())
447 itkExceptionMacro(<<
"Right and mask images do not have the same size ! Right largest region: "<<inRightPtr->GetLargestPossibleRegion()<<
", mask largest region: "<<inRightMaskPtr->GetLargestPossibleRegion());
451 if (inHDispPtr && inVDispPtr && inHDispPtr->GetLargestPossibleRegion() != inVDispPtr->GetLargestPossibleRegion())
453 itkExceptionMacro(<<
"Initial horizontal and vertical disparity maps don't have the same size ! Horizontal disparity largest region: "<<inHDispPtr->GetLargestPossibleRegion()<<
", vertical disparity largest region: "<<inVDispPtr->GetLargestPossibleRegion());
458 RegionType outputRequestedRegion = outHDispPtr->GetRequestedRegion();
459 RegionType fullRequestedRegion = BlockMatchingFilterType::ConvertSubsampledToFullRegion(outputRequestedRegion, this->m_Step, this->m_GridIndex);
462 RegionType inputLeftRegion = fullRequestedRegion;
463 inputLeftRegion.PadByRadius(m_Radius);
466 IndexType rightRequestedRegionIndex = fullRequestedRegion.GetIndex();
467 rightRequestedRegionIndex[0]+=m_MinimumHorizontalDisparity;
468 rightRequestedRegionIndex[1]+=m_MinimumVerticalDisparity;
470 SizeType rightRequestedRegionSize = fullRequestedRegion.GetSize();
471 rightRequestedRegionSize[0]+= m_MaximumHorizontalDisparity - m_MinimumHorizontalDisparity;
472 rightRequestedRegionSize[1]+= m_MaximumVerticalDisparity - m_MinimumVerticalDisparity;
475 inputRightRegion.SetIndex(rightRequestedRegionIndex);
476 inputRightRegion.SetSize(rightRequestedRegionSize);
478 RegionType inputRightMaskRegion = inputRightRegion;
480 inputRightRegion.PadByRadius(m_Radius);
483 if ( inputLeftRegion.Crop(inLeftPtr->GetLargestPossibleRegion()))
485 inLeftPtr->SetRequestedRegion( inputLeftRegion );
492 inLeftPtr->SetRequestedRegion( inputLeftRegion );
496 std::ostringstream msg;
497 msg << this->GetNameOfClass()
498 <<
"::GenerateInputRequestedRegion()";
500 e.
SetDescription(
"Requested region is (at least partially) outside the largest possible region of left image.");
507 if ( inputRightRegion.Crop(inRightPtr->GetLargestPossibleRegion()))
509 inRightPtr->SetRequestedRegion( inputRightRegion );
510 inputRightMaskRegion.Crop(inRightPtr->GetLargestPossibleRegion());
516 inputRightRegion.SetIndex(inRightPtr->GetLargestPossibleRegion().GetIndex());
517 inputRightRegion.SetSize(0,0);
518 inputRightRegion.SetSize(1,0);
519 inRightPtr->SetRequestedRegion( inputRightRegion );
520 inputRightMaskRegion = inputRightRegion;
542 inLeftMaskPtr->SetRequestedRegion( fullRequestedRegion );
547 inRightMaskPtr->SetRequestedRegion( inputRightMaskRegion );
552 inHDispPtr->SetRequestedRegion( outputRequestedRegion );
557 inVDispPtr->SetRequestedRegion( outputRequestedRegion );
561 template <
class TInputImage,
class TOutputMetricImage,
562 class TDisparityImage,
class TMaskImage,
class TBlockMatchingFunctor>
565 TDisparityImage,TMaskImage,TBlockMatchingFunctor>
566 ::BeforeThreadedGenerateData()
568 TOutputMetricImage * outMetricPtr = this->GetMetricOutput();
569 TDisparityImage * outHDispPtr = this->GetHorizontalDisparityOutput();
570 TDisparityImage * outVDispPtr = this->GetVerticalDisparityOutput();
573 outMetricPtr->FillBuffer(0.);
574 outHDispPtr->FillBuffer(static_cast<DisparityPixelType>(m_MinimumHorizontalDisparity) /
575 static_cast<DisparityPixelType>(this->m_Step));
576 outVDispPtr->FillBuffer(static_cast<DisparityPixelType>(m_MinimumVerticalDisparity) /
577 static_cast<DisparityPixelType>(this->m_Step));
579 m_WrongExtrema.resize(this->GetNumberOfThreads());
582 template <
class TInputImage,
class TOutputMetricImage,
583 class TDisparityImage,
class TMaskImage,
class TBlockMatchingFunctor>
586 TDisparityImage,TMaskImage,TBlockMatchingFunctor>
587 ::ThreadedGenerateData(
const RegionType& outputRegionForThread,
int threadId)
590 switch(m_RefineMethod)
593 case 0 : ParabolicRefinement(outputRegionForThread, threadId);
597 case 1 : TriangularRefinement(outputRegionForThread, threadId);
601 case 2 : DichotomyRefinement(outputRegionForThread, threadId);
607 template <
class TInputImage,
class TOutputMetricImage,
608 class TDisparityImage,
class TMaskImage,
class TBlockMatchingFunctor>
611 TDisparityImage,TMaskImage,TBlockMatchingFunctor>
612 ::ParabolicRefinement(
const RegionType& outputRegionForThread,
int threadId)
615 const TInputImage * inLeftPtr = this->GetLeftInput();
616 const TInputImage * inRightPtr = this->GetRightInput();
617 const TMaskImage * inLeftMaskPtr = this->GetLeftMaskInput();
618 const TMaskImage * inRightMaskPtr = this->GetRightMaskInput();
619 const TDisparityImage * inHDispPtr = this->GetHorizontalDisparityInput();
620 const TDisparityImage * inVDispPtr = this->GetVerticalDisparityInput();
621 TOutputMetricImage * outMetricPtr = this->GetMetricOutput();
622 TDisparityImage * outHDispPtr = this->GetHorizontalDisparityOutput();
623 TDisparityImage * outVDispPtr = this->GetVerticalDisparityOutput();
625 unsigned int nb_WrongExtrema = 0;
631 RegionType fullRegionForThread = BlockMatchingFilterType::ConvertSubsampledToFullRegion(outputRegionForThread, this->m_Step, this->m_GridIndex);
642 bool useHorizontalDisparity =
false;
643 bool useVerticalDisparity =
false;
647 useHorizontalDisparity =
true;
653 useVerticalDisparity =
true;
663 RegionType rightBufferedRegion = inRightPtr->GetBufferedRegion();
666 RegionType inRightMaskRegion = inRightMaskPtr->GetBufferedRegion();
688 bool horizontalInterpolation =
false;
689 bool verticalInterpolation =
false;
698 double neighborsMetric[3][3] = {{0,0,0},{0,0,0},{0,0,0}};
707 if (((curLeftPos[0] - this->m_GridIndex[0] + this->m_Step) % this->m_Step == 0) &&
708 ((curLeftPos[1] - this->m_GridIndex[1] + this->m_Step) % this->m_Step == 0))
710 horizontalInterpolation =
false;
711 verticalInterpolation =
false;
714 if (useHorizontalDisparity)
716 hDisp_f =
static_cast<float>(inHDispIt.
Get()) * stepDisparity;
717 hDisp_i =
static_cast<int>(vcl_floor(hDisp_f + 0.5));
718 curRightPos[0] = curLeftPos[0] + hDisp_i;
723 curRightPos[0] = curLeftPos[0];
727 if (useVerticalDisparity)
729 vDisp_f =
static_cast<float>(inVDispIt.
Get()) * stepDisparity;
730 vDisp_i =
static_cast<int>(vcl_floor(vDisp_f + 0.5));
731 curRightPos[1] = curLeftPos[1] + vDisp_i;
736 curRightPos[1] = curLeftPos[1];
740 if (rightBufferedRegion.IsInside(curRightPos))
745 inRightMaskIt.
SetIndex(curRightPos);
748 if(!inLeftMaskPtr || (inLeftMaskPtr && inLeftMaskIt.
Get() > 0) )
750 if(!inRightMaskPtr || (inRightMaskPtr && inRightMaskIt.
Get() > 0) )
753 smallRightRegion.SetIndex(0,curRightPos[0]-1);
754 smallRightRegion.SetIndex(1,curRightPos[1]-1);
755 smallRightRegion.SetSize(0,3);
756 smallRightRegion.SetSize(1,3);
764 neighborsMetric[1][1] = m_Functor(leftIt,rightIt);
766 if (m_MinimumVerticalDisparity < vDisp_i && vDisp_i < m_MaximumVerticalDisparity)
772 if ( rightBufferedRegion.IsInside(upIndex) && rightBufferedRegion.IsInside(downIndex) )
775 neighborsMetric[1][0] = m_Functor(leftIt,rightIt);
778 neighborsMetric[1][2] = m_Functor(leftIt,rightIt);
783 if (neighborsMetric[1][1] < neighborsMetric[1][0] && neighborsMetric[1][1] < neighborsMetric[1][2])
785 verticalInterpolation =
true;
790 if (neighborsMetric[1][1] > neighborsMetric[1][0] && neighborsMetric[1][1] > neighborsMetric[1][2])
792 verticalInterpolation =
true;
798 if (m_MinimumHorizontalDisparity < hDisp_i && hDisp_i < m_MaximumHorizontalDisparity)
804 if ( rightBufferedRegion.IsInside(leftIndex) && rightBufferedRegion.IsInside(rightIndex) )
807 neighborsMetric[2][1] = m_Functor(leftIt,rightIt);
810 neighborsMetric[0][1] = m_Functor(leftIt,rightIt);
815 if (neighborsMetric[1][1] < neighborsMetric[0][1] && neighborsMetric[1][1] < neighborsMetric[2][1])
817 horizontalInterpolation =
true;
822 if (neighborsMetric[1][1] > neighborsMetric[0][1] && neighborsMetric[1][1] > neighborsMetric[2][1])
824 horizontalInterpolation =
true;
831 if (verticalInterpolation && horizontalInterpolation)
835 uprightIndex[1]+= (-1);
837 neighborsMetric[2][0] = m_Functor(leftIt,rightIt);
840 downrightIndex[0]+= 1;
841 downrightIndex[1]+= 1;
843 neighborsMetric[2][2] = m_Functor(leftIt,rightIt);
846 downleftIndex[0]+= (-1);
847 downleftIndex[1]+= 1;
849 neighborsMetric[0][2] = m_Functor(leftIt,rightIt);
852 upleftIndex[0]+= (-1);
853 upleftIndex[1]+= (-1);
855 neighborsMetric[0][0] = m_Functor(leftIt,rightIt);
860 if (neighborsMetric[1][1] > neighborsMetric[2][0] ||
861 neighborsMetric[1][1] > neighborsMetric[2][2] ||
862 neighborsMetric[1][1] > neighborsMetric[0][2] ||
863 neighborsMetric[1][1] > neighborsMetric[0][0])
865 verticalInterpolation =
false;
866 horizontalInterpolation =
false;
871 if (neighborsMetric[1][1] < neighborsMetric[2][0] ||
872 neighborsMetric[1][1] < neighborsMetric[2][2] ||
873 neighborsMetric[1][1] < neighborsMetric[0][2] ||
874 neighborsMetric[1][1] < neighborsMetric[0][0])
876 verticalInterpolation =
false;
877 horizontalInterpolation =
false;
886 if (verticalInterpolation && !horizontalInterpolation)
889 double deltaV = 0.5 - (1.0 /
890 (1.0 + (neighborsMetric[1][0]-neighborsMetric[1][1]) / (neighborsMetric[1][2]-neighborsMetric[1][1])));
891 if (deltaV > (-0.5) && deltaV < 0.5)
893 outVDispIt.
Set( (static_cast<double>(vDisp_i) + deltaV) * stepDisparityInv);
897 verticalInterpolation =
false;
900 else if (!verticalInterpolation && horizontalInterpolation)
903 double deltaH = 0.5 - (1.0 /
904 (1.0 + (neighborsMetric[0][1]-neighborsMetric[1][1]) / (neighborsMetric[2][1]-neighborsMetric[1][1])));
905 if (deltaH > (-0.5) && deltaH < 0.5)
907 outHDispIt.
Set( (static_cast<double>(hDisp_i) + deltaH) * stepDisparityInv);
911 horizontalInterpolation =
false;
914 else if (verticalInterpolation && horizontalInterpolation)
917 double dx = 0.5 * (neighborsMetric[2][1] - neighborsMetric[0][1]);
918 double dy = 0.5 * (neighborsMetric[1][2] - neighborsMetric[1][0]);
919 double dxx = neighborsMetric[2][1] + neighborsMetric[0][1] - 2.0 * neighborsMetric[1][1];
920 double dyy = neighborsMetric[1][2] + neighborsMetric[1][0] - 2.0 * neighborsMetric[1][1];
921 double dxy = 0.25*(neighborsMetric[2][2] + neighborsMetric[0][0] - neighborsMetric[0][2] - neighborsMetric[2][0]);
922 double det = dxx*dyy - dxy*dxy;
923 if (vcl_abs(det) < (1e-10))
925 verticalInterpolation =
false;
926 horizontalInterpolation =
false;
930 double deltaH = (-dx * dyy + dy * dxy )/det;
931 double deltaV = ( dx * dxy - dy * dxx )/det;
932 if (deltaH > (-1.0) && deltaH < 1.0 && deltaV > (-1.0) && deltaV < 1.0)
934 outHDispIt.
Set( (static_cast<double>(hDisp_i) + deltaH) * stepDisparityInv);
935 outVDispIt.
Set( (static_cast<double>(vDisp_i) + deltaV) * stepDisparityInv);
939 verticalInterpolation =
false;
940 horizontalInterpolation =
false;
945 if (!verticalInterpolation)
948 outVDispIt.
Set( static_cast<double>(vDisp_i) * stepDisparityInv);
951 if (!horizontalInterpolation)
954 outHDispIt.
Set( static_cast<double>(hDisp_i) * stepDisparityInv);
957 if (!verticalInterpolation && !horizontalInterpolation)
960 outMetricIt.
Set(static_cast<double>(neighborsMetric[1][1]));
965 typename TInputImage::Pointer fakeRightPtr = TInputImage::New();
966 fakeRightPtr->SetRegions(rightBufferedRegion);
967 fakeRightPtr->SetPixelContainer((const_cast<TInputImage*>(inRightPtr))->GetPixelContainer());
974 windowSize[0] = 2 * m_Radius[0] + 1;
975 windowSize[1] = 2 * m_Radius[1] + 1;
978 upleftCorner[0] = curRightPos[0] - m_Radius[0];
979 upleftCorner[1] = curRightPos[1] - m_Radius[1];
985 tinyShiftedRegion.SetSize(0, 1);
986 tinyShiftedRegion.SetSize(1, 1);
987 tinyShiftedRegion.SetIndex(0, curRightPos[0]);
988 tinyShiftedRegion.SetIndex(1, curRightPos[1]);
990 resampler = ResamplerFilterType::New();
991 resampler->SetInput(fakeRightPtr);
992 resampler->SetSize(windowSize);
993 resampler->SetNumberOfThreads(1);
994 resampler->SetTransform(transfo);
995 resampler->SetOutputStartIndex(upleftCorner);
997 offsetTransfo[0] = outHDispIt.
Get() * stepDisparity -
static_cast<double>(hDisp_i);
998 offsetTransfo[1] = outVDispIt.
Get() * stepDisparity -
static_cast<double>(vDisp_i);
999 transfo->SetOffset(offsetTransfo);
1000 resampler->Modified();
1001 resampler->Update();
1002 shiftedIt.
Initialize(m_Radius,resampler->GetOutput(),tinyShiftedRegion);
1003 outMetricIt.
Set(m_Functor(leftIt,shiftedIt));
1005 if ((outMetricIt.
Get() > neighborsMetric[1][1] && m_Minimize) ||
1006 (outMetricIt.
Get() < neighborsMetric[1][1] && !m_Minimize))
1012 progress.CompletedPixel();
1016 if (useHorizontalDisparity)
1020 if (useVerticalDisparity)
1034 m_WrongExtrema[threadId] =
static_cast<double>(nb_WrongExtrema) /
1035 static_cast<double>(outputRegionForThread.GetNumberOfPixels());
1039 template <
class TInputImage,
class TOutputMetricImage,
1040 class TDisparityImage,
class TMaskImage,
class TBlockMatchingFunctor>
1043 TDisparityImage,TMaskImage,TBlockMatchingFunctor>
1044 ::TriangularRefinement(
const RegionType& outputRegionForThread,
int threadId)
1047 const TInputImage * inLeftPtr = this->GetLeftInput();
1048 const TInputImage * inRightPtr = this->GetRightInput();
1049 const TMaskImage * inLeftMaskPtr = this->GetLeftMaskInput();
1050 const TMaskImage * inRightMaskPtr = this->GetRightMaskInput();
1051 const TDisparityImage * inHDispPtr = this->GetHorizontalDisparityInput();
1052 const TDisparityImage * inVDispPtr = this->GetVerticalDisparityInput();
1053 TOutputMetricImage * outMetricPtr = this->GetMetricOutput();
1054 TDisparityImage * outHDispPtr = this->GetHorizontalDisparityOutput();
1055 TDisparityImage * outVDispPtr = this->GetVerticalDisparityOutput();
1057 unsigned int nb_WrongExtrema = 0;
1063 RegionType fullRegionForThread = BlockMatchingFilterType::ConvertSubsampledToFullRegion(outputRegionForThread, this->m_Step, this->m_GridIndex);
1074 bool useHorizontalDisparity =
false;
1075 bool useVerticalDisparity =
false;
1079 useHorizontalDisparity =
true;
1085 useVerticalDisparity =
true;
1095 RegionType rightBufferedRegion = inRightPtr->GetBufferedRegion();
1098 RegionType inRightMaskRegion = inRightMaskPtr->GetBufferedRegion();
1120 bool horizontalInterpolation =
false;
1121 bool verticalInterpolation =
false;
1131 double neighborsMetric[3][3] = {{0,0,0},{0,0,0},{0,0,0}};
1140 if (((curLeftPos[0] - this->m_GridIndex[0] + this->m_Step) % this->m_Step == 0) &&
1141 ((curLeftPos[1] - this->m_GridIndex[1] + this->m_Step) % this->m_Step == 0))
1143 horizontalInterpolation =
false;
1144 verticalInterpolation =
false;
1147 if (useHorizontalDisparity)
1149 hDisp_f =
static_cast<float>(inHDispIt.
Get()) * stepDisparity;
1150 hDisp_i =
static_cast<int>(vcl_floor(hDisp_f + 0.5));
1151 curRightPos[0] = curLeftPos[0] + hDisp_i;
1156 curRightPos[0] = curLeftPos[0];
1160 if (useVerticalDisparity)
1162 vDisp_f =
static_cast<float>(inVDispIt.
Get()) * stepDisparity;
1163 vDisp_i =
static_cast<int>(vcl_floor(vDisp_f + 0.5));
1164 curRightPos[1] = curLeftPos[1] + vDisp_i;
1169 curRightPos[1] = curLeftPos[1];
1173 if (rightBufferedRegion.IsInside(curRightPos))
1178 inRightMaskIt.
SetIndex(curRightPos);
1181 if(!inLeftMaskPtr || (inLeftMaskPtr && inLeftMaskIt.
Get() > 0) )
1183 if(!inRightMaskPtr || (inRightMaskPtr && inRightMaskIt.
Get() > 0) )
1186 smallRightRegion.SetIndex(0,curRightPos[0]-1);
1187 smallRightRegion.SetIndex(1,curRightPos[1]-1);
1188 smallRightRegion.SetSize(0,3);
1189 smallRightRegion.SetSize(1,3);
1197 neighborsMetric[1][1] = m_Functor(leftIt,rightIt);
1199 if (m_MinimumVerticalDisparity < vDisp_i && vDisp_i < m_MaximumVerticalDisparity)
1205 if ( rightBufferedRegion.IsInside(upIndex) && rightBufferedRegion.IsInside(downIndex) )
1208 neighborsMetric[1][0] = m_Functor(leftIt,rightIt);
1211 neighborsMetric[1][2] = m_Functor(leftIt,rightIt);
1216 if (neighborsMetric[1][1] < neighborsMetric[1][0] && neighborsMetric[1][1] < neighborsMetric[1][2])
1218 verticalInterpolation =
true;
1223 if (neighborsMetric[1][1] > neighborsMetric[1][0] && neighborsMetric[1][1] > neighborsMetric[1][2])
1225 verticalInterpolation =
true;
1231 if (m_MinimumHorizontalDisparity < hDisp_i && hDisp_i < m_MaximumHorizontalDisparity)
1234 leftIndex[0]+= (-1);
1237 if ( rightBufferedRegion.IsInside(leftIndex) && rightBufferedRegion.IsInside(rightIndex) )
1240 neighborsMetric[2][1] = m_Functor(leftIt,rightIt);
1243 neighborsMetric[0][1] = m_Functor(leftIt,rightIt);
1248 if (neighborsMetric[1][1] < neighborsMetric[0][1] && neighborsMetric[1][1] < neighborsMetric[2][1])
1250 horizontalInterpolation =
true;
1255 if (neighborsMetric[1][1] > neighborsMetric[0][1] && neighborsMetric[1][1] > neighborsMetric[2][1])
1257 horizontalInterpolation =
true;
1264 if (verticalInterpolation && horizontalInterpolation)
1267 uprightIndex[0]+= 1;
1268 uprightIndex[1]+= (-1);
1270 neighborsMetric[2][0] = m_Functor(leftIt,rightIt);
1273 downrightIndex[0]+= 1;
1274 downrightIndex[1]+= 1;
1276 neighborsMetric[2][2] = m_Functor(leftIt,rightIt);
1279 downleftIndex[0]+= (-1);
1280 downleftIndex[1]+= 1;
1282 neighborsMetric[0][2] = m_Functor(leftIt,rightIt);
1285 upleftIndex[0]+= (-1);
1286 upleftIndex[1]+= (-1);
1288 neighborsMetric[0][0] = m_Functor(leftIt,rightIt);
1293 if (neighborsMetric[1][1] > neighborsMetric[2][0] ||
1294 neighborsMetric[1][1] > neighborsMetric[2][2] ||
1295 neighborsMetric[1][1] > neighborsMetric[0][2] ||
1296 neighborsMetric[1][1] > neighborsMetric[0][0])
1298 verticalInterpolation =
false;
1299 horizontalInterpolation =
false;
1304 if (neighborsMetric[1][1] < neighborsMetric[2][0] ||
1305 neighborsMetric[1][1] < neighborsMetric[2][2] ||
1306 neighborsMetric[1][1] < neighborsMetric[0][2] ||
1307 neighborsMetric[1][1] < neighborsMetric[0][0])
1309 verticalInterpolation =
false;
1310 horizontalInterpolation =
false;
1319 if (verticalInterpolation && !horizontalInterpolation)
1323 if ((neighborsMetric[1][0] < neighborsMetric[1][2] && m_Minimize) ||
1324 (neighborsMetric[1][0] > neighborsMetric[1][2] && !m_Minimize))
1326 deltaV = 0.5 * ((neighborsMetric[1][0]-neighborsMetric[1][2])/(neighborsMetric[1][2]-neighborsMetric[1][1]));
1330 deltaV = 0.5 * ((neighborsMetric[1][0]-neighborsMetric[1][2])/(neighborsMetric[1][0]-neighborsMetric[1][1]));
1332 if (deltaV > (-0.5) && deltaV < 0.5)
1334 outVDispIt.
Set( (static_cast<double>(vDisp_i) + deltaV) * stepDisparityInv);
1338 verticalInterpolation =
false;
1341 else if (!verticalInterpolation && horizontalInterpolation)
1345 if ((neighborsMetric[0][1] < neighborsMetric[2][1] && m_Minimize) ||
1346 (neighborsMetric[0][1] > neighborsMetric[2][1] && !m_Minimize))
1348 deltaH = 0.5 * ((neighborsMetric[0][1]-neighborsMetric[2][1])/(neighborsMetric[2][1]-neighborsMetric[1][1]));
1352 deltaH = 0.5 * ((neighborsMetric[0][1]-neighborsMetric[2][1])/(neighborsMetric[0][1]-neighborsMetric[1][1]));
1354 if (deltaH > (-0.5) && deltaH < 0.5)
1356 outHDispIt.
Set( (static_cast<double>(hDisp_i) + deltaH) * stepDisparityInv);
1360 horizontalInterpolation =
false;
1363 else if (verticalInterpolation && horizontalInterpolation)
1368 if ((neighborsMetric[1][0] < neighborsMetric[1][2] && m_Minimize) ||
1369 (neighborsMetric[1][0] > neighborsMetric[1][2] && !m_Minimize))
1371 deltaV = 0.5 * ((neighborsMetric[1][0]-neighborsMetric[1][2])/(neighborsMetric[1][2]-neighborsMetric[1][1]));
1375 deltaV = 0.5 * ((neighborsMetric[1][0]-neighborsMetric[1][2])/(neighborsMetric[1][0]-neighborsMetric[1][1]));
1378 if ((neighborsMetric[0][1] < neighborsMetric[2][1] && m_Minimize) ||
1379 (neighborsMetric[0][1] > neighborsMetric[2][1] && !m_Minimize))
1381 deltaH = 0.5 * ((neighborsMetric[0][1]-neighborsMetric[2][1])/(neighborsMetric[2][1]-neighborsMetric[1][1]));
1385 deltaH = 0.5 * ((neighborsMetric[0][1]-neighborsMetric[2][1])/(neighborsMetric[0][1]-neighborsMetric[1][1]));
1388 if (deltaV > (-1.0) && deltaV < 1.0 && deltaH > (-1.0) && deltaH < 1.0)
1390 outVDispIt.
Set( (static_cast<double>(vDisp_i) + deltaV) * stepDisparityInv);
1391 outHDispIt.
Set( (static_cast<double>(hDisp_i) + deltaH) * stepDisparityInv);
1395 verticalInterpolation =
false;
1396 horizontalInterpolation =
false;
1400 if (!verticalInterpolation)
1403 outVDispIt.
Set( static_cast<double>(vDisp_i) * stepDisparityInv);
1406 if (!horizontalInterpolation)
1409 outHDispIt.
Set( static_cast<double>(hDisp_i) * stepDisparityInv);
1412 if (!verticalInterpolation && !horizontalInterpolation)
1415 outMetricIt.
Set(static_cast<double>(neighborsMetric[1][1]));
1420 typename TInputImage::Pointer fakeRightPtr = TInputImage::New();
1421 fakeRightPtr->SetRegions(rightBufferedRegion);
1422 fakeRightPtr->SetPixelContainer((const_cast<TInputImage*>(inRightPtr))->GetPixelContainer());
1429 windowSize[0] = 2 * m_Radius[0] + 1;
1430 windowSize[1] = 2 * m_Radius[1] + 1;
1433 upleftCorner[0] = curRightPos[0] - m_Radius[0];
1434 upleftCorner[1] = curRightPos[1] - m_Radius[1];
1440 tinyShiftedRegion.SetSize(0, 1);
1441 tinyShiftedRegion.SetSize(1, 1);
1442 tinyShiftedRegion.SetIndex(0, curRightPos[0]);
1443 tinyShiftedRegion.SetIndex(1, curRightPos[1]);
1445 resampler = ResamplerFilterType::New();
1446 resampler->SetInput(fakeRightPtr);
1447 resampler->SetSize(windowSize);
1448 resampler->SetNumberOfThreads(1);
1449 resampler->SetTransform(transfo);
1450 resampler->SetOutputStartIndex(upleftCorner);
1452 offsetTransfo[0] = outHDispIt.
Get() * stepDisparity -
static_cast<double>(hDisp_i);
1453 offsetTransfo[1] = outVDispIt.
Get() * stepDisparity -
static_cast<double>(vDisp_i);
1454 transfo->SetOffset(offsetTransfo);
1455 resampler->Modified();
1456 resampler->Update();
1457 shiftedIt.
Initialize(m_Radius,resampler->GetOutput(),tinyShiftedRegion);
1458 outMetricIt.
Set(m_Functor(leftIt,shiftedIt));
1460 if ((outMetricIt.
Get() > neighborsMetric[1][1] && m_Minimize) ||
1461 (outMetricIt.
Get() < neighborsMetric[1][1] && !m_Minimize))
1467 progress.CompletedPixel();
1473 if (useHorizontalDisparity)
1477 if (useVerticalDisparity)
1490 m_WrongExtrema[threadId] =
static_cast<double>(nb_WrongExtrema) /
1491 static_cast<double>(outputRegionForThread.GetNumberOfPixels());
1494 template <
class TInputImage,
class TOutputMetricImage,
1495 class TDisparityImage,
class TMaskImage,
class TBlockMatchingFunctor>
1498 TDisparityImage,TMaskImage,TBlockMatchingFunctor>
1499 ::DichotomyRefinement(
const RegionType& outputRegionForThread,
int threadId)
1502 const TInputImage * inLeftPtr = this->GetLeftInput();
1503 const TInputImage * inRightPtr = this->GetRightInput();
1504 const TMaskImage * inLeftMaskPtr = this->GetLeftMaskInput();
1505 const TMaskImage * inRightMaskPtr = this->GetRightMaskInput();
1506 const TDisparityImage * inHDispPtr = this->GetHorizontalDisparityInput();
1507 const TDisparityImage * inVDispPtr = this->GetVerticalDisparityInput();
1508 TOutputMetricImage * outMetricPtr = this->GetMetricOutput();
1509 TDisparityImage * outHDispPtr = this->GetHorizontalDisparityOutput();
1510 TDisparityImage * outVDispPtr = this->GetVerticalDisparityOutput();
1512 unsigned int nb_WrongExtrema = 0;
1518 RegionType fullRegionForThread = BlockMatchingFilterType::ConvertSubsampledToFullRegion(outputRegionForThread, this->m_Step, this->m_GridIndex);
1529 bool useHorizontalDisparity =
false;
1530 bool useVerticalDisparity =
false;
1534 useHorizontalDisparity =
true;
1540 useVerticalDisparity =
true;
1550 RegionType rightBufferedRegion = inRightPtr->GetBufferedRegion();
1553 RegionType inRightMaskRegion = inRightMaskPtr->GetBufferedRegion();
1574 typename TInputImage::Pointer fakeRightPtr = TInputImage::New();
1575 fakeRightPtr->SetRegions(rightBufferedRegion);
1576 fakeRightPtr->SetPixelContainer((const_cast<TInputImage*>(inRightPtr))->GetPixelContainer());
1579 bool horizontalInterpolation =
false;
1580 bool verticalInterpolation =
false;
1583 double neighborsMetric[3][3] = {{0,0,0},{0,0,0},{0,0,0}};
1584 unsigned int nbIterMax = 10;
1590 windowSize[0] = 2 * m_Radius[0] + 1;
1591 windowSize[1] = 2 * m_Radius[1] + 1;
1595 offsetTransfo[0] = 0.0;
1596 offsetTransfo[1] = 0.0;
1605 tinyShiftedRegion.SetIndex(0, m_Radius[0]);
1606 tinyShiftedRegion.SetIndex(1, m_Radius[1]);
1607 tinyShiftedRegion.SetSize(0, 1);
1608 tinyShiftedRegion.SetSize(1, 1);
1617 bool centreHasMoved;
1626 if (((curLeftPos[0] - this->m_GridIndex[0] + this->m_Step) % this->m_Step == 0) &&
1627 ((curLeftPos[1] - this->m_GridIndex[1] + this->m_Step) % this->m_Step == 0))
1629 horizontalInterpolation =
false;
1630 verticalInterpolation =
false;
1633 if (useHorizontalDisparity)
1635 hDisp_f =
static_cast<float>(inHDispIt.
Get()) * stepDisparity;
1636 hDisp_i =
static_cast<int>(vcl_floor(hDisp_f + 0.5));
1637 curRightPos[0] = curLeftPos[0] + hDisp_i;
1642 curRightPos[0] = curLeftPos[0];
1646 if (useVerticalDisparity)
1648 vDisp_f =
static_cast<float>(inVDispIt.
Get()) * stepDisparity;
1649 vDisp_i =
static_cast<int>(vcl_floor(vDisp_f + 0.5));
1650 curRightPos[1] = curLeftPos[1] + vDisp_i;
1655 curRightPos[1] = curLeftPos[1];
1659 upleftCorner[0] = curRightPos[0] - m_Radius[0];
1660 upleftCorner[1] = curRightPos[1] - m_Radius[1];
1663 resampler = ResamplerFilterType::New();
1664 resampler->SetInput(fakeRightPtr);
1665 resampler->SetSize(windowSize);
1666 resampler->SetNumberOfThreads(1);
1667 resampler->SetTransform(transfo);
1668 resampler->SetOutputStartIndex(upleftCorner);
1670 tinyShiftedRegion.SetIndex(0, curRightPos[0]);
1671 tinyShiftedRegion.SetIndex(1, curRightPos[1]);
1674 if (rightBufferedRegion.IsInside(curRightPos))
1679 inRightMaskIt.
SetIndex(curRightPos);
1682 if(!inLeftMaskPtr || (inLeftMaskPtr && inLeftMaskIt.
Get() > 0) )
1684 if(!inRightMaskPtr || (inRightMaskPtr && inRightMaskIt.
Get() > 0) )
1687 smallRightRegion.SetIndex(0,curRightPos[0]-1);
1688 smallRightRegion.SetIndex(1,curRightPos[1]-1);
1689 smallRightRegion.SetSize(0,3);
1690 smallRightRegion.SetSize(1,3);
1692 rightIt.
Initialize(m_Radius,inRightPtr,smallRightRegion);
1696 neighborsMetric[1][1] = m_Functor(leftIt,rightIt);
1698 if (m_MinimumVerticalDisparity < vDisp_i && vDisp_i < m_MaximumVerticalDisparity)
1704 if ( rightBufferedRegion.IsInside(upIndex) && rightBufferedRegion.IsInside(downIndex) )
1707 neighborsMetric[1][0] = m_Functor(leftIt,rightIt);
1710 neighborsMetric[1][2] = m_Functor(leftIt,rightIt);
1715 if (neighborsMetric[1][1] < neighborsMetric[1][0] && neighborsMetric[1][1] < neighborsMetric[1][2])
1717 verticalInterpolation =
true;
1722 if (neighborsMetric[1][1] > neighborsMetric[1][0] && neighborsMetric[1][1] > neighborsMetric[1][2])
1724 verticalInterpolation =
true;
1730 if (m_MinimumHorizontalDisparity < hDisp_i && hDisp_i < m_MaximumHorizontalDisparity)
1733 leftIndex[0]+= (-1);
1736 if ( rightBufferedRegion.IsInside(leftIndex) && rightBufferedRegion.IsInside(rightIndex) )
1739 neighborsMetric[2][1] = m_Functor(leftIt,rightIt);
1742 neighborsMetric[0][1] = m_Functor(leftIt,rightIt);
1747 if (neighborsMetric[1][1] < neighborsMetric[0][1] && neighborsMetric[1][1] < neighborsMetric[2][1])
1749 horizontalInterpolation =
true;
1754 if (neighborsMetric[1][1] > neighborsMetric[0][1] && neighborsMetric[1][1] > neighborsMetric[2][1])
1756 horizontalInterpolation =
true;
1763 if (verticalInterpolation && horizontalInterpolation)
1766 uprightIndex[0]+= 1;
1767 uprightIndex[1]+= (-1);
1769 neighborsMetric[2][0] = m_Functor(leftIt,rightIt);
1772 downrightIndex[0]+= 1;
1773 downrightIndex[1]+= 1;
1775 neighborsMetric[2][2] = m_Functor(leftIt,rightIt);
1778 downleftIndex[0]+= (-1);
1779 downleftIndex[1]+= 1;
1781 neighborsMetric[0][2] = m_Functor(leftIt,rightIt);
1784 upleftIndex[0]+= (-1);
1785 upleftIndex[1]+= (-1);
1787 neighborsMetric[0][0] = m_Functor(leftIt,rightIt);
1792 if (neighborsMetric[1][1] > neighborsMetric[2][0] ||
1793 neighborsMetric[1][1] > neighborsMetric[2][2] ||
1794 neighborsMetric[1][1] > neighborsMetric[0][2] ||
1795 neighborsMetric[1][1] > neighborsMetric[0][0])
1797 verticalInterpolation =
false;
1798 horizontalInterpolation =
false;
1803 if (neighborsMetric[1][1] < neighborsMetric[2][0] ||
1804 neighborsMetric[1][1] < neighborsMetric[2][2] ||
1805 neighborsMetric[1][1] < neighborsMetric[0][2] ||
1806 neighborsMetric[1][1] < neighborsMetric[0][0])
1808 verticalInterpolation =
false;
1809 horizontalInterpolation =
false;
1818 if (verticalInterpolation && !horizontalInterpolation)
1820 double ya =
static_cast<double>(vDisp_i -1);
1821 double yb =
static_cast<double>(vDisp_i);
1822 double yc =
static_cast<double>(vDisp_i +1);
1823 double s_yb = neighborsMetric[1][1];
1828 offsetTransfo[0] = 0.0;
1830 for (
unsigned int k=0; k<nbIterMax; k++)
1832 if ( (yb-ya) < (yc-yb) )
1835 offsetTransfo[1] = yd -
static_cast<double>(vDisp_i);
1836 transfo->SetOffset(offsetTransfo);
1837 resampler->Modified();
1838 resampler->Update();
1839 shiftedIt.
Initialize(m_Radius,resampler->GetOutput(),tinyShiftedRegion);
1840 s_yd = m_Functor(leftIt,shiftedIt);
1842 if ((s_yd<s_yb && m_Minimize) || (s_yd>s_yb && !m_Minimize))
1857 offsetTransfo[1] = yd -
static_cast<double>(vDisp_i);
1858 transfo->SetOffset(offsetTransfo);
1859 resampler->Modified();
1860 resampler->Update();
1861 shiftedIt.
Initialize(m_Radius,resampler->GetOutput(),tinyShiftedRegion);
1862 s_yd = m_Functor(leftIt,shiftedIt);
1864 if ((s_yd<s_yb && m_Minimize) || (s_yd>s_yb && !m_Minimize))
1878 outVDispIt.
Set( yb * stepDisparityInv );
1879 outMetricIt.
Set( s_yb );
1881 else if (!verticalInterpolation && horizontalInterpolation)
1883 double xa =
static_cast<double>(hDisp_i -1);
1884 double xb =
static_cast<double>(hDisp_i);
1885 double xc =
static_cast<double>(hDisp_i +1);
1886 double s_xb = neighborsMetric[1][1];
1891 offsetTransfo[1] = 0.0;
1893 for (
unsigned int k=0; k<nbIterMax; k++)
1895 if ( (xb-xa) < (xc-xb) )
1898 offsetTransfo[0] = xd -
static_cast<double>(hDisp_i);
1899 transfo->SetOffset(offsetTransfo);
1900 resampler->Modified();
1901 resampler->Update();
1902 shiftedIt.
Initialize(m_Radius,resampler->GetOutput(),tinyShiftedRegion);
1903 s_xd = m_Functor(leftIt,shiftedIt);
1905 if ((s_xd<s_xb && m_Minimize) || (s_xd>s_xb && !m_Minimize))
1920 offsetTransfo[0] = xd -
static_cast<double>(hDisp_i);
1921 transfo->SetOffset(offsetTransfo);
1922 resampler->Modified();
1923 resampler->Update();
1924 shiftedIt.
Initialize(m_Radius,resampler->GetOutput(),tinyShiftedRegion);
1925 s_xd = m_Functor(leftIt,shiftedIt);
1927 if ((s_xd<s_xb && m_Minimize) || (s_xd>s_xb && !m_Minimize))
1941 outHDispIt.
Set( xb * stepDisparityInv );
1942 outMetricIt.
Set( s_xb );
1944 else if (verticalInterpolation && horizontalInterpolation)
1946 double xa =
static_cast<double>(hDisp_i);
1947 double ya =
static_cast<double>(vDisp_i - 1);
1948 double xb =
static_cast<double>(hDisp_i);
1949 double yb =
static_cast<double>(vDisp_i);
1950 double yc =
static_cast<double>(vDisp_i + 1);
1951 double xe =
static_cast<double>(hDisp_i - 1);
1952 double ye =
static_cast<double>(vDisp_i);
1953 double xf =
static_cast<double>(hDisp_i + 1);
1955 double s_b = neighborsMetric[1][1];
1961 for (
unsigned int k=0; k<nbIterMax; k++)
1964 centreHasMoved =
false;
1965 if ( (yb-ya) < (yc-yb) )
1968 offsetTransfo[0] = xd -
static_cast<double>(hDisp_i);
1969 offsetTransfo[1] = yd -
static_cast<double>(vDisp_i);
1970 transfo->SetOffset(offsetTransfo);
1971 resampler->Modified();
1972 resampler->Update();
1973 shiftedIt.
Initialize(m_Radius,resampler->GetOutput(),tinyShiftedRegion);
1974 s_d = m_Functor(leftIt,shiftedIt);
1976 if ((s_d<s_b && m_Minimize) || (s_d>s_b && !m_Minimize))
1978 centreHasMoved =
true;
1993 offsetTransfo[0] = xd -
static_cast<double>(hDisp_i);
1994 offsetTransfo[1] = yd -
static_cast<double>(vDisp_i);
1995 transfo->SetOffset(offsetTransfo);
1996 resampler->Modified();
1997 resampler->Update();
1998 shiftedIt.
Initialize(m_Radius,resampler->GetOutput(),tinyShiftedRegion);
1999 s_d = m_Functor(leftIt,shiftedIt);
2001 if ((s_d<s_b && m_Minimize) || (s_d>s_b && !m_Minimize))
2003 centreHasMoved =
true;
2020 offsetTransfo[0] = xe -
static_cast<double>(hDisp_i);
2021 offsetTransfo[1] = ye -
static_cast<double>(vDisp_i);
2022 transfo->SetOffset(offsetTransfo);
2023 resampler->Modified();
2024 resampler->Update();
2025 shiftedIt.
Initialize(m_Radius,resampler->GetOutput(),tinyShiftedRegion);
2028 offsetTransfo[0] = xf -
static_cast<double>(hDisp_i);
2029 transfo->SetOffset(offsetTransfo);
2030 resampler->Modified();
2031 resampler->Update();
2032 shiftedIt.
Initialize(m_Radius,resampler->GetOutput(),tinyShiftedRegion);
2036 centreHasMoved =
false;
2037 if ( (xb-xe) < (xf-xb) )
2040 offsetTransfo[0] = xd -
static_cast<double>(hDisp_i);
2041 offsetTransfo[1] = yd -
static_cast<double>(vDisp_i);
2042 transfo->SetOffset(offsetTransfo);
2043 resampler->Modified();
2044 resampler->Update();
2045 shiftedIt.
Initialize(m_Radius,resampler->GetOutput(),tinyShiftedRegion);
2046 s_d = m_Functor(leftIt,shiftedIt);
2048 if ((s_d<s_b && m_Minimize) || (s_d>s_b && !m_Minimize))
2050 centreHasMoved =
true;
2065 offsetTransfo[0] = xd -
static_cast<double>(hDisp_i);
2066 offsetTransfo[1] = yd -
static_cast<double>(vDisp_i);
2067 transfo->SetOffset(offsetTransfo);
2068 resampler->Modified();
2069 resampler->Update();
2070 shiftedIt.
Initialize(m_Radius,resampler->GetOutput(),tinyShiftedRegion);
2071 s_d = m_Functor(leftIt,shiftedIt);
2073 if ((s_d<s_b && m_Minimize) || (s_d>s_b && !m_Minimize))
2075 centreHasMoved =
true;
2092 offsetTransfo[0] = xa -
static_cast<double>(hDisp_i);
2093 offsetTransfo[1] = ya -
static_cast<double>(vDisp_i);
2094 transfo->SetOffset(offsetTransfo);
2095 resampler->Modified();
2096 resampler->Update();
2097 shiftedIt.
Initialize(m_Radius,resampler->GetOutput(),tinyShiftedRegion);
2099 offsetTransfo[1] = yc -
static_cast<double>(vDisp_i);
2100 transfo->SetOffset(offsetTransfo);
2101 resampler->Modified();
2102 resampler->Update();
2103 shiftedIt.
Initialize(m_Radius,resampler->GetOutput(),tinyShiftedRegion);
2108 outHDispIt.
Set( xb * stepDisparityInv);
2109 outVDispIt.
Set( yb * stepDisparityInv);
2110 outMetricIt.
Set( s_b );
2113 if (!verticalInterpolation)
2116 outVDispIt.
Set( static_cast<double>(vDisp_i) * stepDisparityInv);
2119 if (!horizontalInterpolation)
2122 outHDispIt.
Set( static_cast<double>(hDisp_i) * stepDisparityInv);
2125 if (!verticalInterpolation && !horizontalInterpolation)
2127 outMetricIt.
Set(static_cast<double>(neighborsMetric[1][1]));
2131 if ((outMetricIt.
Get() > neighborsMetric[1][1] && m_Minimize) ||
2132 (outMetricIt.
Get() < neighborsMetric[1][1] && !m_Minimize))
2139 progress.CompletedPixel();
2145 if (useHorizontalDisparity)
2149 if (useVerticalDisparity)
2162 m_WrongExtrema[threadId] =
static_cast<double>(nb_WrongExtrema) /
2163 static_cast<double>(outputRegionForThread.GetNumberOfPixels());
2166 template <
class TInputImage,
class TOutputMetricImage,
2167 class TDisparityImage,
class TMaskImage,
class TBlockMatchingFunctor>
2170 TDisparityImage,TMaskImage,TBlockMatchingFunctor>
2171 ::AfterThreadedGenerateData()
2173 double wrongExtremaPercent = 0;
2174 for (
unsigned int i=0; i<m_WrongExtrema.size(); i++)
2176 wrongExtremaPercent += m_WrongExtrema[i];
2178 wrongExtremaPercent /= m_WrongExtrema.size();