[ITK-users] EuclideanDistancePointMetric: Error when comparing Mesh to QuadEdgeMesh

Davis Vigneault davis.vigneault at gmail.com
Fri May 22 05:34:43 EDT 2015


I've put together a patch including a test which now passes.  However, when
I run ctest, the following test fails:

590 - ITKRegistrationCommonKWStyleTest (Failed)

However, the test doesn't output any information on what caused it to
fail.  I tried rerunning with the ctest option --output-on-failure, but no
additional output was given.  How can I find out why this test is failing,
and what I might do to fix it before submitting the patch?



On Thu, May 21, 2015 at 11:44 AM, Arnaud Gelas <arnaudgelas at gmail.com>
wrote:

> Hi Davis,
>
> Sounds like a bug to me (not an expert on the registration part though).
>
> You can definitively submit a patch on gerrit
>
> http://review.source.kitware.com
>
> In such a case, convert your examples into one test to be included and
> make sure your patch fixes this test and does not break the rest of the
> toolkit.
>
> Looking forward to seeing your patch on gerrit
>
> Best
> Arnaud
>
> On 21 May 2015, at 12:11, Davis Vigneault <davis.vigneault at gmail.com>
> wrote:
>
> An update: the problem here seems to be that itkPointSetToPointSetMetric
> only defines one iterator, which it uses on both the fixed and moving
> pointsets.  If I add fixed- and moving-specific iterators and change
> EuclideanDistancePointMetric accordingly, the original example compiles and
> gives the correct answer.  Is this, in fact, a bug?  If so, I'd be happy to
> attempt a patch.
>
> On Thu, May 21, 2015 at 10:43 AM, Davis Vigneault <
> davis.vigneault at gmail.com> wrote:
>
>> Thanks very much for the reply, Arnaud!  Yes, I had originally begin with
>> the v4 version, but ran into trouble when I tried to use it with
>> LevenbergMarquardtOptimizer.
>>
>> EuclideanDistancePointMetric inherits from MultipleValuedCostFunction,
>> wherease EuclideanDistancePointSetToPointSetMetricv4 inherits from
>> SingleValuedCostFunctionv4.  To the best that I can tell,
>> LevenbergMarquardtOptimizer expects its cost function to inherit from
>> MultipleValuedCostFunction.  I tried wrapping
>> EuclideanDistancePointSetToPointSetMetricv4 in an adapter class inheriting
>> from MultipleValuedCostFunction, where I returned 1 from
>> GetNumberOfValues() and wrapped the return of GetValue() in an itk::Array
>> length 1.  However, when I did this, I got a warning saying (if I remember
>> correctly) that there was a mismatch between the number of unknowns and
>> residuals.  I realized that wrapping a "new" cost function class in an
>> "old" cost function class was a hacky way to go about it in the first
>> place, so I abandoned this method a while ago.
>>
>> Is there a way to use the v4 version with LevenbergMarquardtOptimizer?
>> Is there a reason that the v3 EuclideanDistanceMetric is multiple valued,
>> whereas the v4 metric is single valued?  Is a v4 LevenbergOptimizer in
>> development, and will it be single valued or multiple valued?
>>
>> Apologies in advance if I've been going about this the wrong way--I've
>> been using ITK for a while, but am only just beginning to learn about
>> optimization/registration.
>>
>> On Thu, May 21, 2015 at 7:55 AM, Arnaud Gelas <arnaudgelas at gmail.com>
>> wrote:
>>
>>> Hi Davis,
>>>
>>> If you use the ITKv4 version of Metric, it compiles and works fine!
>>>
>>>>>>
>>> Here is the code
>>>
>>> #include "itkQuadEdgeMesh.h"
>>> #include "itkRegularSphereMeshSource.h"
>>> #include "itkEuclideanDistancePointSetToPointSetMetricv4.h"
>>> #include "itkIdentityTransform.h"
>>>
>>> typedef itk::Mesh< double, 3 > TFMesh; // If you change this to
>>> itk::QuadEdgeMesh, it works
>>> typedef itk::QuadEdgeMesh< double, 3 > TMMesh; // Or if you change this
>>> to itk::Mesh, it also works
>>> typedef itk::RegularSphereMeshSource< TFMesh > TFSource;
>>> typedef itk::RegularSphereMeshSource< TMMesh > TMSource;
>>> typedef itk::EuclideanDistancePointSetToPointSetMetricv4< TFMesh, TMMesh
>>> > TMetric;
>>> typedef itk::IdentityTransform< double, 3 > TIdentity;
>>>
>>> int main(int argc, char ** argv)
>>> {
>>>
>>>  TFSource::Pointer fixed = TFSource::New();
>>>  fixed->Update();
>>>
>>>  TMSource::Pointer moving = TMSource::New();
>>>  moving->Update();
>>>
>>>  TIdentity::Pointer identity = TIdentity::New();
>>>
>>>  TMetric::Pointer metric = TMetric::New();
>>>  metric->SetFixedPointSet( fixed->GetOutput() );
>>>  metric->SetMovingPointSet( moving->GetOutput() );
>>>  metric->SetTransform( identity );
>>>  std::cout << metric->GetValue() << std::endl;
>>>
>>>  return EXIT_SUCCESS;
>>>
>>> }
>>>
>>>
>>> > On 20 May 2015, at 18:04, DVigneault <davis.vigneault at gmail.com>
>>> wrote:
>>> >
>>> > All--
>>> >
>>> > I'm attempting to use itk::EuclideanDistancePointMetric to compare an
>>> > itk::Mesh to an itk::QuadEdgeMesh.  This works as expected if
>>> templated over
>>> > two meshes of the same type (i.e., itk::Mesh and itk::Mesh or
>>> > itk::QuadEdgeMesh and itk::QuadEdgeMesh).  However, if I attempt to
>>> mix the
>>> > two, and compare an itk::Mesh and an itk::QuadEdgeMesh, I get a build
>>> error,
>>> > copied below, along with a minimal example of the problem.
>>> >
>>> > I'm having some trouble decoding the error, but it looks to me as
>>> though the
>>> > filter is having trouble converting between iterator types.  Does this
>>> have
>>> > something to do with a difference between how itk::Mesh and
>>> > itk::QuadEdgeMesh define their iterators?
>>> >
>>> > Thank you in advance for your help!
>>> >
>>> > Best,
>>> >
>>> > --Davis
>>> >
>>> > #include "itkQuadEdgeMesh.h"
>>> > #include "itkRegularSphereMeshSource.h"
>>> > #include "itkEuclideanDistancePointMetric.h"
>>> > #include "itkIdentityTransform.h"
>>> >
>>> > typedef itk::Mesh< double, 3 > TFMesh; // If you change this to
>>> > itk::QuadEdgeMesh, it works
>>> > typedef itk::QuadEdgeMesh< double, 3 > TMMesh; // Or if you change
>>> this to
>>> > itk::Mesh, it also works
>>> > typedef itk::RegularSphereMeshSource< TFMesh > TFSource;
>>> > typedef itk::RegularSphereMeshSource< TMMesh > TMSource;
>>> > typedef itk::EuclideanDistancePointMetric< TFMesh, TMMesh > TMetric;
>>> > typedef itk::IdentityTransform< double, 3 > TIdentity;
>>> >
>>> > int main(int argc, char ** argv)
>>> > {
>>> >
>>> >  TFSource::Pointer fixed = TFSource::New();
>>> >  fixed->Update();
>>> >
>>> >  TMSource::Pointer moving = TMSource::New();
>>> >  moving->Update();
>>> >
>>> >  TIdentity::Pointer identity = TIdentity::New();
>>> >
>>> >  TMetric::Pointer metric = TMetric::New();
>>> >  metric->SetFixedPointSet( fixed->GetOutput() );
>>> >  metric->SetMovingPointSet( moving->GetOutput() );
>>> >  metric->SetTransform( identity );
>>> >  std::cout << metric->GetValue(identity->GetParameters()) << std::endl;
>>> >
>>> >  return EXIT_SUCCESS;
>>> >
>>> > }
>>> >
>>> >
>>> > $ make
>>> > Scanning dependencies of target AmoebaOptimization
>>> > [100%] Building CXX object
>>> > CMakeFiles/AmoebaOptimization.dir/AmoebaOptimization.cxx.o
>>> > In file included from
>>> > /usr/local/include/ITK-4.7/itkEuclideanDistancePointMetric.h:125:0,
>>> >                 from
>>> >
>>> /home/davis/Developer/oxford/Stebbing_Method/Test/src/AmoebaOptimization.cxx:3:
>>> > /usr/local/include/ITK-4.7/itkEuclideanDistancePointMetric.hxx: In
>>> > instantiation of ‘itk::EuclideanDistancePointMetric<TFixedPointSet,
>>> > TMovingPointSet, TDistanceMap>::MeasureType
>>> > itk::EuclideanDistancePointMetric<TFixedPointSet, TMovingPointSet,
>>> > TDistanceMap>::GetValue(const TransformParametersType&) const [with
>>> > TFixedPointSet = itk::Mesh<double, 3u>; TMovingPointSet =
>>> > itk::QuadEdgeMesh<double, 3u>; TDistanceMap = itk::Image<short
>>> unsigned int,
>>> > 3u>; itk::EuclideanDistancePointMetric<TFixedPointSet, TMovingPointSet,
>>> > TDistanceMap>::MeasureType = itk::Array<double>;
>>> > itk::EuclideanDistancePointMetric<TFixedPointSet, TMovingPointSet,
>>> > TDistanceMap>::TransformParametersType =
>>> itk::OptimizerParameters<double>]’:
>>> >
>>> /home/davis/Developer/oxford/Stebbing_Method/Test/src/AmoebaOptimization.cxx:28:58:
>>> > required from here
>>> > /usr/local/include/ITK-4.7/itkEuclideanDistancePointMetric.hxx:74:63:
>>> error:
>>> > conversion from ‘itk::MapContainer<long unsigned int,
>>> > itk::QuadEdgeMeshPoint<float, 3u, itk::GeometricalQuadEdge<long
>>> > unsigned int, long unsigned int, bool, bool, true> > >::ConstIterator’
>>> to
>>> > non-scalar type
>>> ‘itk::EuclideanDistancePointMetric<itk::Mesh<double, 3u>,
>>> > itk::QuadEdgeMesh<double, 3u> >::PointIterator {aka
>>> > itk::VectorContainer<long unsigned int, itk::Point<float, 3u>
>>> >> ::ConstIterator}’ requested
>>> >   PointIterator pointItr = movingPointSet->GetPoints()->Begin();
>>> >                                                               ^
>>> > /usr/local/include/ITK-4.7/itkEuclideanDistancePointMetric.hxx:75:61:
>>> error:
>>> > conversion from ‘itk::MapContainer<long unsigned int,
>>> > itk::QuadEdgeMeshPoint<float, 3u, itk::GeometricalQuadEdge<long
>>> > unsigned int, long unsigned int, bool, bool, true> > >::ConstIterator’
>>> to
>>> > non-scalar type
>>> ‘itk::EuclideanDistancePointMetric<itk::Mesh<double, 3u>,
>>> > itk::QuadEdgeMesh<double, 3u> >::PointIterator {aka
>>> > itk::VectorContainer<long unsigned int, itk::Point<float, 3u>
>>> >> ::ConstIterator}’ requested
>>> >   PointIterator pointEnd = movingPointSet->GetPoints()->End();
>>> >                                                             ^
>>> > make[2]: ***
>>> [CMakeFiles/AmoebaOptimization.dir/AmoebaOptimization.cxx.o]
>>> > Error 1
>>> > make[1]: *** [CMakeFiles/AmoebaOptimization.dir/all] Error 2
>>> > make: *** [all] Error 2
>>> >
>>> >
>>> >
>>> >
>>> > --
>>> > View this message in context:
>>> http://itk-insight-users.2283740.n2.nabble.com/EuclideanDistancePointMetric-Error-when-comparing-Mesh-to-QuadEdgeMesh-tp7587372.html
>>> > Sent from the ITK Insight Users mailing list archive at Nabble.com.
>>> > _____________________________________
>>> > 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
>>>
>>>
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/insight-users/attachments/20150522/4b7d40ba/attachment.html>


More information about the Insight-users mailing list