1. 程式人生 > >VTK 點雲重建和讀取.txt文件顯示三維點雲

VTK 點雲重建和讀取.txt文件顯示三維點雲

點雲重建

vtkSurfaceReconstructionFilter實現了一種隱式曲面重建的方法,即將曲面看作一個符號距離函式的等值面,曲面內外的距離值得符號函式相反,則零等值面即為所求的曲面。該方法需要對點雲資料進行網格劃分,然後估算每個點的切平面和方向,並以每個點與最近的切平面距離來近似表面距離。這樣既可得到一個符號距離的體資料,使用vtkContourFilter來提取零等值面即可得到相應的網格。如下示例一個人臉網格的點雲資料為例進行人臉網格曲面重建。

#include"vtkSmartPointer.h"
#include"vtkAutoInit.h"
#include"vtkRenderer.h"
#include"vtkRenderWindow.h" #include"vtkRenderWindowInteractor.h" #include"vtkPolyData.h" #include"vtkPolyDataReader.h" #include"vtkSurfaceReconstructionFilter.h" #include"vtkActor.h" #include"vtkCamera.h" #include"vtkContourFilter.h" #include"vtkPolyDataMapper.h" #include"vtkVertexGlyphFilter.h" #include"vtkProperty.h"
VTK_MODULE_INIT(vtkRenderingOpenGL); VTK_MODULE_INIT(vtkRenderingFreeType); VTK_MODULE_INIT(vtkInteractionStyle); int main(int argc, char *argv[]) { std::string str = "C:\\Users\\Administrator\\Desktop\\VTK_Example\\Examples\\Chap06\\data\\fran_cut.vtk"; vtkSmartPointer<vtkPolyDataReader> reader = vtkSmartPointer<vtkPolyDataReader>::New
(); reader->SetFileName(str.c_str()); reader->Update(); vtkSmartPointer<vtkPolyData> data = vtkSmartPointer<vtkPolyData>::New(); data->SetPoints(reader->GetOutput()->GetPoints());// 獲取網格模型的點集和幾何資料。 vtkSmartPointer<vtkSurfaceReconstructionFilter> surf = vtkSmartPointer<vtkSurfaceReconstructionFilter>::New(); surf->SetInputData(data); surf->SetNeighborhoodSize(20); surf->SetSampleSpacing(0.005); surf->Update(); vtkSmartPointer<vtkContourFilter> contour = vtkSmartPointer<vtkContourFilter>::New(); contour->SetInputConnection(surf->GetOutputPort()); contour->SetValue(0,0.0); contour->Update(); vtkSmartPointer<vtkVertexGlyphFilter> vertFilter = vtkSmartPointer<vtkVertexGlyphFilter>::New(); vertFilter->AddInputData(data); vertFilter->Update(); vtkSmartPointer<vtkPolyDataMapper> dataMapper = vtkSmartPointer<vtkPolyDataMapper>::New(); dataMapper->SetInputData(vertFilter->GetOutput()); dataMapper->ScalarVisibilityOff(); vtkSmartPointer<vtkActor> dataActor = vtkSmartPointer<vtkActor>::New(); dataActor->SetMapper(dataMapper); dataActor->GetProperty()->SetColor(1,0,0); dataActor->GetProperty()->SetPointSize(4); vtkSmartPointer<vtkPolyDataMapper> contourMapper = vtkSmartPointer<vtkPolyDataMapper>::New(); contourMapper->SetInputData(contour->GetOutput()); vtkSmartPointer<vtkActor> contourActor = vtkSmartPointer<vtkActor>::New(); contourActor->SetMapper(contourMapper); double dataViews[4] = { 0, 0, 0.5, 1 }; double contourViews[4] = { 0.5, 0, 1, 1 }; vtkSmartPointer<vtkRenderer> dataRender = vtkSmartPointer<vtkRenderer>::New(); dataRender->AddActor(dataActor); dataRender->SetViewPoint(dataViews); dataRender->SetBackground(1,1,1); vtkSmartPointer<vtkRenderer> contourRender =vtkSmartPointer<vtkRenderer>::New(); contourRender->AddActor(contourActor); contourRender->SetViewport(contourViews); contourRender->SetBackground(0, 1, 0); dataRender->GetActiveCamera()->SetPosition(0, -1, 0); dataRender->GetActiveCamera()->SetFocalPoint(0, 0, 0); dataRender->GetActiveCamera()->SetViewUp(0, 0, 1); dataRender->GetActiveCamera()->Azimuth(30); dataRender->GetActiveCamera()->Elevation(30); dataRender->ResetCamera(); contourRender->SetActiveCamera(dataRender->GetActiveCamera()); vtkSmartPointer<vtkRenderWindow> rw =vtkSmartPointer<vtkRenderWindow>::New(); rw->AddRenderer(dataRender); rw->AddRenderer(contourRender); rw->SetSize(640, 320); rw->SetWindowName("WJ_Window"); rw->Render(); vtkSmartPointer<vtkRenderWindowInteractor> rwi =vtkSmartPointer<vtkRenderWindowInteractor>::New(); rwi->SetRenderWindow(rw); rwi->Initialize(); rwi->Start(); return EXIT_SUCCESS; }

這裡寫圖片描述

VTK讀取.txt文件顯示三維點雲

VTK讀取一個TXT文件中的三維點座標就可以顯示三維點雲,txt文件中的格式為 :X座標 Y座標 Z座標

這裡寫圖片描述

#include <iostream>  
#include <vector>  
#include <vtkActor.h>  
#include <vtkRenderer.h>  
#include <vtkRenderWindow.h>  
#include <vtkRenderWindowInteractor.h>  
#include <vtkProperty.h>  
#include <vtkInteractorStyleTrackball.h>  
#include <vtkInteractorStyleTrackballCamera.h>  
#include <vtkPoints.h>  
#include <vtkPolyData.h>  
#include <vtkCellArray.h>  
#include <vtkPolyDataMapper.h>  
#include <vtkSmartPointer.h>  
#include"vtkAutoInit.h"

VTK_MODULE_INIT(vtkRenderingOpenGL);
VTK_MODULE_INIT(vtkInteractionStyle);
VTK_MODULE_INIT(vtkRenderingFreeType);
VTK_MODULE_INIT(vtkRenderingVolumeOpenGL);
using namespace std;

int main(int argc, char* argv[])
{
    vtkSmartPointer<vtkPoints> m_Points = vtkSmartPointer<vtkPoints>::New();
    vtkSmartPointer<vtkCellArray> vertices = vtkSmartPointer<vtkCellArray>::New();   //_存放細胞頂點,用於渲染(顯示點雲所必須的)  
    vtkSmartPointer<vtkPolyData> polyData = vtkSmartPointer<vtkPolyData>::New();
    vtkSmartPointer<vtkPolyDataMapper> pointMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
    vtkSmartPointer<vtkActor> pointActor = vtkSmartPointer<vtkActor>::New();
    vtkSmartPointer<vtkRenderer> ren1 = vtkSmartPointer< vtkRenderer>::New();
    vtkSmartPointer<vtkRenderWindow> renWin = vtkSmartPointer<vtkRenderWindow>::New();
    vtkSmartPointer<vtkRenderWindowInteractor> iren = vtkSmartPointer<vtkRenderWindowInteractor>::New();
    vtkSmartPointer<vtkInteractorStyleTrackballCamera> istyle = vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();

    //_讀進點雲資料資訊  
    FILE *fp = NULL; fp = fopen("F:\\Point.txt", "r"); //2DpointDatas.txt  
    if (!fp)
    {
        printf("開啟檔案失敗!!\n");
        exit(1);
    }
    double x = 0, y = 0, z = 0;
    int i = 0;
    while (!feof(fp))
    {
        fscanf(fp, "%lf %lf %lf", &x, &y, &z);
        m_Points->InsertPoint(i, x, y, z);      //_加入點資訊  
        vertices->InsertNextCell(1);     //_加入細胞頂點資訊----用於渲染點集  
        vertices->InsertCellPoint(i++);

    }
    fclose(fp);
    polyData->SetPoints(m_Points);       //_設定點集  
    polyData->SetVerts(vertices);        //_設定渲染頂點  
    pointMapper->SetInputData(polyData);
    pointActor->SetMapper(pointMapper);
    pointActor->GetProperty()->SetColor(0.0, 0.1, 1.0);
    pointActor->GetProperty()->SetAmbient(0.5);
    pointActor->GetProperty()->SetPointSize(2);
    ren1->AddActor(pointActor);
    ren1->SetBackground(0, 0, 0);
    renWin->AddRenderer(ren1);
    renWin->SetSize(800, 800);
    iren->SetInteractorStyle(istyle);
    iren->SetRenderWindow(renWin);  //互動  
    renWin->Render();
    iren->Start();
    return EXIT_SUCCESS;
}

這裡寫圖片描述

這裡寫圖片描述

這裡寫圖片描述