表面重建

通过三维扫描仪所获取的实际物体的空间点云数据仅仅表示物体的集合数据,而无法表达其内部的拓扑结构。拓扑结构对于实际图形处理以及可视化具有重要的意义。因此这就需要利用表面重建技术将点云数据转换为面模型,通常为三角网络模型。除此之外,基于图像数据的面绘制也是一种应用非常广泛的表面重建技术。

三角剖分

三角部分是一种应用非常广泛的面重建技术。三角部分将一些散乱的点云数据剖为一系列的三角网格。最常用的三角剖分技术是Delanuay 三角部分。Delanuay三角部分具有许多优良的性质,如大小化最小角特性,即在所有可能的三角部分中,其所生成的三角形的最小角最大。所以,Delanuay三角部分无论从哪个区域来时构建,最终生成的三角网格是唯一的。

VTK的vtkDelanuay2D类实现了二维三角部分,该类的输入数据为一个vtkPointSet 或其子类表示的三维空间点集,其输出为一个三角网格vtkPolyData数据。虽然输入的是三维数据,但是算法仅使用XY平面数据进行平面三角部分,而忽略Z方向数据。当然,也可以为vtkDelanuay2D设置一个投影变换从而在新的投影平面上进行三角部分。需要注意的是,在不加任何限制的条件下,该类生成的平面三角网格为一个凸包。

#include"vtkSmartPointer.h"
#include"vtkRenderer.h"
#include"vtkRenderWindow.h"
#include"vtkRenderWindowInteractor.h"
#include"vtkPolyData.h"
#include"vtkDelaunay2D.h"
#include"vtkPoints.h"
#include"vtkPolyDataMapper.h"
#include"vtkActor.h"
#include"vtkAutoInit.h"
#include"vtkMath.h"
#include"vtkVertexGlyphFilter.h"
#include"vtkProperty.h" VTK_MODULE_INIT(vtkRenderingOpenGL);
VTK_MODULE_INIT(vtkInteractionStyle);
VTK_MODULE_INIT(vtkRenderingFreeType);
VTK_MODULE_INIT(vtkRenderingVolumeOpenGL);int main()
{vtkPoints *points = vtkPoints::New();unsigned int gridSize = 10;for (unsigned i = 0; i < gridSize; ++i){for (unsigned j = 0; j < gridSize; ++j){points->InsertNextPoint(i, j, vtkMath::Random(0.0, 3.0));}}   vtkPolyData *polydata = vtkPolyData::New();polydata->SetPoints(points);vtkDelaunay2D *delaunay = vtkDelaunay2D::New();delaunay->SetInputData(polydata);delaunay->Update();vtkVertexGlyphFilter *vertexGlyphFilter = vtkVertexGlyphFilter::New();vertexGlyphFilter->SetInputData(polydata);vertexGlyphFilter->Update();vtkPolyDataMapper *polydataMapper = vtkPolyDataMapper::New();polydataMapper->SetInputConnection(vertexGlyphFilter->GetOutputPort());vtkActor *actor = vtkActor::New();actor->SetMapper(polydataMapper);actor->GetProperty()->SetPointSize(5);actor->GetProperty()->SetColor(1,0,0);vtkPolyDataMapper *triangleMapper = vtkPolyDataMapper::New();triangleMapper->SetInputConnection(delaunay->GetOutputPort());triangleMapper->Update();vtkActor *triangleActor = vtkActor::New();triangleActor->SetMapper(triangleMapper);vtkRenderer *ren = vtkRenderer::New();ren->AddActor(actor);ren->AddActor(triangleActor);ren->SetBackground(0,0,0);vtkRenderWindow *renwin = vtkRenderWindow::New();renwin->AddRenderer(ren);renwin->SetSize(740,480);   vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();iren->SetRenderWindow(renwin);iren->Initialize();iren->Start();return EXIT_SUCCESS;
}

当然使用完对象后,要析构掉,博主在此偷懒没有释放空间,后面还是要vtk自带的智能指针vtkSmartPointer

三角剖分的限制

vtkDelaunay2D还支持加入边界限制。用户需要设置一个vtkPolyData数据。其内部的线段、闭合或者非闭合的线段集合将作为边界条件控制三角剖分的过程。其中组成这些边界的点的索引必须与原始点集一致。加入边界条件后,最后的剖分结果可能不再满足Delaunay准则。

include"vtkSmartPointer.h"
#include"vtkRenderer.h"
#include"vtkRenderWindow.h"
#include"vtkRenderWindowInteractor.h"
#include"vtkPolyData.h"
#include"vtkDelaunay2D.h"
#include"vtkPoints.h"
#include"vtkPolyDataMapper.h"
#include"vtkActor.h"
#include"vtkAutoInit.h"
#include"vtkMath.h"
#include"vtkVertexGlyphFilter.h"
#include"vtkProperty.h"
#include"vtkPolygon.h"
#include"vtkCellArray.h"VTK_MODULE_INIT(vtkRenderingOpenGL);
VTK_MODULE_INIT(vtkInteractionStyle);
VTK_MODULE_INIT(vtkRenderingFreeType);
VTK_MODULE_INIT(vtkRenderingVolumeOpenGL);int main()
{vtkSmartPointer<vtkPoints>points =vtkSmartPointer<vtkPoints>::New();unsigned int gridSize = 10;for (unsigned i = 0; i < gridSize; ++i){for (unsigned j = 0; j < gridSize; ++j){points->InsertNextPoint(i, j, vtkMath::Random(0.0, 3.0));}}vtkSmartPointer<vtkPolyData>polydata = vtkSmartPointer<vtkPolyData>::New();polydata->SetPoints(points);vtkSmartPointer<vtkPolygon> poly = vtkSmartPointer<vtkPolygon>::New();poly->GetPointIds()->InsertNextId(32);poly->GetPointIds()->InsertNextId(42);poly->GetPointIds()->InsertNextId(43);poly->GetPointIds()->InsertNextId(44);poly->GetPointIds()->InsertNextId(45);poly->GetPointIds()->InsertNextId(35);poly->GetPointIds()->InsertNextId(25);poly->GetPointIds()->InsertNextId(24);poly->GetPointIds()->InsertNextId(23);poly->GetPointIds()->InsertNextId(22);vtkSmartPointer<vtkCellArray> cell = vtkSmartPointer<vtkCellArray>::New();cell->InsertNextCell(poly);vtkSmartPointer<vtkPolyData> boundary = vtkSmartPointer<vtkPolyData>::New();boundary->SetPoints(points);boundary->SetPolys(cell);vtkSmartPointer<vtkDelaunay2D> delaunay =vtkSmartPointer<vtkDelaunay2D>::New();delaunay->SetInputData(polydata);delaunay->SetSourceData(boundary);delaunay->Update();vtkSmartPointer<vtkVertexGlyphFilter> vertexGlyphFilter =vtkSmartPointer<vtkVertexGlyphFilter>::New();vertexGlyphFilter->SetInputData(polydata);vertexGlyphFilter->Update();vtkSmartPointer<vtkPolyDataMapper> polydataMapper = vtkSmartPointer<vtkPolyDataMapper>::New();polydataMapper->SetInputConnection(vertexGlyphFilter->GetOutputPort());vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();actor->SetMapper(polydataMapper);actor->GetProperty()->SetPointSize(5);actor->GetProperty()->SetColor(1, 0, 0);vtkSmartPointer<vtkPolyDataMapper> triangleMapper = vtkSmartPointer<vtkPolyDataMapper>::New();triangleMapper->SetInputConnection(delaunay->GetOutputPort());triangleMapper->Update();vtkSmartPointer<vtkActor> triangleActor = vtkSmartPointer<vtkActor>::New();triangleActor->SetMapper(triangleMapper);vtkSmartPointer<vtkRenderer> ren = vtkSmartPointer<vtkRenderer>::New();ren->AddActor(actor);ren->AddActor(triangleActor);ren->SetBackground(0, 0, 0);vtkSmartPointer<vtkRenderWindow> renwin =vtkSmartPointer<vtkRenderWindow>::New();renwin->AddRenderer(ren);renwin->SetSize(740, 480);vtkSmartPointer<vtkRenderWindowInteractor> iren =vtkSmartPointer<vtkRenderWindowInteractor>::New();iren->SetRenderWindow(renwin);iren->Initialize();iren->Start();return EXIT_SUCCESS;
}

这里定义一个vtkPolyDaata类型的数据boundary,其点数据与上面points一致,其单元数据为一个多边形,通过vtkDelaunay2D的SetSource()函数设置边界数据,运行结果如下图,该多边形内部的数据并未进行三角剖分。对于边界多边形限制数据的内部或者外部,,与多边形的数据有关这里采用右手坐标系,从Z轴向下看去,如果多边形的点为逆时针,则仅对多边形内部数据进行剖析;而如果为顺时针的点数据反向,则部分如下:

另外,VTK的vtkDelaunay3D类可实现三维三角剖分,该类的使用方法与vtkDelaunay2D基本一致,不同的是,三维三角剖分得到结果并非三角网格,而是四面体网格。因此,其输出数据的类型为vtkUnstructedGrid,在未加入条件下的三维三角剖分通常也为一个凸包。

VTK 表面重建-三角剖分相关推荐

  1. VTK修炼之道54:图形基本操作进阶_表面重建技术(三角剖分)

    1.表面重建 通过三维扫描仪所获取的实际物体的空间点云数据仅仅表示物体的几何形状,而无法表达其内部的拓扑结构.拓扑结构对于实际图形处理以及可视化具有更重要的意义.因此,这就需要利用表面重建技术奖点云数 ...

  2. VTK_Learning_图形基本操作进阶_表面重建技术(三角剖分)

    1.表面重建 通过三维扫描仪所获取的实际物体的空间点云数据仅仅表示物体的几何形状,而无法表达其内部的拓扑结构.拓扑结构对于实际图形处理以及可视化具有更重要的意义.因此,这就需要利用表面重建技术奖点云数 ...

  3. ICCV 2021 Oral | 无需法向的大场景点云表面重建

    编辑丨CVer 论文链接:https://arxiv.org/abs/2105.03582 代码已开源在github: https://github.com/tangjiapeng/SA-ConvON ...

  4. Open3d之表面重建

    在许多场景下我们希望生成密集的3D几何形状,比如三角网格.然而从多视图立体算法和深度传感器中我们只能够获得非结构化的点云数据.我们需要使用表面重建算法来从非结构化的输入中得到三角网格.Open3d实现 ...

  5. VTK 三维 重建 切割 三维点云

    VTK 三维 重建 切割 三维点云 采用QT/C++/VTK QQ:1670386358 欢迎交流 加载dicom 支持CT,MR,PT,DX,CR,XA,US多种dicom浏览,支持Jpeg和Jpe ...

  6. SSRNet:用于大规模点云表面重建的深度学习网络(CVPR2020)

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 整理人:袁赣张秦,付前程,张琛,廖新耀 论文: [1] Zhengxin Mi#, Yiming Lu ...

  7. [读论文]点云表面重建: SDF, TSDF, MLS, RBF

    本文是阅读以下论文的笔记: [1]密振兴, "基于深度学习的大规模点云表面重建算法研究," 硕士, 华中科技大学, 2020. 局部拟合算法 在点的局部邻域内拟合隐式函数. 就是说 ...

  8. (12)点云数据处理学习——表面重建

    1.主要参考 (1)官网的介绍 Surface reconstruction - Open3D 0.16.0 documentation (2)大佬的blog 三维点云重建 - open3d pyth ...

  9. 【Open3D】人脸深度图转点云,点云表面重建

    1.简介 Open3D:一个用于3D数据处理的现代库 Open3D是一个开源库,支持处理3D数据的软件的快速开发.Open3D前端在c++和Python中公开了一组精心选择的数据结构和算法.后端经过高 ...

最新文章

  1. 教你用PyTorch实现“看图说话”(附代码、学习资源)
  2. 第十五届智能车竞赛不公平竞争情况反映以及审议结果
  3. 《分布式系统:概念与设计》一3.2 网络类型
  4. Win32SDK中(串行)通信资源概要(不断更新)
  5. 【GAN优化】小批量判别器如何解决模式崩溃问题
  6. readfile读取串口数据_西门子PLC-1200-串口Modbus RTU通讯实例
  7. 二叉树已知先序和中序输出后序
  8. 多线程与高并发(二):解析自旋锁CAS操作与volatile
  9. Depth-first Search深度优先搜索专题3
  10. java插入数据库字符串拼接_java中PreparedStatement解决需转义字符向数据库中插入时的转义问题 | 学步园...
  11. Java成神之路——javaAgent(插桩,attach)
  12. [C++再学习系列] 具有链接的C++实体
  13. 【代码笔记】iOS-手机系统版本
  14. vs2013和vs2015密钥
  15. ADS20XX完全安装(任意盘)、卸载指南
  16. js版算24点小游戏
  17. 百度指数批量查询获取工具
  18. ps利用高反差保留去除大面积雀斑
  19. 修改Android10系统源码关闭selinux
  20. 计算机职称考试科目及内容,职称计算机-考试科目

热门文章

  1. 凸优化学习-(十八)对偶性Duality 拉格朗日函数与对偶函数
  2. php apidoc 注释,apidoc 后端接口注释文档简单使用
  3. SpringBoot启动Tomcat原理与嵌入式Tomcat实践
  4. html5风车转圈,HTML5 风车特效
  5. C语言 scpi命令解释器,基于Python的SCPI命令解释器的设计
  6. 制作便携式U盘Python环境
  7. VScode两步实现less自动编译
  8. 世界首富马斯克的编程水平怎么样
  9. Vue.js组件-组件通信-非父子组件传值以及其他通信方式
  10. 使用jquery实现的循环连续可停顿滚动