VTK修煉之道57:圖形基本操作進階_點雲配準技術(LandMark標記點演算法和座標系顯示方法)
阿新 • • 發佈:2019-01-26
#include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRenderingOpenGL); VTK_MODULE_INIT(vtkRenderingFreeType); VTK_MODULE_INIT(vtkInteractionStyle); #include <vtkSmartPointer.h> #include <vtkPoints.h> #include <vtkLandmarkTransform.h> #include <vtkPolyData.h> #include <vtkVertexGlyphFilter.h> #include <vtkTransformPolyDataFilter.h> #include <vtkPolyDataMapper.h> #include <vtkActor.h> #include <vtkProperty.h> #include <vtkRenderer.h> #include <vtkRenderWindow.h> #include <vtkRenderWindowInteractor.h> #include <vtkAxesActor.h> //研究一下座標系顯示位置 #include <vtkOrientationMarkerWidget.h> int main() { vtkSmartPointer<vtkPoints> sourcePoints = vtkSmartPointer<vtkPoints>::New(); double sourcePoint1[3] = { 0.5, 0, 0 }; sourcePoints->InsertNextPoint(sourcePoint1); double sourcePoint2[3] = { 0, 0.5, 0 }; sourcePoints->InsertNextPoint(sourcePoint2); double sourcePoint3[3] = { 0, 0, 0.5 }; sourcePoints->InsertNextPoint(sourcePoint3); vtkSmartPointer<vtkPoints> targetPoints = vtkSmartPointer<vtkPoints>::New(); double targetPoint1[3] = { 0.0, 0.0, 0.55 }; targetPoints->InsertNextPoint(targetPoint1); double targetPoint2[3] = { 0.0, 0.55, 0.0 }; targetPoints->InsertNextPoint(targetPoint2); double targetPoint3[3] = { -0.55, 0.0, 0.0 }; targetPoints->InsertNextPoint(targetPoint3); //利用Landmark演算法求變換矩陣 vtkSmartPointer<vtkLandmarkTransform> landmarkTransform = vtkSmartPointer<vtkLandmarkTransform>::New(); landmarkTransform->SetSourceLandmarks(sourcePoints); landmarkTransform->SetTargetLandmarks(targetPoints); landmarkTransform->SetModeToRigidBody(); //執行剛體配準 landmarkTransform->Update(); ////////////////////構造PolyData型別 進行圖形視覺化 vtkSmartPointer<vtkPolyData> source = vtkSmartPointer<vtkPolyData>::New(); source->SetPoints(sourcePoints); vtkSmartPointer<vtkPolyData> target = vtkSmartPointer<vtkPolyData>::New(); target->SetPoints(targetPoints); ///////////////////// vtkSmartPointer<vtkVertexGlyphFilter> sourceGlyphFilter = vtkSmartPointer<vtkVertexGlyphFilter>::New(); sourceGlyphFilter->SetInputData(source); sourceGlyphFilter->Update(); vtkSmartPointer<vtkVertexGlyphFilter> targetGlyphFilter = vtkSmartPointer<vtkVertexGlyphFilter>::New(); targetGlyphFilter->SetInputData(target); targetGlyphFilter->Update(); ////////////////源資料施加配準變換矩陣 vtkSmartPointer<vtkTransformPolyDataFilter> transformFilter = vtkSmartPointer<vtkTransformPolyDataFilter>::New(); transformFilter->SetInputData(sourceGlyphFilter->GetOutput()); transformFilter->SetTransform(landmarkTransform); transformFilter->Update(); ///////////////////////////////////////////////////////// vtkSmartPointer<vtkPolyDataMapper> sourceMapper = vtkSmartPointer<vtkPolyDataMapper>::New(); sourceMapper->SetInputConnection(sourceGlyphFilter->GetOutputPort()); vtkSmartPointer<vtkActor> sourceActor = vtkSmartPointer<vtkActor>::New(); sourceActor->SetMapper(sourceMapper); sourceActor->GetProperty()->SetColor(1, 1, 0); sourceActor->GetProperty()->SetPointSize(10); vtkSmartPointer<vtkPolyDataMapper> targetMapper = vtkSmartPointer<vtkPolyDataMapper>::New(); targetMapper->SetInputConnection(targetGlyphFilter->GetOutputPort()); vtkSmartPointer<vtkActor> targetActor = vtkSmartPointer<vtkActor>::New(); targetActor->SetMapper(targetMapper); targetActor->GetProperty()->SetColor(0, 1, 0); targetActor->GetProperty()->SetPointSize(10); vtkSmartPointer<vtkPolyDataMapper> solutionMapper = vtkSmartPointer<vtkPolyDataMapper>::New(); solutionMapper->SetInputConnection(transformFilter->GetOutputPort()); vtkSmartPointer<vtkActor> solutionActor = vtkSmartPointer<vtkActor>::New(); solutionActor->SetMapper(solutionMapper); solutionActor->GetProperty()->SetColor(1, 0, 0); solutionActor->GetProperty()->SetPointSize(10); //////////////////// vtkSmartPointer<vtkRenderer> render = vtkSmartPointer<vtkRenderer>::New(); render->AddActor(sourceActor); render->AddActor(targetActor); render->AddActor(solutionActor); render->SetBackground(0, 0, 0); vtkSmartPointer<vtkRenderWindow> rw = vtkSmartPointer<vtkRenderWindow>::New(); rw->AddRenderer(render); rw->SetSize(480, 480); rw->SetWindowName("Regisration by Landmark"); //設定座標系顯示功能 vtkSmartPointer<vtkAxesActor> axes = vtkSmartPointer<vtkAxesActor>::New(); axes->SetScale(10); render->AddActor(axes); vtkSmartPointer<vtkRenderWindowInteractor> rwi = vtkSmartPointer<vtkRenderWindowInteractor>::New(); rwi->SetRenderWindow(rw); /************************************************************/ vtkSmartPointer<vtkOrientationMarkerWidget> widget = vtkSmartPointer<vtkOrientationMarkerWidget>::New(); widget->SetOutlineColor(0.9300, 0.5700, 0.1300); widget->SetOrientationMarker(axes); widget->SetInteractor(rwi); //加入滑鼠互動 widget->SetViewport(0.0, 0.0, 0.3, 0.3); //設定顯示位置 widget->SetEnabled(1); widget->InteractiveOn();//開啟滑鼠互動 /************************************************************/ render->ResetCamera(); rw->Render(); rwi->Initialize(); rwi->Start(); return 0; }
輸出結果: