vtk三维点云隐式曲面重建:vtkSurfaceConstructionFilter类

22 篇文章 18 订阅

vtk三维点云重建vtkSurfaceConstructionFilter

vtkSurfaceReconstructionFilter获取假设为位于实体3D对象表面上的点列表。 计算与表面距离的带符号度量,并在常规网格上采样。 然后可以将网格轮廓化为零以提取表面,使用了三维点云隐式曲面重构技术。

 

#include "vtkRenderer.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkPolyDataMapper.h"
#include "vtkActor.h"
#include "vtkSmartPointer.h"
#include "vtkProperty.h"
#include "vtkCamera.h"
#include "vtkPoints.h"
#include "vtkCellArray.h"
#include "vtkSurfaceReconstructionFilter.h"
#include "vtkContourFilter.h"
void main()
{
	vtkSmartPointer<vtkRenderer>ren=vtkSmartPointer<vtkRenderer>::New();             //设置绘制者(绘制对象指针)
	vtkSmartPointer<vtkRenderWindow>renWin=vtkSmartPointer<vtkRenderWindow>::New();         //设置绘制窗口
	

	vtkSmartPointer<vtkRenderWindowInteractor>iren=vtkSmartPointer<vtkRenderWindowInteractor>::New();//设置绘制交互操作窗口的
	

	vtkSmartPointer<vtkPoints>m_Points=vtkSmartPointer<vtkPoints>::New();
	vtkSmartPointer<vtkCellArray>vertices=vtkSmartPointer<vtkCellArray>::New();
	//_读进点云数据信息
	FILE*fp = NULL;
	fp=fopen("斯坦福兔子.txt","r");	//读取TXT中的XYZ坐标
	if(!fp)
	{

		printf("打开文件失败!!\n");
		exit(0);
	}
	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);
		i ++;
	}	
	fclose(fp);

	vtkSmartPointer<vtkPolyData>points=vtkSmartPointer<vtkPolyData>::New();
	points->SetPoints(m_Points);
	vtkSmartPointer<vtkSurfaceReconstructionFilter>surf=vtkSmartPointer<vtkSurfaceReconstructionFilter>::New();
	surf->SetInput(points);
	
	vtkSmartPointer<vtkContourFilter>contour=vtkSmartPointer<vtkContourFilter>::New();
	contour->SetInputConnection(surf->GetOutputPort());
	contour->SetValue(0,0.0);

	vtkSmartPointer<vtkPolyDataMapper>pointMapper=vtkSmartPointer<vtkPolyDataMapper>::New();
	pointMapper->SetInput(contour->GetOutput());
	vtkSmartPointer<vtkActor>actor=vtkSmartPointer<vtkActor>::New();
	actor->SetMapper(pointMapper);
	ren->AddActor(actor);
	renWin->AddRenderer(ren);
	renWin->SetSize(800,800);
	iren->SetRenderWindow(renWin);
	renWin->Render();
	iren->Start();	

}

 

重建结果

 

如果您觉得这篇博文有用,请访问我的个人站:http://www.stubbornhuang.com,更多博文干货等着您。

评论 32
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HW140701

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值