VTK_Learning_ICP_Registration

1.ICP配准效果图

       

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());

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值