[vtkusers] ICP and Transforms
Sean Richards
sean at millwood.ca
Thu Aug 12 10:58:49 EDT 2004
My problem is not that the transformation is not being applied, the problem is that the transformation is not being created. Even though I have added the planes as the source and target, the ICPTransform says that the inputs are null (due to the fact that they have no points). Do I actually have to create points from the surface of the planes in order to use vtkICPTransform? If this is the case, how would I create a point set from vtkPolyData?
Thanks!
Sean
> vtkICPTransform only calculates the optimal
> transform for mapping the
> source onto the target. It doesn't actually
> apply it to anything.
> Once you've hooked vtkICPTransform into your
> pipeline, you need to use
> vtkTransformFilter to actually apply it to a
> dataset (your source data
> usually). Since vtkICPTransform is a subclass
> of vtkTransform, you can
> set it as the transform for
> vtkTrnasformFilter. You don't need to call
> 'MakeTransform'.
> Attached is a demo (hit 'u' to iterate the
> source points towards their
> target).
> HTH
> Bryan
> On Thu, 2004-08-12 at 14:49, Sean Richards
> wrote:
> > Hello all! :)
> >
> > I am trying to use
> vtkIterativeClosestPointTransform, but seem to
> be having a hard time getting used to it. I
> started by trying to use regular planes to
> test the algorithm, but can't seem to get it
> to work. Below is the code and output I get
> when I execute the code. Any help would be
> very much appreciated.
> >
> > Thanks in advance!
> >
> > Sean
> >
> > ********************************************
> > **** THE CODE ****
> > ********************************************
> >
> > vtkPlaneSource *plane0 =
> vtkPlaneSource::New();
> > plane0->SetResolution(25, 25);
> > plane0->SetOrigin(-1,-1,0);
> > plane0->SetPoint1(1,-1,0);
> > plane0->SetPoint2(-1,1,0);
> >
> > vtkPlaneSource *plane1 =
> vtkPlaneSource::New();
> > plane1->SetResolution(25, 25);
> > plane1->SetOrigin(-1,-1,1);
> > plane1->SetPoint1(1,-1,1);
> > plane1->SetPoint2(-1,1,1);
> >
> > vtkIterativeClosestPointTransform *icp =
> vtkIterativeClosestPointTransform::New();
> >
> > icp->SetCheckMeanDistance(1);
> > icp->SetMaximumMeanDistance(0.001);
> > icp->SetMaximumNumberOfIterations(30);
> > icp->SetMaximumNumberOfLandmarks(50);
> >
> > icp->SetSource((vtkDataSet
> *)plane0->GetOutput());
> > icp->SetTarget((vtkDataSet
> *)plane1->GetOutput());
> >
> > // debug output
> > cout << "Number of Source Points: " <<
> icp->GetSource()->GetNumberOfPoints() << "\n";
> > cout << "Number of Target Points: " <<
> icp->GetTarget()->GetNumberOfPoints() << "\n";
> >
> > icp->Modified();
> > icp->Update();
> >
> > cout << "\n\nOutput from
> icp->PrintSelf(cout, 0);\n\n";
> > icp->PrintSelf(cout, 0);
> >
> > vtkAbstractTransform *transform =
> icp->MakeTransform();
> > cout << "\n\nOutput from
> transform->Print(cout);\n\n";
> > transform->Print(cout);
> >
> > ********************************************
> > **** THE OUTPUT ****
> > ********************************************
> >
> > ********
> > This output is in the vtkOutputWindow
> > ********
> >
> > ERROR: In
>
>
> \thesisroot\Vtk\Hybrid\vtkIterativeClosestPointTransform.cxx, line 271
> > vtkIterativeClosestPointTransform
> (00336E00): Can't execute with NULL or empty
> input
> >
> > ********
> > This output is in the console window
> > ********
> >
> > Number of Source Points: 0
> > Number of Target Points: 0
> >
> >
> > Output from icp->PrintSelf(cout, 0);
> >
> > Debug: Off
> > Modified Time: 50
> > Reference Count: 1
> > Registered Events: (none)
> > Inverse: (00000000)
> > Matrix: (00336F98)
> > Debug: Off
> > Modified Time: 41
> > Reference Count: 1
> > Registered Events: (none)
> > Elements:
> > 1 0 0 0
> > 0 1 0 0
> > 0 0 1 0
> > 0 0 0 1
> > Source: 00336238
> > Target: 00336998
> > Locator: (none)
> > MaximumNumberOfIterations: 30
> > CheckMeanDistance: 1
> > MeanDistanceMode: RMS
> > MaximumMeanDistance: 0.001
> > MaximumNumberOfLandmarks: 50
> > StartByMatchingCentroids: 0
> > NumberOfIterations: 0
> > MeanDistance: 0
> > LandmarkTransform:
> > Debug: Off
> > Modified Time: 42
> > Reference Count: 1
> > Registered Events: (none)
> > Inverse: (00000000)
> > Matrix: (00337208)
> > Debug: Off
> > Modified Time: 43
> > Reference Count: 1
> > Registered Events: (none)
> > Elements:
> > 1 0 0 0
> > 0 1 0 0
> > 0 0 1 0
> > 0 0 0 1
> > Mode: Similarity
> > SourceLandmarks: 00000000
> > TargetLandmarks: 00000000
> >
> >
> > Output from transform->Print(cout);
> >
> > vtkIterativeClosestPointTransform (00337568)
> > Debug: Off
> > Modified Time: 55
> > Reference Count: 1
> > Registered Events: (none)
> > Inverse: (00000000)
> > Matrix: (00337770)
> > Debug: Off
> > Modified Time: 54
> > Reference Count: 1
> > Registered Events: (none)
> > Elements:
> > 1 0 0 0
> > 0 1 0 0
> > 0 0 1 0
> > 0 0 0 1
> > Source: (none)
> > Target: (none)
> > Locator: (none)
> > MaximumNumberOfIterations: 50
> > CheckMeanDistance: 0
> > MeanDistanceMode: RMS
> > MaximumMeanDistance: 0.01
> > MaximumNumberOfLandmarks: 200
> > StartByMatchingCentroids: 0
> > NumberOfIterations: 0
> > MeanDistance: 0
> > LandmarkTransform:
> > Debug: Off
> > Modified Time: 55
> > Reference Count: 1
> > Registered Events: (none)
> > Inverse: (00000000)
> > Matrix: (003379E0)
> > Debug: Off
> > Modified Time: 56
> > Reference Count: 1
> > Registered Events: (none)
> > Elements:
> > 1 0 0 0
> > 0 1 0 0
> > 0 0 1 0
> > 0 0 0 1
> > Mode: Similarity
> > SourceLandmarks: 00000000
> > TargetLandmarks: 00000000
More information about the vtkusers
mailing list