[vtkusers] Iterative closest point transform for point clouds - need some help

Sylvain Jaume sylvain.jaume at kitware.com
Mon Nov 7 19:27:46 EST 2005


Hi Vikas,

For rendering the result of the ICP, you need:
vtkMaskPoints -> vtkTransformPolyDataFilter -> vtkPolyDataMapper -> 
vtkRenderer -> vtkRenderWindow

Alternatively, you could do:
vtkMaskPoints -> vtkTransformPolyDataFilter -> vtkPolyDataWriter
and use Paraview for the rendering. Then you can interactively increase 
the point size.

Cheers,
Sylvain

Sylvain Jaume wrote:

> Hi Vikas,
>
> You could try to create vertices with vtkMaskPoints before the ICP 
> filter:
>
> vtkMaskPoints *maskPoints = vtkMaskPoints::New();
> maskPoints->SetInput(polyData1);
> maskPoints->SetMaximumNumberOfPoints(numPoints);
> maskPoints->GenerateVerticesOn();
>
> You don't need to cast polyData1. Use vtkPolyDataMaper instead of 
> vtkDataSetMapper.
>
> Cheers,
> Sylvain
>
> Vikas Singh wrote:
>
>> Hi Sylvain:
>>
>> Unfortunately, that doesnt work.  I mentioned that in my email
>> (attached below) that if I do not do a delaunay triangulation and call
>> icpt directly as
>>
>> _icpt->SetSource(polydata_1);
>> _icpt->SetTarget(polydata_2);
>>
>> it gives me a segmentation fault and the following error message:
>> ERROR: In /usr/local/VTK/Filtering/vtkCellLocator.cxx, line 1190
>> vtkCellLocator (0x8093b88): No cells to subdivide.
>>
>> Same error message even if I typecast it.
>>
>> But If I do a Delaunay, I avoid the error message and seg fault.
>> However, after applying the transformation on the source cloud set, I
>> cannot see the point set when it renders it.
>> See partial code below:
>>
>> // Iterative Closest Point Transform
>>  vtkIterativeClosestPointTransform *_icpt =
>> vtkIterativeClosestPointTransform::New();
>>  _icpt->GetLandmarkTransform()->SetModeToRigidBody();
>>  _icpt->StartByMatchingCentroidsOn();
>>  _icpt->SetMaximumNumberOfIterations(100.);
>>
>> // del_1 and del_2 are the delaunay triangulations for first and
>> second point clouds.
>>  _icpt->SetSource((vtkDataSet *)del_1->GetOutput());
>>  cout << "Calling icpt" << endl;
>>  _icpt->SetTarget((vtkDataSet *)del_2->GetOutput());
>>
>>  _icpt->Update();
>>
>>  cout << "done icpt" << endl;
>>
>>  // Now lets tranform the data
>>  vtkTransformPolyDataFilter* transformer = 
>> vtkTransformPolyDataFilter::New();
>>  transformer->SetTransform(_icpt);
>>
>>  transformer->SetInput((vtkPolyData*)polydata_1);
>>  transformer->Update();
>>  transformer->PrintSelf(std::cout,0);
>>
>>  // map for displaying
>>
>>  vtkDataSetMapper *surface_mapper_1 = vtkDataSetMapper::New();
>>
>>  //surface_mapper_1->SetInput((vtkDataSet*)del_1->GetOutput());
>>  // if i do this ^^^^^^^^^^^^^ it shows the untransformed first point 
>> cloud
>>  // and the one below does not show anything (I want it to show the
>>  // the transformed (aligned) point cloud
>>  surface_mapper_1->SetInput(transformer->GetOutput());
>>
>>  vtkDataSetMapper *surface_mapper_2 = vtkDataSetMapper::New();
>>  surface_mapper_2->SetInput((vtkDataSet*)_icpt->GetTarget());
>>
>>  // Create an actor for cloud 1.
>>  vtkActor* actor_1 = vtkActor::New();
>>  actor_1->SetMapper(surface_mapper_1);
>>  actor_1->GetProperty()->SetRepresentationToPoints();
>>  actor_1->GetProperty()->SetColor(1,1,1);
>>
>>  // create an actor for cloud 2
>>  vtkActor* actor_2 = vtkActor::New();
>>  actor_2->SetMapper(surface_mapper_2);
>>  actor_2->GetProperty()->SetRepresentationToPoints();
>>  actor_2->GetProperty()->SetColor(0,1,1);
>>
>> ......and then the rendering part.
>>
>>
>> Any suggestions ?
>>
>> --Vikas
>>
>>
>> On 11/7/05, Sylvain Jaume <sylvain.jaume at kitware.com> wrote:
>>  
>>
>>> Hi Vikas,
>>>
>>> vtkIterativeClosestPointTransform gives a transform. You need to apply
>>> the resulting transform to your input dataset using
>>> vtkTransformPolyDataFilter. You don't need to use vtkDelaunay3D, nor to
>>> type cast your datasets.
>>>
>>> Cheers,
>>> Sylvain
>>>
>>> Vikas Singh wrote:
>>>
>>>   
>>>
>>>> Hello!
>>>>
>>>> I am a newbie to VTK and need some help with ICPT. Been trying all
>>>> sorts of things since today morning including the VTK User's guide and
>>>> the online documentation but nothing has worked so far. Seems to me
>>>> that the problem is simple for someone who knows VTK well.
>>>>
>>>> I am trying to randomly generate point clouds and align them (as a 
>>>> start).
>>>>
>>>> vtkPolyData* polydata_1 = vtkPolyData::New();
>>>> vtkDelaunay3D* del_1    = vtkDelaunay3D::New();
>>>> vtkPoints* cloud_1         = vtkPoints::New();
>>>>
>>>> static float mypoint_1[3];
>>>>
>>>> for (int i = 0; i < 50; i++)
>>>>   {
>>>>     mypoint_1[0] = drand48()*50;
>>>>     mypoint_1[1] = drand48()*50;
>>>>     mypoint_1[2] = drand48()*50;
>>>>
>>>>     cloud_1->InsertNextPoint(mypoint_1);
>>>>   }
>>>>
>>>> polydata_1->SetPoints(cloud_1);
>>>>
>>>> int num_of_points_1 = polydata_1->GetPoints()->GetNumberOfPoints();
>>>> cout << "in all, num of points in cloud 1 is " << num_of_points_1 
>>>> << endl;
>>>>
>>>> del_1->SetInput((vtkPointSet*)polydata_1);
>>>> del_1->SetTolerance(0.01);
>>>> del_1->PrintSelf(std::cout,0);
>>>>
>>>> I repeat the same for cloud 2 - variable names end with "_2".
>>>>
>>>>
>>>> Then I call ICPT as follows:
>>>>
>>>> vtkIterativeClosestPointTransform *_icpt =
>>>> vtkIterativeClosestPointTransform::New();
>>>> _icpt->GetLandmarkTransform()->SetModeToRigidBody();
>>>> _icpt->StartByMatchingCentroidsOn();
>>>> _icpt->SetMaximumNumberOfIterations(10);
>>>>
>>>> _icpt->SetSource((vtkDataSet *)del_1->GetOutput());
>>>> cout << "Calling icpt" << endl;
>>>> _icpt->SetTarget((vtkDataSet *)del_2->GetOutput());
>>>>
>>>> _icpt->Update();
>>>>
>>>>
>>>> To this it gives me an error
>>>>
>>>> ERROR: In 
>>>> /usr/local/VTK/Hybrid/vtkIterativeClosestPointTransform.cxx, line 274
>>>> vtkIterativeClosestPointTransform (0x80650e0): Can't execute with 
>>>> NULL or empty
>>>> input
>>>>
>>>> I think that up until the delaunay triangulation, it is working ok - I
>>>> rendered it and it is alright. If I do not do a delaunay triangulation
>>>> and typecast cloud_1 and cloud_2 directly it never returns from ICPT.
>>>>
>>>> any pointers, please?
>>>>
>>>> VS.
>>>> _______________________________________________
>>>> This is the private VTK discussion list.
>>>> Please keep messages on-topic. Check the FAQ at: 
>>>> http://www.vtk.org/Wiki/VTK_FAQ
>>>> Follow this link to subscribe/unsubscribe:
>>>> http://www.vtk.org/mailman/listinfo/vtkusers
>>>>
>>>>
>>>>
>>>>     
>>>
>> _______________________________________________
>> This is the private VTK discussion list. Please keep messages 
>> on-topic. Check the FAQ at: http://www.vtk.org/Wiki/VTK_FAQ
>> Follow this link to subscribe/unsubscribe:
>> http://www.vtk.org/mailman/listinfo/vtkusers
>>
>>  
>>
>



More information about the vtkusers mailing list