005:VTK世界坐标系中的相机和物体

VTK医学图像处理---世界坐标系中的相机和物体

左侧是成像结果                                                    右侧是世界坐标系中的相机与被观察物体

目录

VTK医学图像处理---世界坐标系中的相机和物体

简介

1 在三维空间中添加坐标系

2 世界坐标系中的相机

3 世界坐标系中vtkImageData的参数

总结:


简介

       上图右侧的图像是模拟的世界坐标系和世界坐标系中相机以及被观察物体; 左侧是在右侧世界坐标系中相机设置参数和物体位置的条件下成像(渲染)的结果。 相机或物体的任何参数的改变都会导致成像结果的改变。

       VTK中vtkCamera类对应右图中的相机,可以通过vtkCamera来设置相机在世界坐标系中的位置,焦点(对准三维坐标系中的那个位置),相机的正方向,相机的最近和最远裁减平面(在最近和最远平面内的物体才会被渲染)等;三维坐标系中的物体,对于目前我们的例子来说就是要渲染显示的DICOM图像,也就是存储在vtkImageData中的数据,通过vtkImageData  origin参数可以设置其在三维坐标系中的位置,当然也可以通过旋转矩阵对vtkImageData的数据进行旋转或平移。

1 在三维空间中添加坐标系

VTK官网例子:VTK: vtkAxesActor Class Reference

    在我们显示的DICOM图像中增加X Y Z三个轴,以便我们直观的观察到vtkImageData中图像在世界坐标系中的位置。主要使用了vtkAxesActor类,通过SetOrigin函数,设置轴的原点是世界坐标系中的原点(0,0,0); 通过SetTotalLength函数,设置XYZ三个轴的长短。

    vtkNew<vtkAxesActor> axes;axes->SetOrigin(0,0,0);axes->SetTotalLength(100, 100, 100);

增加坐标轴后的完整代码:

#include "vtkImageMapToWindowLevelColors.h"
#include "vtkImageActor.h"
#include "vtkImageMapper3D.h"
#include "vtkImageData.h"
#include "vtkNew.h"
#include "vtkDICOMImageReader.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkRenderer.h"
#include "vtkCamera.h"
#include "vtkWindowLevelLookupTable.h"
#include "vtkAxesActor.h"int ImageSlice = 0;void main()
{vtkNew<vtkImageData> imageData;imageData->SetDimensions(512, 512, 10);imageData->SetSpacing(.49, .49, .7);imageData->SetOrigin(0.0, 0.0, 0.0);imageData->AllocateScalars(VTK_SHORT, 1);void *ptr = imageData->GetScalarPointer();size_t bSize = 512 * 512 * 10;FILE* pFile = fopen("D:\\DicomFiles\\test.img","rb+");if (NULL == pFile)return;fread(ptr, sizeof(short), bSize, pFile);fclose(pFile);int* ext = imageData->GetExtent();// map the input image through a lookup table and window / level itvtkNew<vtkImageMapToWindowLevelColors> windowLevel;windowLevel->SetWindow(1000);windowLevel->SetLevel(800);windowLevel->SetInputData(imageData);//vtkImageActor: draw an image in a rendered 3D scenevtkNew<vtkImageActor> imageActor;imageActor->SetDisplayExtent(ext[0], ext[1], ext[2], ext[3], ImageSlice, ImageSlice);imageActor->GetMapper()->SetInputConnection(windowLevel->GetOutputPort());//-------------------------------------------------vtkNew<vtkAxesActor> axes;axes->SetOrigin(0,0,0);axes->SetTotalLength(100, 100, 100);// The renderer generates the image which is then displayed on the render window.vtkNew<vtkRenderer> renderer;renderer->AddActor(imageActor);renderer->AddActor(axes);renderer->SetBackground(.2,.2,.2);vtkCamera *cam = renderer->GetActiveCamera();if (cam){// 获取物体在三维空间中的原点,XYZ范围和中心//vtkImageData* idata = reader->GetOutput();vtkImageData* idata = imageData;double* origins = idata->GetOrigin(); // 三维坐标中的起点double* bounds = idata->GetBounds();  // 包围盒的xyz范围double* center = idata->GetCenter();  // 中心cam->SetFocalPoint(center);cam->SetPosition(center[0], center[1], center[2] - bounds[5]); // -1 if medical ?cam->SetViewUp(0, 1, 0);cam->SetClippingRange(0.1,1000);renderer->ResetCamera();}// The render window is the actual GUI window that appears on the computer screenvtkNew<vtkRenderWindow> renderWindow;renderWindow->SetSize(512, 512);renderWindow->AddRenderer(renderer);renderWindow->SetWindowName("Dicom Image");// The render window interactor captures mouse events// and will perform appropriate camera or actor manipulation// depending on the nature of the events.vtkNew<vtkRenderWindowInteractor> interactor;interactor->SetRenderWindow(renderWindow);// This starts the event loop and as a side effect causes an initial render.renderWindow->Render();interactor->Start();
}

 运行后的效果:

小练习:修改相机的位置到反方向,观察和之前的显示结果又什么差异,想想为什么?

cam->SetPosition(center[0], center[1], center[2] + bounds[5]);

 

2 世界坐标系中的相机

相机有两种成像方法,透视投影和平行投影,通常对于医学图像来说会经常使用平行投影(关于平行投影和获取鼠标所在图像的位置,在下节博文中会详细介绍),关于VTK中相机的相关介绍,网上有很多说的也很全面,这里只给出链接,就不再展开了,大家也可以自行在网络上检索。

vtkCamera介绍:VTK笔记-相机vtkCamera_vtk camera 穿刺-CSDN博客

 

3 世界坐标系中vtkImageData的参数

 vtkImageData类中的SetOrigin函数用来设置其在世界坐标系中的位置;

vtkImageData中数据的长  宽 和 高分别乘以其像素间距,就是其在三维坐标系中的实际长 宽和高;也可以通过调用GetExtent函数直接获取其在三维坐标系中XYZ三个方向的起点和终点;

在这里强烈建议大家去VTK官网,查看关于vtkImageData类的详细说明

vtkImageData类的链接:VTK: vtkImageData Class Reference

总结:

       通过动态GIF示意图简单介绍了一下VTK中的世界坐标系,为后面介绍完整的坐标系统做些铺垫;另外介绍了和显示密切相关的连个类vtkImageData和vtkCamera关于这两个类的介绍也比较简单,是因为官网有非常详细的介绍,大家一定要学会看官网上的资料,在博文中我们就不详细展开说明了。在示例中我们添加了坐标轴信息,从而可以直观的观察到图像在世界坐标中的位置,再下一节中,我们将重点介绍如果获取鼠标所在图像的坐标和时间坐标的位置,并输出出来,以验证和加深对世界坐标的理解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/421270.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

价值流的实践应用:驱动企业运营效率与数字化转型的全面指南

价值流如何在实践中变革企业运营 在当今复杂的商业环境下&#xff0c;企业正在快速迈向数字化和自动化。为了在日益竞争激烈的市场中保持竞争力&#xff0c;企业需要优化其业务架构、提高运营效率并增强客户体验。《价值流指南》由The Open Group发布的企业数字化转型专业参考…

xlsx插件实现excel表格数据导入并解析成table——js技能提升

之前写后台管理系统的时候&#xff0c;遇到一个需求&#xff0c;就是要上传文件&#xff0c;并解析成table预览到页面上&#xff0c;效果如下&#xff1a; 这样做的目的也是为了帮助用户确认导入的内容是否正确&#xff0c;方便核实。 下面介绍实现步骤&#xff1a; 解决步骤…

Nginx.conf没有server和location模块的解决方法

网上有些说法说自己在配置文件里面添加server和location模块&#xff0c;但是我发现好像可以不用&#xff0c;其实nginx的配置文件还是给了我们提示的&#xff0c;如图&#xff1a; 在最后一行其实引入了另一个配置文件&#xff0c;我们cd进去看一下有什么内容。输入ls命令发现…

vue的学习之路(Vue中组件(component )

注意&#xff1a;其中添加div的意义就是让template标签有一个根标签 &#xff0c;否则只展示“欢迎进入登录程序” 不加div效果图 &#xff08;2&#xff09;两种开发方式 第一种开发方式 //局部组件登录模板声明 let login { //具体局部组件名称 template:‘ 用户登录 ’…

新专利:作物生长期预测方法及装置

近日,国家知识产权局正式授权了一项由北京市农林科学院智能装备技术研究中心、江苏省农业科学院联合申请的发明专利"作物生长期预测方法及装置"(专利号:ZL 2024 1 0185298.1)。该专利由 于景鑫 、任妮、吕志远、李友丽、吴茜等发明人耗时多年潜心研发&#xff0c;犹如…

EasyPlayer.js网页H5 Web js播放器能力合集

最近遇到一个需求&#xff0c;要求做一款播放器&#xff0c;发现能力上跟EasyPlayer.js基本一致&#xff0c;满足要求&#xff1a; 需求 功性能 分类 需求描述 功能 预览 分屏模式 单分屏&#xff08;单屏/全屏&#xff09; 多分屏&#xff08;2*2&#xff09; 多分屏…

[数据集][目标检测]抽烟检测数据集VOC+YOLO格式22559张2类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;22559 标注数量(xml文件个数)&#xff1a;22559 标注数量(txt文件个数)&#xff1a;22559 标…

Oracle数据恢复—Oracle数据库误删除表数据如何恢复数据?

删除Oracle数据库数据一般有以下2种方式&#xff1a;delete、drop或truncate。下面针对这2种删除oracle数据库数据的方式探讨一下oracle数据库数据恢复方法&#xff08;不考虑全库备份和利用归档日志&#xff09;。 1、delete误删除的数据恢复方法。 利用oracle提供的闪回方法…

Golang | Leetcode Golang题解之第397题整数替换

题目&#xff1a; 题解&#xff1a; func integerReplacement(n int) (ans int) {for n ! 1 {switch {case n%2 0:ansn / 2case n%4 1:ans 2n / 2case n 3:ans 2n 1default:ans 2n n/2 1}}return }

最新HTML5中的文件详解

第5章 HTML5中的文件 5.1选择文件 可以创建一个file类型的input,添加multiple属性为true,可以实现多个文件上传。 5.1.1 选择单个文件 1.功能描述 创建file类型input元素&#xff0c;页面中不再有文本框&#xff0c;而是 选择文件 按钮&#xff0c;右侧是上次文件的名称&a…

C语言 ——— 学习并使用 #if defined #ifdef #ifndef 条件编译指令

目录 学习 #if defined #ifdef #ifndef 条件编译指令 使用 #if defined 和 #ifdef 条件编译指令 使用 #ifndef 条件编译指令 学习 #if defined #ifdef #ifndef 条件编译指令 #if #ifndef 条件编译指令是用来判断某个符号是否被定义过&#xff0c;被定义过的话就为真&#x…

【网络安全】-xss跨站脚本攻击实战-xss-labs(1~10)

Level1: 检查页面源代码&#xff1a; function函数&#xff1a; (function(){try{let tn ;if(tn.includes(oem)){Object.defineProperty(document, referrer, {get: function(){return ;}});}else if(tn.includes(hao_pg)){if(!document.referrer.match(tn)){Object.definePro…

centos8构建nginx1.27.1+BoringSSL+http3+lua+openresty

需要接入http3&#xff0c;索性最新的nginx在构建一波&#xff0c;趟一遍坑 准备工作 1.环境命令安装 yum install GeoIP -y yum install GeoIP-devel -y yum install libmaxminddb-devel -y yum install -y patch wget zlib zlib-devel lftp gcc gcc-c make openssl-devel p…

Ton链历险记(一)

系列文章目录 文章目录 系列文章目录前言第一天、FunC环境安装总结 前言 欢迎来到神秘的web3小镇&#xff0c;这里是充满未知和魔法的土地&#xff0c;神兽出没&#xff0c;超能力攻击&#xff0c;卡牌收集。。。 穷困却又励志的无天赋法师木森。因为没有交够保护费&#xff…

一篇文章带你看懂住宅代理如何实现内容过滤

在网络安全中&#xff0c;内容过滤是用户隐私保护的重要组成部分&#xff0c;将不良内容拦截在安全网之外是内容过滤的重中之重。在当下&#xff0c;住宅代理作为异军突起的网络安全工具&#xff0c;在内容过滤上有着不错的表现。本文将深入探讨住宅代理如何实现内容过滤&#…

【d41】【Java】【力扣】21.合并两个有序链表

题目 21. 合并两个有序链表 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4]示例 2&#xff1a; 输入&#xff1a;l1 [],…

猜测、实现 B 站在看人数

猜测、实现 B 站在看人数 猜测找到接口参数总结 实现 猜测 找到接口 浏览器打开一个 B 站视频&#xff0c;比如 《黑神话&#xff1a;悟空》最终预告 | 8月20日&#xff0c;重走西游_黑神话悟空 (bilibili.com) &#xff0c;打开 F12 开发者工具&#xff0c;经过观察&#xf…

Wni11 下 WSL 安装 CentOS

Wni11 下 WSL 安装 CentOS 方法一、安装包安装下载包安装安装打开 CentOS1. 从 Windows 终端 打开2. 从 PowerShell 打开 方法二、导入 CentOS 的 tar 文件进行安装0. 查看版本&#xff08;可选&#xff09;1. 导出 Docker 容器到 tar 文件2. 将 tar 文件导入 WSL2.1. 导入 tar…

最大间距问题

LeetCode164 最大间距 基数排序 #include <iostream> #include <vector> using namespace std;class Solution { public:int maximumGap(vector<int>& nums) {int nnums.size();if(n<2) return 0;int exp1;int Maxnums[0];vector<int> buf(n)…

基于HTML+JS+CSS+Echarts实现的设备环境监测可视化平台前端整套模板

效果图 基于HTMLJSCSSEcharts实现的设备环境监测可视化平台前端整套模板。可用过修改源码快速完成需求。 源码结构 下载地址