/********************************************************************** 文件名: 6.8_PolyDataICP.cpp Copyright (c) 张晓东, 罗火灵. All rights reserved. 更多信息请访问: http://www.vtkchina.org (VTK中国) http://blog.csdn.net/www_doling_net (东灵工作室) **********************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //测试文件:../data/fran_cut.vtk int main(int argc, char * argv[]) { if(argc < 2) { std::cout< reader = vtkSmartPointer::New(); reader->SetFileName(argv[1]); reader->Update(); vtkSmartPointer original = reader->GetOutput(); vtkSmartPointer translation = vtkSmartPointer::New(); translation->Translate(0.2, 0.0, 0.0); translation->RotateX(30); vtkSmartPointer transformFilter1 = vtkSmartPointer::New(); transformFilter1->SetInput(reader->GetOutput()); transformFilter1->SetTransform(translation); transformFilter1->Update(); vtkSmartPointer source = vtkSmartPointer::New(); source->SetPoints(original->GetPoints()); vtkSmartPointer target = vtkSmartPointer::New(); target->SetPoints(transformFilter1->GetOutput()->GetPoints()); vtkSmartPointer sourceGlyphFilter = vtkSmartPointer::New(); sourceGlyphFilter->SetInput(source); sourceGlyphFilter->Update(); vtkSmartPointer targetGlyphFilter = vtkSmartPointer::New(); targetGlyphFilter->SetInput(target); targetGlyphFilter->Update(); vtkSmartPointer icpTransform = vtkSmartPointer::New(); icpTransform->SetSource(sourceGlyphFilter->GetOutput()); icpTransform->SetTarget(targetGlyphFilter->GetOutput()); icpTransform->GetLandmarkTransform()->SetModeToRigidBody(); icpTransform->SetMaximumNumberOfIterations(20); icpTransform->StartByMatchingCentroidsOn(); icpTransform->Modified(); icpTransform->Update(); vtkSmartPointer transformFilter2 = vtkSmartPointer::New(); transformFilter2->SetInput(sourceGlyphFilter->GetOutput()); transformFilter2->SetTransform(icpTransform); transformFilter2->Update(); vtkSmartPointer sourceMapper = vtkSmartPointer::New(); sourceMapper->SetInputConnection(sourceGlyphFilter->GetOutputPort()); vtkSmartPointer sourceActor = vtkSmartPointer::New(); sourceActor->SetMapper(sourceMapper); sourceActor->GetProperty()->SetColor(0,1,0); sourceActor->GetProperty()->SetPointSize(3); vtkSmartPointer targetMapper = vtkSmartPointer::New(); targetMapper->SetInputConnection(targetGlyphFilter->GetOutputPort()); vtkSmartPointer targetActor = vtkSmartPointer::New(); targetActor->SetMapper(targetMapper); targetActor->GetProperty()->SetColor(1,0,0); targetActor->GetProperty()->SetPointSize(3); vtkSmartPointer solutionMapper = vtkSmartPointer::New(); solutionMapper->SetInputConnection(transformFilter2->GetOutputPort()); vtkSmartPointer solutionActor = vtkSmartPointer::New(); solutionActor->SetMapper(solutionMapper); solutionActor->GetProperty()->SetColor(0,0,1); solutionActor->GetProperty()->SetPointSize(3); vtkSmartPointer renderer = vtkSmartPointer::New(); renderer->SetBackground(1.0, 1.0, 1.0); vtkSmartPointer renderWindow = vtkSmartPointer::New(); renderWindow->AddRenderer(renderer); renderer->AddActor(sourceActor); renderer->AddActor(targetActor); renderer->AddActor(solutionActor); vtkSmartPointer renderWindowInteractor = vtkSmartPointer::New(); renderWindowInteractor->SetRenderWindow(renderWindow); renderWindow->SetSize(640, 480); renderWindow->Render(); renderWindow->SetWindowName("PolyDataICP"); renderWindow->Render(); renderWindow->Render(); renderWindowInteractor->Start(); return EXIT_SUCCESS; }