本文介绍VTK中封闭性检测。

基本概念

介绍封闭性检测之前,介绍一些基本概念。如果一个网格模型中,一条边只被一个单元包含,那么这条边就是边界边,而边界上的点则为边界点。如果一个模型中含有边界边,则说明该模型不是封闭的,否则是封闭的。
        在VTK’中,vtkFeatureEdges是一个非常重要的类,该类能够提取多边形网格模型中四种类型的边。

  1. 边界边。
  2. 非流形边。被三个或者三个以上的多边形单元包含的边即为非流形边。
  3. 特征边。设置一个特征角的阈值,当包含同一条边的两个三角形的法向量的夹角大于该阈值时,即为一个特征边。
  4. 流行边。只被两个多边形单元包含的边即为流行边。

vtkFeatureEdges的输出是一个包含边信息的vtkPolyData数据。通过判断边界边的数目来确定网格是否封闭。

int numberofopenedges = featureedges->GetOutput()->GetNumberOfCells();

示例说明

们演示用vtkFeatureEdges提取边,并显示出来。

/**********************************************************************Copyright (c) Mr.Bin. All rights reserved.
For more information visit: http://blog.csdn.net/webzhuce**********************************************************************/
#include <vtkSmartPointer.h>
#include <vtkInformation.h>
#include <vtkPolyData.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <vtkSelection.h>
#include <vtkSelectionNode.h>
#include <vtkSphereSource.h>
#include <vtkActor.h>
#include <vtkCamera.h>
#include <vtkProperty.h>
#include <vtkIdTypeArray.h>
#include <vtkExtractSelection.h>
#include <vtkDataSetSurfaceFilter.h>
#include <vtkFeatureEdges.h>
#include <vtkPolyDataMapper.h>void GenerateData(vtkSmartPointer<vtkPolyData> input)
{vtkNew<vtkSphereSource> spheresource;spheresource->Update();vtkNew<vtkIdTypeArray> ids;ids->SetNumberOfComponents(1);ids->InsertNextValue(2);ids->InsertNextValue(10);vtkNew<vtkSelectionNode> selectionnode;selectionnode->SetFieldType(vtkSelectionNode::CELL);selectionnode->SetContentType(vtkSelectionNode::INDICES);selectionnode->SetSelectionList(ids);selectionnode->GetProperties()->Set(vtkSelectionNode::INVERSE(), 1);vtkNew<vtkSelection> selection;selection->AddNode(selectionnode);vtkNew<vtkExtractSelection> extractselection;extractselection->SetInputData(0, spheresource->GetOutput());extractselection->SetInputData(1, selection);extractselection->Update();vtkNew<vtkDataSetSurfaceFilter> surfacefilter;surfacefilter->SetInputConnection(extractselection->GetOutputPort());surfacefilter->Update();input->ShallowCopy(surfacefilter->GetOutput());
}int main(int argc, char *argv[])
{vtkNew<vtkPolyData> input;GenerateData(input);vtkNew<vtkFeatureEdges> featureedges;featureedges->SetInputData(input);featureedges->BoundaryEdgesOn();featureedges->FeatureEdgesOff();featureedges->ManifoldEdgesOff();featureedges->NonManifoldEdgesOff();featureedges->Update();int numberofopenedges = featureedges->GetOutput()->GetNumberOfCells();if (numberofopenedges)std::cout << "该网格模型不是封闭的..." << std::endl;else {std::cout << "该网格模型是封闭的..." << std::endl;return EXIT_SUCCESS;}//double leftViewport[4] = { 0.0, 0.0, 0.5, 1.0 };double rightViewport[4] = { 0.5, 0.0, 1.0, 1.0 };vtkNew<vtkPolyDataMapper> originalmapper;originalmapper->SetInputData(input);vtkNew<vtkProperty> backfaceprop;backfaceprop->SetDiffuseColor(0.89, 0.81, 0.34);vtkNew<vtkActor> originalactor;originalactor->SetMapper(originalmapper);originalactor->SetBackfaceProperty(backfaceprop);originalactor->GetProperty()->SetDiffuseColor(1.0, 0.3882, 0.2784);vtkNew<vtkPolyDataMapper> edgemapper;edgemapper->SetInputData(featureedges->GetOutput());vtkNew<vtkActor> edgeactor;edgeactor->SetMapper(edgemapper);edgeactor->GetProperty()->SetEdgeColor(0., 0., 1.0);edgeactor->GetProperty()->SetEdgeVisibility(1);edgeactor->GetProperty()->SetLineWidth(5);vtkNew<vtkRenderer> leftrenderer;leftrenderer->SetViewport(leftViewport);leftrenderer->AddActor(originalactor);leftrenderer->SetBackground(1.0, 1.0, 1.0);vtkNew<vtkRenderer> rightrenderer;rightrenderer->SetViewport(rightViewport);rightrenderer->AddActor(edgeactor);rightrenderer->SetBackground(1.0, 1.0, 1.0);vtkNew<vtkRenderWindow> renderwindow;renderwindow->AddRenderer(leftrenderer);renderwindow->AddRenderer(rightrenderer);renderwindow->SetSize(640, 320);renderwindow->Render();renderwindow->SetWindowName("FeatureEdges");vtkNew<vtkRenderWindowInteractor> renderwindowinteractor;renderwindowinteractor->SetRenderWindow(renderwindow);leftrenderer->GetActiveCamera()->SetPosition(0, -1, 0);leftrenderer->GetActiveCamera()->SetFocalPoint(0, 0, 0);leftrenderer->GetActiveCamera()->SetViewUp(0, 0, 1);leftrenderer->GetActiveCamera()->Azimuth(30);leftrenderer->GetActiveCamera()->Elevation(30);leftrenderer->ResetCamera();rightrenderer->SetActiveCamera(leftrenderer->GetActiveCamera());renderwindow->Render();renderwindowinteractor->Start();return EXIT_SUCCESS;
}

运行结果:

参考资料

  • VTK图形图像开发进阶[M]

图形处理之封闭性检测相关推荐

  1. VTK修炼之道50:图形基本操作进阶_网格模型的特征边 与 封闭性检测

    1.封闭性检测 由于受原始数据.重建方法的限制,得到的网格模型并不是封闭的.有时为了显示或者处理某些要求,需要网格必须是封闭的. 封闭性网格应该比较好理解,比如一个球形网格. 1.1网格模型边的分类 ...

  2. python VTK(二十二) ----图形基本操作 封闭性检测漏洞填充

    #!/usr/bin/env python # -*- coding:utf-8 -*- import vtk # 封闭性检测 及 填充漏洞 # 生成带空洞的网格球 sphereSource = vt ...

  3. power designer数据流图_鲲云公开课 | 三分钟带你了解数据流架构

    目前,市场上的芯片主要包括指令集架构和数据流架构两种实现方式.指令集架构主要包括X86架构.ARM架构.精简指令集运算RISC-V开源架构,以及SIMD架构.总体来说,四者都属于传统的通用指令集架构. ...

  4. 三维数据平滑处理_VTK图像处理(二)--vtkPolyData数据处理

    前言 vtkPolyData数据是一种广泛使用的vtk数据结构,可以用来表示很多常用的数据结构,如点云数据.面片模型等.本文章先分析vtkPolyData数据的基本组成,创建方法和显示管线,结果介绍了 ...

  5. 基于matab GUI的图形处理火焰检测系统

    编辑 换一个视频得到数据结果 网络和多媒体技术的普及,红外图像中的火焰检测 识别技术的科研价值在各领域得到充分展现.防灾救灾方面,红外图像中的火焰检测 识别技术能够迅速确定和锁定被灰尘遮盖的地震.矿难 ...

  6. CVPR2020:三维实例分割与目标检测

    CVPR2020:三维实例分割与目标检测 Joint 3D Instance Segmentation and Object Detection for Autonomous Driving 论文地址 ...

  7. AI芯片体系结构目标图形处理

    AI芯片体系结构目标图形处理 AI chip architecture targets graph processing 可编程图形流处理器(GSP)能够执行"直接图形处理.片上任务图管理和 ...

  8. 测试软件是否丢失数据,11种方法检测软件的可靠性

    软件的安全可靠性是衡量软件好坏的一个重要标准,安全性指与防止对程序及数据的非授权的故意或意外访问的能力有关的软件属性,可靠性指与在规定的一段时间和条件下,软件能维 软件的安全可靠性是衡量软件好坏的一个 ...

  9. 主板检测卡c5_检测升级 | 华北工控推出机器视觉检测系统计算机产品方案

    为适应现代智能制造的生产模式,传统企业的制造技术和自动化制造系统正在不断升级,机器视觉开始广泛的应用于制造业的检测领域,以满足自动生产中的工序间检测和过程检测对于检测效率和精准度的要求. 01.机器视 ...

最新文章

  1. 小功告成:ReadIE beta
  2. 解读电感和电容在交流电路中的作用
  3. Redis基础(四)——持久化
  4. 用txt写的mysql数据库_TXT怎么导入mySQL数据库
  5. JDK动态代理的使用,以及可以解决哪些问题和优点,什么是动态代理
  6. “她”和“杰西”:虚拟助手的机器人魅力
  7. 想要糖尿病逆转,健康饮食必不可少
  8. Socket和TcpClient
  9. 品优购---品优购项目规划---8.3
  10. linux 卸载theano,centos 安装theano
  11. scipy.ndimage.measurements.find_objects()
  12. java软件官网下载汇总——JDK,eclipse,mysql,maven,idea,Git,oracle
  13. php向mysql写入_PHP向MySql中插入数据
  14. 超微服务器 通电自动启动,让主板一通电就自动开机的方法
  15. java8 collectors_java8的Collectors.reducing()
  16. 爬取B站视频 - m4s文件的相关研究
  17. 补天漏洞平台:让更多的白帽子脱离黑产
  18. 恶意PPT文件夹带漏洞攻击和后门程序
  19. echarts折线图背景线_echarts-设置折线图中折线线条颜色和折线点颜色
  20. [转] 研究云计算与海量数据处理方向建议看的论文列表

热门文章

  1. Camel-学习笔记
  2. 抄作业:LBM算法有哪些优势?
  3. 将svg图形转为图片并下载
  4. mybatis的日志打印关闭
  5. “雨雪天气”驾驶经验:
  6. 用百度MP3的API从网络下载歌曲的完整实现
  7. 【渝粤教育】广东开放大学 影视艺术概论 形成性考核 (52)
  8. 真-小白详解-Springboot微信网页授权!!!
  9. js面向对象(三)---组件开发
  10. 【vs】未能完成操作。拒绝访问。