VTK 实例62:点云配准

发布时间 2023-08-16 08:55:10作者: 一杯清酒邀明月

  1 #include <vtkAutoInit.h>
  2 VTK_MODULE_INIT(vtkRenderingOpenGL2);
  3 VTK_MODULE_INIT(vtkRenderingFreeType);
  4 VTK_MODULE_INIT(vtkInteractionStyle);
  5 
  6 #include <vtkPoints.h>
  7 #include <vtkSmartPointer.h>
  8 #include <vtkLandmarkTransform.h>
  9 #include <vtkMatrix4x4.h>
 10 #include <vtkPolyDataMapper.h>
 11 #include <vtkActor.h>
 12 #include <vtkRenderWindow.h>
 13 #include <vtkRenderer.h>
 14 #include <vtkRenderWindowInteractor.h>
 15 #include <vtkProperty.h>
 16 #include <vtkTransformPolyDataFilter.h>
 17 #include <vtkVertexGlyphFilter.h>
 18 #include <vtkAxesActor.h>
 19 
 20 int main(int, char *[])
 21 {
 22     vtkSmartPointer<vtkPoints> sourcePoints =
 23         vtkSmartPointer<vtkPoints>::New();
 24     double sourcePoint1[3] = {0.5, 0.0, 0.0};
 25     sourcePoints->InsertNextPoint(sourcePoint1);
 26     double sourcePoint2[3] = {0.0, 0.5, 0.0};
 27     sourcePoints->InsertNextPoint(sourcePoint2);
 28     double sourcePoint3[3] = {0.0, 0.0, 0.5};
 29     sourcePoints->InsertNextPoint(sourcePoint3);
 30 
 31     vtkSmartPointer<vtkPoints> targetPoints =
 32         vtkSmartPointer<vtkPoints>::New();
 33     double targetPoint1[3] = {0.0, 0.0, 0.55};
 34     targetPoints->InsertNextPoint(targetPoint1);
 35     double targetPoint2[3] = {0.0, 0.55, 0.0};
 36     targetPoints->InsertNextPoint(targetPoint2);
 37     double targetPoint3[3] = {-0.55, 0.0, 0.0};
 38     targetPoints->InsertNextPoint(targetPoint3);
 39 
 40     vtkSmartPointer<vtkLandmarkTransform> landmarkTransform = 
 41         vtkSmartPointer<vtkLandmarkTransform>::New();
 42     landmarkTransform->SetSourceLandmarks(sourcePoints);
 43     landmarkTransform->SetTargetLandmarks(targetPoints);
 44     landmarkTransform->SetModeToRigidBody();
 45     landmarkTransform->Update(); 
 46 
 47     vtkSmartPointer<vtkPolyData> source =
 48         vtkSmartPointer<vtkPolyData>::New();
 49     source->SetPoints(sourcePoints);
 50 
 51     vtkSmartPointer<vtkPolyData> target =
 52         vtkSmartPointer<vtkPolyData>::New();
 53     target->SetPoints(targetPoints);
 54 
 55     vtkSmartPointer<vtkVertexGlyphFilter> sourceGlyphFilter =
 56         vtkSmartPointer<vtkVertexGlyphFilter>::New();
 57     sourceGlyphFilter->SetInputData(source);
 58     sourceGlyphFilter->Update();
 59 
 60     vtkSmartPointer<vtkVertexGlyphFilter> targetGlyphFilter =
 61         vtkSmartPointer<vtkVertexGlyphFilter>::New();
 62     targetGlyphFilter->SetInputData(target);
 63     targetGlyphFilter->Update();
 64 
 65     vtkSmartPointer<vtkTransformPolyDataFilter> transformFilter =
 66         vtkSmartPointer<vtkTransformPolyDataFilter>::New();
 67     transformFilter->SetInputData(sourceGlyphFilter->GetOutput());
 68     transformFilter->SetTransform(landmarkTransform);
 69     transformFilter->Update();
 70 
 71     vtkSmartPointer<vtkPolyDataMapper> sourceMapper =
 72         vtkSmartPointer<vtkPolyDataMapper>::New();
 73     sourceMapper->SetInputConnection(sourceGlyphFilter->GetOutputPort());
 74 
 75     vtkSmartPointer<vtkActor> sourceActor =
 76         vtkSmartPointer<vtkActor>::New();
 77     sourceActor->SetMapper(sourceMapper);
 78     sourceActor->GetProperty()->SetColor(1,1,0);
 79     sourceActor->GetProperty()->SetPointSize(5);
 80 
 81     vtkSmartPointer<vtkPolyDataMapper> targetMapper =
 82         vtkSmartPointer<vtkPolyDataMapper>::New();
 83     targetMapper->SetInputConnection(targetGlyphFilter->GetOutputPort());
 84 
 85     vtkSmartPointer<vtkActor> targetActor =
 86         vtkSmartPointer<vtkActor>::New();
 87     targetActor->SetMapper(targetMapper);
 88     targetActor->GetProperty()->SetColor(1,0,0);
 89     targetActor->GetProperty()->SetPointSize(5);
 90 
 91     vtkSmartPointer<vtkPolyDataMapper> solutionMapper =
 92         vtkSmartPointer<vtkPolyDataMapper>::New();
 93     solutionMapper->SetInputConnection(transformFilter->GetOutputPort());
 94 
 95     vtkSmartPointer<vtkActor> solutionActor =
 96         vtkSmartPointer<vtkActor>::New();
 97     solutionActor->SetMapper(solutionMapper);
 98     solutionActor->GetProperty()->SetColor(0,0,1);
 99     solutionActor->GetProperty()->SetPointSize(5);
100 
101     vtkSmartPointer<vtkRenderer> renderer =
102         vtkSmartPointer<vtkRenderer>::New();
103 
104     vtkSmartPointer<vtkRenderWindow> renderWindow =
105         vtkSmartPointer<vtkRenderWindow>::New();
106     renderWindow->AddRenderer(renderer);
107     renderer->AddActor(sourceActor);
108     renderer->AddActor(targetActor);
109     renderer->AddActor(solutionActor);
110 
111     vtkSmartPointer<vtkAxesActor> axes =
112         vtkSmartPointer<vtkAxesActor>::New();
113     axes->SetScale(30);
114     renderer->AddActor(axes);
115     renderer->SetBackground(.3, .6, .3);
116 
117     vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
118         vtkSmartPointer<vtkRenderWindowInteractor>::New();
119     renderWindowInteractor->SetRenderWindow(renderWindow);
120 
121     renderWindow->SetSize(640, 480);
122     renderWindow->Render();
123     renderWindow->SetWindowName("PolyDataLandmarkReg");
124     renderWindow->Render();
125     renderWindowInteractor->Start();
126 
127     return EXIT_SUCCESS;
128 }

  1 #include <vtkAutoInit.h>
  2 VTK_MODULE_INIT(vtkRenderingOpenGL2);
  3 VTK_MODULE_INIT(vtkRenderingFreeType);
  4 VTK_MODULE_INIT(vtkInteractionStyle);
  5 
  6 #include <vtkPoints.h>
  7 #include <vtkSmartPointer.h>
  8 #include <vtkLandmarkTransform.h>
  9 #include <vtkMatrix4x4.h>
 10 #include <vtkPolyDataMapper.h>
 11 #include <vtkActor.h>
 12 #include <vtkRenderWindow.h>
 13 #include <vtkRenderer.h>
 14 #include <vtkRenderWindowInteractor.h>
 15 #include <vtkProperty.h>
 16 #include <vtkTransformPolyDataFilter.h>
 17 #include <vtkVertexGlyphFilter.h>
 18 #include <vtkIterativeClosestPointTransform.h>
 19 #include <vtkPolyDataReader.h>
 20 #include <vtkTransform.h>
 21 
 22 //测试文件:../data/fran_cut.vtk
 23 int main(int argc, char * argv[])
 24 {
 25     vtkSmartPointer<vtkPolyDataReader> reader = 
 26         vtkSmartPointer<vtkPolyDataReader>::New();
 27     reader->SetFileName("C:\\Users\\Administrator\\Desktop\\VTK2\\hellovtk\\vtk_图像处理学习\\第六章_图像处理\\data\\fran_cut.vtk");
 28     reader->Update();
 29     vtkSmartPointer<vtkPolyData> original  =  reader->GetOutput();
 30 
 31     vtkSmartPointer<vtkTransform> translation =
 32         vtkSmartPointer<vtkTransform>::New();
 33     translation->Translate(0.2, 0.0, 0.0);
 34     translation->RotateX(30);
 35 
 36     vtkSmartPointer<vtkTransformPolyDataFilter> transformFilter1 =
 37         vtkSmartPointer<vtkTransformPolyDataFilter>::New();
 38     transformFilter1->SetInputData(reader->GetOutput());
 39     transformFilter1->SetTransform(translation);
 40     transformFilter1->Update();
 41 
 42     vtkSmartPointer<vtkPolyData> source =
 43         vtkSmartPointer<vtkPolyData>::New();
 44     source->SetPoints(original->GetPoints());
 45 
 46     vtkSmartPointer<vtkPolyData> target =
 47         vtkSmartPointer<vtkPolyData>::New();
 48     target->SetPoints(transformFilter1->GetOutput()->GetPoints());
 49 
 50     vtkSmartPointer<vtkVertexGlyphFilter> sourceGlyphFilter =
 51         vtkSmartPointer<vtkVertexGlyphFilter>::New();
 52     sourceGlyphFilter->SetInputData(source);
 53     sourceGlyphFilter->Update();
 54 
 55     vtkSmartPointer<vtkVertexGlyphFilter> targetGlyphFilter =
 56         vtkSmartPointer<vtkVertexGlyphFilter>::New();
 57     targetGlyphFilter->SetInputData(target);
 58     targetGlyphFilter->Update();
 59 
 60     vtkSmartPointer<vtkIterativeClosestPointTransform> icpTransform = 
 61         vtkSmartPointer<vtkIterativeClosestPointTransform>::New();
 62     icpTransform->SetSource(sourceGlyphFilter->GetOutput());
 63     icpTransform->SetTarget(targetGlyphFilter->GetOutput());
 64     icpTransform->GetLandmarkTransform()->SetModeToRigidBody();
 65     icpTransform->SetMaximumNumberOfIterations(20);
 66     icpTransform->StartByMatchingCentroidsOn();
 67     icpTransform->Modified();
 68     icpTransform->Update();
 69 
 70     vtkSmartPointer<vtkTransformPolyDataFilter> transformFilter2 =
 71         vtkSmartPointer<vtkTransformPolyDataFilter>::New();
 72     transformFilter2->SetInputData(sourceGlyphFilter->GetOutput());
 73     transformFilter2->SetTransform(icpTransform);
 74     transformFilter2->Update();
 75 
 76     vtkSmartPointer<vtkPolyDataMapper> sourceMapper =
 77         vtkSmartPointer<vtkPolyDataMapper>::New();
 78     sourceMapper->SetInputConnection(sourceGlyphFilter->GetOutputPort());
 79 
 80     vtkSmartPointer<vtkActor> sourceActor =
 81         vtkSmartPointer<vtkActor>::New();
 82     sourceActor->SetMapper(sourceMapper);
 83     sourceActor->GetProperty()->SetColor(0,1,0);
 84     sourceActor->GetProperty()->SetPointSize(3);
 85 
 86     vtkSmartPointer<vtkPolyDataMapper> targetMapper =
 87         vtkSmartPointer<vtkPolyDataMapper>::New();
 88     targetMapper->SetInputConnection(targetGlyphFilter->GetOutputPort());
 89 
 90     vtkSmartPointer<vtkActor> targetActor =
 91         vtkSmartPointer<vtkActor>::New();
 92     targetActor->SetMapper(targetMapper);
 93     targetActor->GetProperty()->SetColor(1,0,0);
 94     targetActor->GetProperty()->SetPointSize(3);
 95 
 96     vtkSmartPointer<vtkPolyDataMapper> solutionMapper =
 97         vtkSmartPointer<vtkPolyDataMapper>::New();
 98     solutionMapper->SetInputConnection(transformFilter2->GetOutputPort());
 99 
100     vtkSmartPointer<vtkActor> solutionActor =
101         vtkSmartPointer<vtkActor>::New();
102     solutionActor->SetMapper(solutionMapper);
103     solutionActor->GetProperty()->SetColor(0,0,1);
104     solutionActor->GetProperty()->SetPointSize(3);
105 
106     vtkSmartPointer<vtkRenderer> renderer =
107         vtkSmartPointer<vtkRenderer>::New();
108     renderer->SetBackground(1.0, 1.0, 1.0);
109 
110     vtkSmartPointer<vtkRenderWindow> renderWindow =
111         vtkSmartPointer<vtkRenderWindow>::New();
112     renderWindow->AddRenderer(renderer);
113     renderer->AddActor(sourceActor);
114     renderer->AddActor(targetActor);
115     renderer->AddActor(solutionActor);
116 
117     vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
118         vtkSmartPointer<vtkRenderWindowInteractor>::New();
119     renderWindowInteractor->SetRenderWindow(renderWindow);
120 
121     renderWindow->SetSize(640, 480);
122     renderWindow->Render();
123     renderWindow->SetWindowName("PolyDataICP");
124     renderWindow->Render();
125     renderWindow->Render();
126     renderWindowInteractor->Start();
127 
128     return EXIT_SUCCESS;
129 }