表面重建

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

三角剖分

三角部分是一种应用非常广泛的面重建技术。三角部分将一些散乱的点云数据剖为一系列的三角网格。最常用的三角剖分技术是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. i_rdev i_bdev i_mapping 关系
  2. php下载链接生成,php脚本生成google play url的下载链接,下载apk并自动反编译后
  3. Spring Boot 介绍、入门
  4. SQLServer之深度分析Insert
  5. Python基础学习1---函数
  6. 计算机网络知识点汇总
  7. b站python弹幕签到_一个python脚本就可以B站查找弹幕发送者!
  8. Bugku -disordered_zip【MISC】
  9. 勾股定理计算机语言,勾股定理公式计算器
  10. c 脚本语言作用,什么是脚本,脚本语言?
  11. MyBatis 第二扇门
  12. solidity 中的时间_Solidity官方文档中文版.pdf
  13. PPT基础(一)怎么把图片设置为背景
  14. C++设计模式 命令模式(服务员命令厨师)
  15. unzip解压缩linux文件时出现error [Testing.zip]: start of central directory not found;zipfile corrupt——7z
  16. 计算机技术在美术方面的应用,计算机技术在图形图像处理中的应用
  17. 记忆力减退之----SP3232---STM32
  18. “校园的雨 ”——落花,散了一地
  19. 线性代数 ----- 行列式的性质
  20. 开门最快的服务器,魔兽怀旧服最有牌面的服务器,开门进度惊人,国服的牌面...

热门文章

  1. “祖宗”这个词的来历
  2. 如何将微信公众号文章同步导入采集到WordPress网站中
  3. 复盘:GBDT,梯度提升决策树,Gradient Boosting Decision Tree,堪称最好的算法之一
  4. 《上古5》各样冷门却强力职业
  5. 北理工团队创建自然场景下声音目标探测的听觉脑机接口
  6. 直播app与微信qq同时占用麦克风,或者播放音乐时来电,解决麦克风冲突
  7. 碰到不认识的动物怎么识别?软件即可识别
  8. corejava_OOP
  9. cube开源一站式云原生机器学习平台
  10. html中script不显示,html中出现的script失效