VTK_Learning_ICP_Registration 阳光穿透心脏的1/2处 2023-06-27 11:11 54阅读 0赞 # 1.ICP配准效果图 # ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zODI5MzQ1Mw_size_16_color_FFFFFF_t_70][] ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zODI5MzQ1Mw_size_16_color_FFFFFF_t_70 1][] ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zODI5MzQ1Mw_size_16_color_FFFFFF_t_70 2][] # 2.ICP配准代码 # main.cpp #include <QCoreApplication> #include <QDebug> #include <iostream> #include <sstream> #include <QtCore> #include "ndi_capi.h" #include "pointclouddata.h" #include <QGuiApplication> #include <QQmlApplicationEngine> #include "tempframe.h" #include "tempdataprocessor.h" #include "tempdatarepository.h" #include "tempthread001.h" #include "registrationpointcloud.h" #include <QMainWindow> #include <QWidget> #include <QGuiApplication> #include <QQuickView> #include <QtQml> #include <QQmlApplicationEngine> //vtk #include <vtkActor.h> #include <vtkCamera.h> #include <vtkCylinderSource.h> #include <vtkNamedColors.h> #include <vtkPolyDataMapper.h> #include <vtkProperty.h> #include <vtkRenderWindow.h> #include <vtkRenderWindowInteractor.h> #include <vtkRenderer.h> #include <array> #include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRenderingOpenGL2); VTK_MODULE_INIT(vtkRenderingFreeType); VTK_MODULE_INIT(vtkInteractionStyle); #include <vtkSmartPointer.h> #include <vtkPolyDataReader.h> #include <vtkPolyData.h> #include <vtkTransform.h> #include <vtkTransformPolyDataFilter.h> #include <vtkVertexGlyphFilter.h> #include <vtkIterativeClosestPointTransform.h> #include <vtkLandmarkTransform.h> #include <vtkTransformPolyDataFilter.h> #include <vtkPolyDataMapper.h> #include <vtkActor.h> #include <vtkProperty.h> #include <vtkAxesActor.h> #include <vtkRenderer.h> #include <vtkRenderWindow.h> #include <vtkRenderWindowInteractor.h> #include <vtkOrientationMarkerWidget.h> //坐标系交互 int main(int argc, char *argv[]) { QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); qmlRegisterType<TempFrame>("qian.qml.TempInterface", 1, 0, "TempFrame"); qmlRegisterType<Tool>("qian.qml.TempInterface", 1, 0, "Tool"); qmlRegisterType<MyStrayMarker>("qian.qml.TempInterface", 1, 0, "MyStrayMarker"); QGuiApplication app(argc, argv); // QObject *w= new QObject(); // TempThread001 *m_tempThread; // m_tempThread = new TempThread001(w); // TempDataProcessor *m_tempDataProcessor=new TempDataProcessor(); // TempDataRepository *m_tempDataRepository=new TempDataRepository(); // m_tempDataProcessor->setTempDataRepository(m_tempDataRepository); // m_tempThread->setTempDataProcessor(m_tempDataProcessor); // m_tempThread->start(); // QQmlApplicationEngine engine; // engine.rootContext()->setContextProperty("NDI_DataRepository",m_tempDataRepository); // engine.rootContext()->setContextProperty("NDI_DataProcessor",m_tempDataProcessor); // engine.load(QUrl(QStringLiteral("qrc:/qml/main.qml"))); // if (engine.rootObjects().isEmpty()) // return -1; vtkSmartPointer<vtkNamedColors> colors = vtkSmartPointer<vtkNamedColors>::New(); std::array<unsigned char, 4> skinColor{ {255, 125, 64} }; colors->SetColor("SkinColor", skinColor.data()); std::array<unsigned char, 4> bkg{ {51, 77, 102, 255} }; colors->SetColor("BkgColor", bkg.data()); RegistrationPointCloud registrationIreach; std::vector<std::vector<float>> tempMatrix; vtkSmartPointer<vtkPolyData> orig ; vtkSmartPointer<vtkPolyData> targ ; tempMatrix.clear(); registrationIreach.getVectorFieldData("../../pointCloud/test_3D_20191205145441.xyz",tempMatrix); registrationIreach.writeDataToVtk(orig,tempMatrix); std::vector<std::vector<float>> tempMatrix_1; tempMatrix_1.clear(); registrationIreach.getVectorFieldData("../../DCM_points/sun_test.xyz",tempMatrix_1); registrationIreach.writeDataToVtk(targ,tempMatrix_1); std::cout<<"tempMatrix.size()"<<tempMatrix.size()<<"\t"<<tempMatrix_1.size()<<"\n" <<std::endl ; //源数据 与 目标数据 vtkSmartPointer<vtkPolyData> source = vtkSmartPointer<vtkPolyData>::New(); source->SetPoints(orig->GetPoints()); vtkSmartPointer<vtkPolyData> target = vtkSmartPointer<vtkPolyData>::New(); target->SetPoints(targ->GetPoints()); vtkSmartPointer<vtkVertexGlyphFilter> sourceGlyph = vtkSmartPointer<vtkVertexGlyphFilter>::New(); sourceGlyph->SetInputData(source); sourceGlyph->Update(); vtkSmartPointer<vtkVertexGlyphFilter> targetGlyph = vtkSmartPointer<vtkVertexGlyphFilter>::New(); targetGlyph->SetInputData(target); targetGlyph->Update(); //进行ICP配准求变换矩阵 vtkSmartPointer<vtkIterativeClosestPointTransform> icptrans = vtkSmartPointer<vtkIterativeClosestPointTransform>::New(); icptrans->SetSource(sourceGlyph->GetOutput()); icptrans->SetTarget(targetGlyph->GetOutput()); icptrans->GetLandmarkTransform()->SetModeToRigidBody(); icptrans->SetMaximumNumberOfIterations(1000); icptrans->StartByMatchingCentroidsOn(); icptrans->Modified(); icptrans->Update(); //配准矩阵调整源数据 vtkSmartPointer<vtkTransformPolyDataFilter> solution = vtkSmartPointer<vtkTransformPolyDataFilter>::New(); solution->SetInputData(sourceGlyph->GetOutput()); solution->SetTransform(icptrans); solution->Update(); / vtkSmartPointer<vtkPolyDataMapper> sourceMapper = vtkSmartPointer<vtkPolyDataMapper>::New(); sourceMapper->SetInputConnection(sourceGlyph->GetOutputPort()); vtkSmartPointer<vtkActor> sourceActor = vtkSmartPointer<vtkActor>::New(); sourceActor->SetMapper(sourceMapper); sourceActor->GetProperty()->SetColor(0, 1, 0); sourceActor->GetProperty()->SetPointSize(1); vtkSmartPointer<vtkPolyDataMapper> targetMapper = vtkSmartPointer<vtkPolyDataMapper>::New(); targetMapper->SetInputConnection(targetGlyph->GetOutputPort()); vtkSmartPointer<vtkActor> targetActor = vtkSmartPointer<vtkActor>::New(); targetActor->SetMapper(targetMapper); targetActor->GetProperty()->SetColor(1, 1, 0); targetActor->GetProperty()->SetPointSize(1); vtkSmartPointer<vtkPolyDataMapper> soluMapper = vtkSmartPointer<vtkPolyDataMapper>::New(); soluMapper->SetInputConnection(solution->GetOutputPort()); vtkSmartPointer<vtkActor> soluActor = vtkSmartPointer<vtkActor>::New(); soluActor->SetMapper(soluMapper); soluActor->GetProperty()->SetColor(1, 0, 0); soluActor->GetProperty()->SetPointSize(4); //设置坐标系 vtkSmartPointer<vtkAxesActor> axes = vtkSmartPointer<vtkAxesActor>::New(); axes->SetScale(1000); /// vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New(); renderer->AddActor(sourceActor); renderer->AddActor(targetActor); renderer->AddActor(soluActor); //renderer->AddActor(axes); // Set the background color. renderer->SetBackground(colors->GetColor3d("BkgColor").GetData()); renderer->ResetCamera(); renderer->GetActiveCamera()->Zoom(1.5); vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New(); renderWindow->AddRenderer(renderer); renderWindow->SetSize(988, 666); renderWindow->SetWindowName("ICP Regisration Test"); vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor = vtkSmartPointer<vtkRenderWindowInteractor>::New(); renderWindowInteractor->SetRenderWindow(renderWindow); /****************************************************************/ vtkSmartPointer<vtkOrientationMarkerWidget> widget = vtkSmartPointer<vtkOrientationMarkerWidget>::New(); widget->SetOutlineColor(1, 1, 1); widget->SetOrientationMarker(axes); widget->SetInteractor(renderWindowInteractor); //加入鼠标交互 widget->SetViewport(0.0, 0.0, 0.3, 0.3); //设置显示位置 widget->SetEnabled(1); widget->InteractiveOn();//开启鼠标交互 // This starts the event loop and as a side effect causes an initial render. renderWindow->Render(); renderWindowInteractor->Initialize(); renderWindowInteractor->Start(); return app.exec(); } # 3.对数据进行Transform变化(NDI\_CAP\_Ireach\_qml\_ireach\_vtk\_icp.zip例子中用到,对同一份数据进行变化) # //构造浮动数据点集 vtkSmartPointer<vtkTransform> trans = vtkSmartPointer<vtkTransform>::New(); trans->Translate(200,200, 0); trans->RotateX(10); vtkSmartPointer<vtkTransformPolyDataFilter> transformFilter1 = vtkSmartPointer<vtkTransformPolyDataFilter>::New(); transformFilter1->SetInputData(orig); transformFilter1->SetTransform(trans); transformFilter1->Update(); vtkSmartPointer<vtkPolyData> target = vtkSmartPointer<vtkPolyData>::New(); target->SetPoints(transformFilter1->GetOutput()->GetPoints()); [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zODI5MzQ1Mw_size_16_color_FFFFFF_t_70]: https://img-blog.csdnimg.cn/20200106111650700.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zODI5MzQ1Mw==,size_16,color_FFFFFF,t_70 [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zODI5MzQ1Mw_size_16_color_FFFFFF_t_70 1]: https://img-blog.csdnimg.cn/20200106111541692.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zODI5MzQ1Mw==,size_16,color_FFFFFF,t_70 [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zODI5MzQ1Mw_size_16_color_FFFFFF_t_70 2]: https://img-blog.csdnimg.cn/20200106132905323.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zODI5MzQ1Mw==,size_16,color_FFFFFF,t_70
还没有评论,来说两句吧...