点云特点

  1. 点云数据是一种通过测量设备如激光扫描仪、结构光扫描仪或深度相机等获取的大量三维空间点集合。这些点通过其在三维空间中的坐标X、Y、Z表示,并且有时会包含颜色、反射率或其他属性信息。点云数据代表物体表面的几何形状,是3D建模、视觉识别、测量和地理信息系统(GIS)等领域的重要数据源

点云预处理

  1. 去噪:滤除数据中的噪声点,提高点云质量。
  2. 下采样:减少数据点数量以提高处理速度和减少存储需求。
  3. 配准:将多视角或时间序列的点云数据对齐,以形成统一的坐标系统。
  4. 拼接:将多个点云数据集合并,以获得更大区域的详细视图。

加载点云

  1. 使用qt 作为界面,VTK 作为渲染窗口
#include <QtWidgets/QApplication>
#include <QtWidgets/QWidget>
#include <QtWidgets/QVBoxLayout>
#include <QtCore/QTextCodec>

#include <QVTKOpenGLNativeWidget.h>
#include <vtkGenericOpenGLRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkSmartPointer.h>
#include <vtkSphereSource.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkNamedColors.h>
#include <vtkProperty.h>
#include <vtkPoints.h>
#include <vtkVertexGlyphFilter.h>
#include <QVBoxLayout>
#include <QWidget>

#include "CommonUtils/ReadPointCloud.h"

#include "vtkAutoInit.h" 
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);
VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2);
VTK_MODULE_INIT(vtkRenderingFreeType);

int main(int argc, char* argv[])
{
	QSurfaceFormat::setDefaultFormat(QVTKOpenGLNativeWidget::defaultFormat());

	QApplication app(argc, argv);
	QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));

	QWidget w;
	w.setFixedSize(800, 800);
	auto lay = new QVBoxLayout(&w);

	auto vtkWidget = new QVTKOpenGLNativeWidget;
	lay->addWidget(vtkWidget);

	auto tRenderWidget = vtkGenericOpenGLRenderWindow::New();
	vtkWidget->setRenderWindow(tRenderWidget);

	// 创建渲染器
	auto tRender = vtkSmartPointer<vtkRenderer>::New();
	tRender->SetBackground(0.1, 0.2, 0.3);
	tRenderWidget->AddRenderer(tRender);

	auto points = vtkSmartPointer<vtkPoints>::New();

	QString tAscFile = QString(u8"data.asc");
	ReadPointCloud::readAscCloud(tAscFile.toStdWString(), points);

	auto tPolyData = vtkSmartPointer<vtkPolyData>::New();
	tPolyData->SetPoints(points);

    // 需要使用过滤器
	auto vertexFilter = vtkSmartPointer<vtkVertexGlyphFilter>::New();
	vertexFilter->SetInputData(tPolyData);

	auto tPolyMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
	tPolyMapper->SetInputConnection(vertexFilter->GetOutputPort());

	auto actor = vtkSmartPointer<vtkActor>::New();
	actor->SetMapper(tPolyMapper);

	tRender->AddActor(actor);
	tRender->ResetCamera();

	w.show();

	return app.exec();
}
  1. .asc文件中读取点云数据,然后将其转换为VTK可以处理的格式
  2. VTK的vtkPolyData类用于存储点云数据,并可被vtkPolyDataMapper类用于渲染
    1. 必须要使用过滤器,否则点云无法显示
  3. 渲染器、映射器、actor和交互器依次创建并配置
  4. 最后,我们启动渲染窗口并开始交互式渲染

参考文章

VTK点云数据处理:从加载到可视化的终极指南 - CSDN文库

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐