[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