VTK 点云处理
·
点云特点
- 点云数据是一种通过测量设备如激光扫描仪、结构光扫描仪或深度相机等获取的大量三维空间点集合。这些点通过其在三维空间中的坐标X、Y、Z表示,并且有时会包含颜色、反射率或其他属性信息。点云数据代表物体表面的几何形状,是3D建模、视觉识别、测量和地理信息系统(GIS)等领域的重要数据源
点云预处理
- 去噪:滤除数据中的噪声点,提高点云质量。
- 下采样:减少数据点数量以提高处理速度和减少存储需求。
- 配准:将多视角或时间序列的点云数据对齐,以形成统一的坐标系统。
- 拼接:将多个点云数据集合并,以获得更大区域的详细视图。
加载点云
- 使用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();
}
- .asc文件中读取点云数据,然后将其转换为VTK可以处理的格式
- VTK的
vtkPolyData类用于存储点云数据,并可被vtkPolyDataMapper类用于渲染- 必须要使用过滤器,否则点云无法显示
- 渲染器、映射器、actor和交互器依次创建并配置
- 最后,我们启动渲染窗口并开始交互式渲染
参考文章
更多推荐
所有评论(0)