VTK 點雲重建和讀取.txt文件顯示三維點雲
阿新 • • 發佈:2019-01-31
點雲重建
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;
}