[ITK-users] EuclideanDistancePointMetric: Error when comparing Mesh to QuadEdgeMesh
Arnaud Gelas
arnaudgelas at gmail.com
Thu May 21 06:44:57 EDT 2015
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 <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 <mailto: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 <mailto: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 <mailto: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 <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 <http://www.kitware.com/>
> >
> > Visit other Kitware open-source projects at
> > http://www.kitware.com/opensource/opensource.html <http://www.kitware.com/opensource/opensource.html>
> >
> > Kitware offers ITK Training Courses, for more information visit:
> > http://www.kitware.com/products/protraining.php <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 <http://www.itk.org/Wiki/ITK_FAQ>
> >
> > Follow this link to subscribe/unsubscribe:
> > http://public.kitware.com/mailman/listinfo/insight-users <http://public.kitware.com/mailman/listinfo/insight-users>
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/insight-users/attachments/20150521/21ff516b/attachment-0001.html>
More information about the Insight-users
mailing list