VTK实现批量将点云中的点生成小球体

VTK实现批量将点云中的点生成小球体

原文链接:https://blog.csdn.net/hw140701/article/details/77712900

  • 代码作用:将点云中的每个点以小球体的形式展示,球体颜色大小可变。
  • 代码缺陷:无法显示点云原有颜色。(代码二实现了该功能)
    效果展示
    细节放大图
#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 <vtkSphereSource.h>
#include <vtkAutoInit.h>  
VTK_MODULE_INIT(vtkRenderingOpenGL);
VTK_MODULE_INIT(vtkInteractionStyle);
VTK_MODULE_INIT(vtkRenderingFreeType);

using namespace std;

void main(int argc, char* argv[])
{
	vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer< vtkRenderer>::New();
	vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
	renderWindow->AddRenderer(renderer);
	vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
	vtkSmartPointer<vtkInteractorStyleTrackballCamera> istyle = vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();
	renderWindowInteractor->SetRenderWindow(renderWindow);
	vtkSmartPointer<vtkInteractorStyleTrackballCamera> style = vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();
	renderWindowInteractor->SetInteractorStyle(style);//设置交互器风格 

													  //_读进点云数据信息
	FILE*fp = NULL; fp = fopen("C:\\Users\\426-4\\Desktop\\2_gt.txt", "r");	//2DpointDatas.txt
	if (!fp)
	{
		printf("打开文件失败!!\n");
		int m;
		cin >> m;
		exit(0);
	}
	float x = 0, y = 0, z = 0, c = 0;
	int i = 0;

	while (!feof(fp))
	{

		fscanf(fp, "%f %f %f %f", &x, &y, &z, &c);
		//以每一个三维作为中心画球
		vtkSmartPointer<vtkSphereSource> sphereSource = vtkSmartPointer<vtkSphereSource>::New();//定义局部球对象
		sphereSource->SetCenter(x, y, z);//设置球的中心
		sphereSource->SetRadius(0.006);//设置球的半径
		sphereSource->SetThetaResolution(30);//设置球表面精度,值越大球的光滑程度越高
		vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();//定义局部PolydataMapper对象
		mapper->SetInputConnection(sphereSource->GetOutputPort());
		vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();//定义局部actor对象
		actor->SetMapper(mapper);
		if (i == 10){
			actor->GetProperty()->SetColor(1, 0, 0);
		}
		else {
			actor->GetProperty()->SetColor(0, 1, 0);//设置球的颜色,这里可以为每个点赋不同的颜色或者是随机颜色
		}
		actor->GetProperty()->SetRepresentationToWireframe();//以线框的方式显示
															 //	actor->GetProperty()->SetRepresentationToSurface();//以表面的方式显示
		renderer->AddActor(actor);//将局部的actor加入到全局的绘制对象renderer中
		i++;
	}
	fclose(fp);

	renderer->SetBackground(1, 1, 1);//设置背景颜色
	renderWindow->Render();
	renderWindow->SetSize(800, 800);//设置窗口大小
	renderWindowInteractor->Start();
}

代码二:添加了显示原点云颜色

#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 <vtkSphereSource.h>
#include <vtkAutoInit.h>  
VTK_MODULE_INIT(vtkRenderingOpenGL);
VTK_MODULE_INIT(vtkInteractionStyle);
VTK_MODULE_INIT(vtkRenderingFreeType);

using namespace std;

void main(int argc, char* argv[])
{
	vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer< vtkRenderer>::New();
	vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
	renderWindow->AddRenderer(renderer);
	vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
	vtkSmartPointer<vtkInteractorStyleTrackballCamera> istyle = vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();
	renderWindowInteractor->SetRenderWindow(renderWindow);
	vtkSmartPointer<vtkInteractorStyleTrackballCamera> style = vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();
	renderWindowInteractor->SetInteractorStyle(style);//设置交互器风格 

													  //_读进点云数据信息
	FILE*fp = NULL; fp = fopen("C:\\Users\\426-4\\Desktop\\crop.txt", "r");	//2DpointDatas.txt
	if (!fp)
	{
		printf("打开文件失败!!\n");
		int m;
		cin >> m;
		exit(0);
	}
	float x = 0, y = 0, z = 0;
	int c = 0;
	int i = 0;

	while (!feof(fp))
	{

		fscanf(fp, "%f %f %f %f", &x, &y, &z, &c);
		//以每一个三维作为中心画球
		vtkSmartPointer<vtkSphereSource> sphereSource = vtkSmartPointer<vtkSphereSource>::New();//定义局部球对象
		sphereSource->SetCenter(x, y, z);//设置球的中心
		sphereSource->SetRadius(0.04);//设置球的半径
		sphereSource->SetThetaResolution(30);//设置球表面精度,值越大球的光滑程度越高
		vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();//定义局部PolydataMapper对象
		mapper->SetInputConnection(sphereSource->GetOutputPort());
		vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();//定义局部actor对象
		actor->SetMapper(mapper);
		double r = (c >> 16) & 0x0000ff;//计算点的RGB值
		double g = (c >> 8) & 0x0000ff;
		double b = (c) & 0x0000ff;
		actor->GetProperty()->SetColor(r/255, g/255,b/255);
		actor->GetProperty()->SetRepresentationToWireframe();//以线框的方式显示
															 //	actor->GetProperty()->SetRepresentationToSurface();//以表面的方式显示
		renderer->AddActor(actor);//将局部的actor加入到全局的绘制对象renderer中
		i++;
	}
	fclose(fp);

	renderer->SetBackground(1, 1, 1);//设置背景颜色
	renderWindow->Render();
	renderWindow->SetSize(800, 800);//设置窗口大小
	renderWindowInteractor->Start();
}
发布了27 篇原创文章 · 获赞 4 · 访问量 4540

猜你喜欢

转载自blog.csdn.net/SGL_LGS/article/details/100884096
今日推荐