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

Gaetan Lehmann gaetan.lehmann at gmail.com
Sat May 23 22:05:08 EDT 2015


Hi,

You should be able to see the test output by running

    ctest -R ITKRegistrationCommonKWStyleTest -V

This test only checks the coding style, so you should submit your changes
to gerrit even if you can't find what is wrong.

Regards,

Gaëtan



2015-05-22 11:34 GMT+02:00 Davis Vigneault <davis.vigneault at gmail.com>:

> 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
>>>>
>>>>
>>>
>>
>>
>
> _____________________________________
> 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/20150524/93743024/attachment.html>


More information about the Insight-users mailing list