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 }