我们已经实现了自定义交互,但有一种交互比较特殊:VR图像的任意形状裁剪,俗称套索工具,它能够将我们不需要的部分,有遮挡的部分裁减掉,今天我们就来看一下其实现方式。

VTK中没有提供简单的方法来实现该功能,我们只能利用VTK中的基础功能一步步实现。

实现这个功能的第一步就是要能在VR图像上画一个多边形的标注,并获取多边形的顶点,在VTK中我们可以通过vtkInteractorStyleDrawPolygon实现。

this->m_iren->SetInteractorStyle(this->m_lassoStyle);
this->m_lassoStyle->GetPolygonPoints()

有了多边形的顶点,我们需要计算出体数据场vtkBoundingBox垂直屏幕方向最远点、和最近点,然后根据最近点和最远点以及顶点信息生成一个多边形vtkPolyData,计算该多边形与体数据场的最大交集,并根据交集生成一个vtkImageData用于掩膜。

上面过程我们用到了VTK中的vtkPolyDataToImageStencil、vtkImageStencilToImage类。

stencilToImage->SetInputData(BrushPolyDataToStencil->GetOutput());
stencilToImage->SetInsideValue(0);
stencilToImage->SetOutsideValue(255);
stencilToImage->SetOutputScalarType(VTK_UNSIGNED_CHAR);
stencilToImage->Update();
有了掩膜vtkImageData后,我们就可以进行裁剪操作了,如果体绘制使用的是vtkGPUVolumeRayCastMapper类,可以调用SetMaskInput函数来实现裁剪操作。

如果体绘制用的不是vtkGPUVolumeRayCastMapper,则可以根据掩膜结果直接操作原始vtkImageData,将原始数据中对应的值设置成一个边缘值,通过映射后该边缘值会被映射成一个黑色。

VTK系列教程九:VR图像裁剪相关推荐

  1. PVE系列教程(九)、openWRT设置主路由与旁路由模式

    PVE系列教程(九).openWRT设置主路由与旁路由模式 为了更好的浏览体验,欢迎光顾勤奋的凯尔森同学个人博客http://nas.hepcloud.top:7000 Hello,小伙伴们,这是凯尔 ...

  2. VTK系列教程六:多平面重建

    上一篇我们讲了在VTK中如何生成VR图像,这一篇我们来讲一下如何利用VTK生成MPR图像,多平面重建图像就是从不同的方向去看物体,根据方向的不同,生成的图像分别是:横断面.冠状面.矢状面. 前面我们讲 ...

  3. 经典算法研究系列:九、图像特征提取与匹配之SIFT算法

    经典算法研究系列:九.SIFT算法研究 作者:July.二零一一年二月十五日. 推荐阅读: David G. Lowe, "Distinctive image features from s ...

  4. php语+言教程,写给thinkphp开发者的laravel系列教程(九)打印数据-Fun言

    php这种脚本语言调试起来是很方便的: 大多时候看报错打印一下数据就知道问题所在了: php 内置了常用打印函数 print 和 var_dump : 但是打印出来的样式实在让人目瞪狗呆: think ...

  5. Redis系列教程(九):Redis的内存回收原理,及内存过期淘汰策略详解

    Redis内存回收机制 Redis的内存回收主要围绕以下两个方面: 1.Redis过期策略:删除过期时间的key值 2.Redis淘汰策略:内存使用到达maxmemory上限时触发内存淘汰数据 Red ...

  6. VTK系列教程十一:MPR定位线

    我们已经实现了MPR图像的显示,但只能获取垂直某个轴的截面图,那如何获取带有倾斜角度的截面图呢?这样的截图对于不规则病灶和器官是有意义的. VTK其实给我们提供了一种非常简单的方法:vtkReslic ...

  7. 黄聪:Microsoft Enterprise Library 5.0 系列教程(九) Policy Injection Application Block

    代理对象(Proxy Object)会通过Handler链定位到真实对象(Real Object),而Policy则被注入到代理对象和真实对象中.整个流程如图: 我个人对Policy Injectio ...

  8. OPENCV入门教程九:图像旋转任意角度

    一.目标 学习如何旋转图片. 二.函数说明 在OpenCV中,没有现成的函数直接用来实现图像旋转,它是用仿射变换函数warpAffine来实现的,此函数目前支持4种插值算法,最近邻.双线性.双三次.兰 ...

  9. 转:Java NIO系列教程(九) Pipe

    Java NIO 管道是2个线程之间的单向数据连接.Pipe有一个source通道和一个sink通道.数据会被写到sink通道,从source通道读取. 这里是Pipe原理的图示: 创建管道 通过Pi ...

  10. twisted系列教程九–Deferred 的第二个小插曲

    More Consequence of Callbacks 我们将要再来研究一下callback,尽管我们已经对deferred比较了解而且已经可以写出twisted 风格的异步程序,Deferred ...

最新文章

  1. spring bean 创建失败的常见原因
  2. 常州IBMV3700数据恢复成功
  3. linux里打包和压缩文件,linux ---打包和压缩文件
  4. 团购网站的兴衰与启示
  5. 21/100. Two Sum
  6. 异常处理:你不可能总是对的 - 零基础入门学习Python032
  7. “拒绝访问”协助方案
  8. 专访|从程序员到架构师:交流和分享最能让技术人进步
  9. Makefile中的@
  10. 免登录实现CSDN博客代码复制(2021.9.26)
  11. uniapp得到用户当前定位以及用户选择位置
  12. 世界三大短篇小说之王 代表作介绍
  13. 如何系统地学习3D建模!教你零基础入门,初学者看过来
  14. 自行更换iPhone 6s 手机电池 | 工序步骤
  15. 当我在ChatGPT上问重建大师,它居然这样回答我
  16. SAP 成套销售按项目销售
  17. webservice:com.sun.xml.internal.ws.server.ServerRtException: [failed to localize]
  18. PYNQ系列学习(三)|pynq与zynq对比(二)
  19. elementUI 表格合并单元格-多层级-合并行
  20. MMA-符号学运算的奥妙

热门文章

  1. Function eregi is deprecated (解决方法)
  2. mac jupyter notebook 服务似乎挂掉了,但是会立刻重启的
  3. 【Android 逆向】ApkTool 工具使用 ( ApkTool 简介 | ApkTool 解包和打包 )
  4. 解决方案:rabbitmq使用场景-超时未支付订单处理
  5. 设备巡检的痛点和巡检方案
  6. 前端开发,测试,后端,该如何选择?
  7. SpringBoot简单实现上传图片到七牛云
  8. Android开发学习心得 (一) 生如夏花之绚烂,死如秋叶之静美 -- App的生死轮回
  9. 升级wamp的php版本,Wamp升级PHP版本
  10. 如何在华为路由器中虚拟服务器,华为路由器ip地址