[prev in list] [next in list] [prev in thread] [next in thread] 

List:       insight-users
Subject:    Re: [ITK-users] bug in EuclideanDistancePointMetric
From:       Matt McCormick <matt.mccormick () kitware ! com>
Date:       2015-02-04 19:32:41
Message-ID: CALzTN-RpN9CpUYOJQ6KY6Pub05AN-h8TAJpFTT0MYMv8XcETtg () mail ! gmail ! com
[Download RAW message or body]

Hi Taylor, Marcel,

Yes this sounds like a bug, and the proposed solution looks good.

Please consider submitting a patch [1] that includes a new test that
does 3D-2D point set registration.

Thanks,
Matt

[1] https://insightsoftwareconsortium.github.io/ITKBarCamp-doc/CommunitySoftwareProcess/SubmitAPatchToGerrit/index.html


On Wed, Feb 4, 2015 at 2:22 PM, Taylor Braun-Jones
<taylor@braun-jones.org> wrote:
> Marcel Schenderlein <marcel.schenderlein@...> writes:
> > 
> > it seems to me as if there is a bug in itk::EuclideanDistancePointMetric
> > or at least a misconception. Correct me if I am wrong. I do not have the
> > full Insight into ITK yet
> > 
> > I came across this when I wanted to use this metric together with an
> > itk::Rigid3DPerspectiveTransform and the
> > itk::PointSetToPointSetRegistrationMethod to do 3D-2D point
> > registration. The bug will not be noticed when two point sets of the
> > same dimensionality would be used.
> > 
> > BUG:
> > -------
> > In the itk::EuclideanDistancePointMetric class there is a single
> > iterator type used for both FixedPointSet and MovingPointSet (typedef
> > typename Superclass::PointIterator PointIterator) in the method
> > GetValue(...) at lines 76,77
> > 
> > > PointIterator pointItr = movingPointSet->GetPoints()->Begin();
> > > PointIterator pointEnd = movingPointSet->GetPoints()->End();
> > 
> > and lines 118,119
> > 
> > > PointIterator pointItr2 = fixedPointSet->GetPoints()->Begin();
> > > PointIterator pointEnd2 = fixedPointSet->GetPoints()->End();
> > 
> > in itkEuclideanDistancePointMetric.txx. The problem that arises is that
> > if I use this metric with an itk::PointSet< double, 2 > as
> > FixedPointSetType and and itk::PointSet< double, 3 > as the
> > MovingPointSetType (as I would do for 3D-2D registration) then the
> > compiler complains about the lines 76,77 because PointIterator is
> > actually a FixedPointSetType::PointsContainer::ConstIterator (from
> > itk::PointSetToPointSetMetric). Note that the lines 118,119 work
> > perfectly but the naming of the iterator does not point to the type used.
> > I did the following to fix this:
> > 
> > FIX:
> > --------------------------------
> > I introduced two new iterators (itkEuclideanDistancePointMetric.h):
> > 
> > > typedef typename FixedPointSetType::PointsContainer::ConstIterator
> > FixedPointIterator;
> > > typedef typename MovingPointSetType::PointsContainer::ConstIterator
> > MovingPointIterator;
> > 
> > The iterator PointIterator is obsolete then.
> > 
> > I also had to change the distance map part of the template
> > declaration(?) (itkEuclideanDistancePointMetric.h). The dimension of the
> > distance map has to be of type TFixedPointSet instead of
> > TMovingPointSet, since the moving points are transformed (into the
> > FixedPointType) and then compared to the fixed points. So it is now:
> > 
> > > template < class TFixedPointSet, class TMovingPointSet,
> > > class TDistanceMap = ::itk::Image<unsigned short,
> > > > > itk::GetPointSetDimension<TFixedPointSet>::PointDimension> >
> > > class ITK_EXPORT EuclideanDistancePointMetric :
> > 
> > In the definition of GetValue(...) (itkEuclideanDistancePointMetric.txx)
> > I changed the lines 76,77 to
> > 
> > > MovingPointIterator pointItr = movingPointSet->GetPoints()->Begin();
> > > MovingPointIterator pointEnd = movingPointSet->GetPoints()->End();
> > 
> > and lines 118,119 to
> > 
> > > FixedPointIterator pointItr2 = fixedPointSet->GetPoints()->Begin();
> > > FixedPointIterator pointEnd2 = fixedPointSet->GetPoints()->End();
> > 
> > After that it compiles well and the registration seems to work. I have
> > not testet the fix with point sets of the same dimensionality but
> > looking at the code I see no reason why it should not still work this way.
> 
> 
> I'm looking at a current ITK master and see the same problem. Marcel's patch
> seems to work for me. Is it agreed that this is a bug and that Marcel's
> solution is the correct one?
> 
> Thanks,
> Taylor
> 
> _____________________________________
> Powered by www.kitware.com
> 
> Visit other Kitware open-source projects at
> http://www.kitware.com/opensource/opensource.html
> 
> Kitware offers ITK Training Courses, for more information visit:
> http://www.kitware.com/products/protraining.php
> 
> Please keep messages on-topic and check the ITK FAQ at:
> http://www.itk.org/Wiki/ITK_FAQ
> 
> Follow this link to subscribe/unsubscribe:
> http://public.kitware.com/mailman/listinfo/insight-users
> 
_____________________________________
Powered by www.kitware.com

Visit other Kitware open-source projects at
http://www.kitware.com/opensource/opensource.html

Kitware offers ITK Training Courses, for more information visit:
http://www.kitware.com/products/protraining.php

Please keep messages on-topic and check the ITK FAQ at:
http://www.itk.org/Wiki/ITK_FAQ

Follow this link to subscribe/unsubscribe:
http://public.kitware.com/mailman/listinfo/insight-users


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic