[vtkusers] Several point clouds alignment using ICP
David Doria
daviddoria at gmail.com
Tue Feb 22 07:44:26 EST 2011
On Tue, Feb 22, 2011 at 6:53 AM, nuno.jf <nunofernandes7 at gmail.com> wrote:
>
> Hi there,
>
> Currently, I need to align and display a set of 58 point clouds (in .wrl
> file format) using ICP.
> The code I have right now, is the "common" one, which receives two point
> clouds and aligns them.
> What I have to do (but don't know how ={ ) is a cycle for ICP to read each
> point cloud and align all of them.
> In the end, a volume file of the aligned point clouds must be created.
> Can anyone please help me?
>
> Please find attached three wrl files I need to align in a zipped folder
> http://vtk.1045678.n5.nabble.com/file/n3395391/hand_teste1_15_12_2010_01_001.wrl
> hand_teste1_15_12_2010_01_001.wrl
> http://vtk.1045678.n5.nabble.com/file/n3395391/wrl_files.zip wrl_files.zip
> (of the total 58 files).
>
>
> Thank you very much!
>
> Nuno
>
>
> ----------------ICP CODE I currently have -------------------
> // icp
>
> // Iterative Closest Point (VTK)
>
> #include "vtkVRMLImporter.h"
> #include "vtkIterativeClosestPointTransform.h"
>
> #include "vtkTransform.h"
> #include "vtkTransformPolyDataFilter.h"
> #include "vtkLandmarkTransform.h"
>
> #include "vtkPolyDataReader.h"
> #include "vtkPolyDataWriter.h"
> #include "vtkPolyData.h"
> #include "vtkPolyDataMapper.h"
> #include "vtkPolyDataNormals.h"
> #include "vtkSmoothPolyDataFilter.h"
> #include "vtkDecimatePro.h"
>
> #include "vtkGaussianSplatter.h"
> #include "vtkContourFilter.h"
>
> #include "vtkAxes.h"
> #include "vtkTubeFilter.h"
> #include "vtkCamera.h"
> #include "vtkActor.h"
> #include "vtkProperty.h"
> #include "vtkRenderer.h"
> #include "vtkRenderWindow.h"
> #include "vtkRenderWindowInteractor.h"
>
> // main function
>
> int main( int argc, char *argv[] )
> {
>
> // Point Cloud 1
> //---------------------------------------------------------
> vtkVRMLImporter *imp1 = vtkVRMLImporter::New();
> imp1 -> SetFileName(
> "C:/Users/Nuno/Documents/Faculdade/LIGHTSCAN/bin/ICP/Debug/hand_teste1_15_12_2010_01_001.wrl"
> );
> imp1 -> Read();
> imp1 -> Update();
>
> vtkDataSet *pDataset1;
> vtkActorCollection *actors1 = imp1 -> GetRenderer()->GetActors();
> actors1 -> InitTraversal();
> pDataset1 = actors1 -> GetNextActor()->GetMapper()->GetInput();
>
> vtkPolyData *polyData1 = vtkPolyData::SafeDownCast( pDataset1 );
> polyData1 -> Update();
>
> // Point Cloud 2
> //---------------------------------------------------------
> vtkVRMLImporter *imp2 = vtkVRMLImporter::New();
> imp2 -> SetFileName(
> "C:/Users/Nuno/Documents/Faculdade/LIGHTSCAN/bin/ICP/Debug/hand_teste1_15_12_2010_01_003.wrl"
> );
> imp2 -> Read();
> imp2 -> Update();
>
> vtkDataSet *pDataset2;
> vtkActorCollection *actors2 = imp2 -> GetRenderer()->GetActors();
> actors2 -> InitTraversal();
> pDataset2 = actors2 -> GetNextActor()->GetMapper()->GetInput();
>
> vtkPolyData *polyData2 = vtkPolyData::SafeDownCast( pDataset2 );
> polyData2 -> Update();
>
> std::cout << "Number of points in cloud 1 = " << polyData1 ->
> GetNumberOfPoints() << std::endl;
> std::cout << "Number of points in cloud 2 = " << polyData2 ->
> GetNumberOfPoints() << std::endl;
>
> // ==============================================================
> //
> // ICP - VTK
> //
> // ==============================================================
>
> vtkIterativeClosestPointTransform * icp =
> vtkIterativeClosestPointTransform::New();
>
> // Set SOURCE and TARGET points
> //---------------------------------------------------------
> //icp -> SetTarget( reader_PolyData1 -> GetOutput() );
> //icp -> SetSource( reader_PolyData2 -> GetOutput() );
> icp -> SetTarget( polyData1 );
> icp -> SetSource( polyData2 ); //
>
> // Configure ICP transform
> //---------------------------------------------------------
> //icp -> SetStartByMatchingCentroids(1);
> icp -> StartByMatchingCentroidsOff();
> icp -> GetLandmarkTransform()->SetModeToRigidBody();
> //icp -> GetLandmarkTransform()->SetModeToAffine();
> //icp -> SetCheckMeanDistance(1);
> //icp -> SetMeanDistanceModeToAbsoluteValue();
> icp -> SetMeanDistanceModeToRMS();
> icp -> SetMaximumNumberOfLandmarks(2000);
> icp -> SetMaximumNumberOfIterations(250);
> icp -> SetMaximumMeanDistance(0.00001);
> icp -> Update();
>
> std::cout << "ICP Mean Distance RMS = " << icp -> GetMeanDistance() <<
> std::endl;
>
> // transform SOURCE to obtain TARGET
> //---------------------------------------------------------
> vtkTransformPolyDataFilter * transform = vtkTransformPolyDataFilter::New();
>
> transform -> SetTransform( icp );
> transform -> SetInput( polyData2 );
> transform -> Update();
>
> //transform -> PrintSelf( std::cout, 0);
> std::cout << "ICP transform done." << std::endl;
>
>
> // ==============================================================
> //
> // VTK RENDERING
> //
> // ==============================================================
> vtkRenderer *ren = vtkRenderer::New();
> vtkRenderWindow *renWin = vtkRenderWindow::New();
> vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
> renWin -> AddRenderer(ren);
> iren -> SetRenderWindow(renWin);
> ren -> SetBackground(1, 1, 1);
> renWin -> SetSize(800, 600);
>
> // axes
> //---------------------------------------------------------
> double axis_scale_factor = 100.0; // mm
> int num_sides = 6;
> vtkAxes *axes = vtkAxes::New();
> vtkTubeFilter *axesTubes = vtkTubeFilter::New();
> vtkPolyDataMapper *axesMapper = vtkPolyDataMapper::New();
> vtkActor *axesActor = vtkActor::New();
> axes -> SetOrigin( 0.0, 0.0, 0.0 );
> axes -> SetScaleFactor( axis_scale_factor );
> axesTubes -> SetInput( axes -> GetOutput());
> axesTubes -> SetRadius( axes -> GetScaleFactor()/axis_scale_factor );
> axesTubes -> SetNumberOfSides( num_sides );
> axesMapper -> SetInput( axesTubes -> GetOutput() );
> axesActor -> SetMapper( axesMapper );
>
> //ren -> AddActor( axesActor );
> axesMapper -> Delete();
> axesTubes -> Delete();
> axes -> Delete();
>
>
> // TARGET - PolyData1 - Points Red
> //---------------------------------------------------------
> vtkPolyDataMapper * rawpointsMapper1 = vtkPolyDataMapper::New();
> vtkActor * rawpointsActor1 = vtkActor::New();
> //rawpointsMapper1 -> SetInput( reader_PolyData1 -> GetOutput() );
> rawpointsMapper1 -> SetInput( polyData1 );
> rawpointsMapper1 -> ScalarVisibilityOff();
> rawpointsActor1 -> SetMapper( rawpointsMapper1 );
> rawpointsActor1 -> GetProperty() -> SetColor(1, 0, 0);
>
> ren -> AddActor( rawpointsActor1 );
> rawpointsMapper1 -> Delete();
>
>
> // SOURCE - PolyData2 - Points Green
> //---------------------------------------------------------
> vtkPolyDataMapper * rawpointsMapper2 = vtkPolyDataMapper::New();
> vtkActor * rawpointsActor2 = vtkActor::New();
>
> rawpointsMapper2 -> SetInput( polyData2 );
> rawpointsMapper2 -> ScalarVisibilityOff();
> rawpointsActor2 -> SetMapper( rawpointsMapper2 );
> rawpointsActor2 -> GetProperty() -> SetColor(0, 1, 0);
>
> ren -> AddActor( rawpointsActor2 );
> rawpointsMapper2 -> Delete();
>
>
> // ICP - PolyData2 TRANSFORMED - Points Blue
> //---------------------------------------------------------
> vtkPolyDataMapper * rawpointsMapper3 = vtkPolyDataMapper::New();
> vtkActor * rawpointsActor3 = vtkActor::New();
>
> rawpointsMapper3 -> SetInput( transform -> GetOutput() );
> //rawpointsMapper3 -> SetInput( TF -> GetOutput() );
> rawpointsMapper3 -> ScalarVisibilityOff();
> rawpointsActor3 -> SetMapper( rawpointsMapper3 );
> rawpointsActor3 -> GetProperty() -> SetColor(0, 0, 1);
>
> ren -> AddActor( rawpointsActor3 );
> rawpointsMapper3 -> Delete();
>
> // Surface Rendering
>
> renWin -> Render();
> iren -> Start();
>
> // Delete VTK objects
>
> ren -> RemoveActor( axesActor );
> ren -> RemoveActor( rawpointsActor1 );
> ren -> RemoveActor( rawpointsActor2 );
> ren -> RemoveActor( rawpointsActor3 );
>
> rawpointsActor1 -> Delete();
> rawpointsActor2 -> Delete();
> rawpointsActor3 -> Delete();
>
> ren -> Delete();
> iren -> Delete();
> renWin -> Delete();
>
> /* ============================================================ */
> return 0;
>
> }
>
> --
> View this message in context: http://vtk.1045678.n5.nabble.com/Several-point-clouds-alignment-using-ICP-tp3395391p3395391.html
I believe that is what the ProcrustesAlignmentFilter is for:
http://www.vtk.org/Wiki/VTK/Examples/Cxx/PolyData/ProcrustesAlignmentFilter
David
More information about the vtkusers
mailing list