VTK教程3--------打开vtk文件

下面,本教程将介绍如何在MFC下打开vtk文件,最终的效果如图所示:
在这里插入图片描述
如果你看过一些三维重建相关的论文,那么一定对这个图像很熟悉。很多论文都会以这个图像作为例子讲解,好了,闲话少说,直接讲实现。
早期的vtk版本(比如vtk5.x.x),example里面自带MFC的三个例子(对话框,单文档,多文档),不知为何现在的新版本删除了,不过没有关系,重新实现一遍就行了,代码也不多。
首先,你需要保证你的vs2017能够创建MFC项目,如果不能,可以通过
visual studio installer安装,具体过程,请百度,这里不再赘述。
我们先来建立一个MFC应用程序,暂且命名为“vtkdlg”,后续将以这个名称产生的代码来讲解:
在这里插入图片描述
点击确认,然后选择“基于对话框”,点击“完成”:
在这里插入图片描述
VTK是使用C++编写的,要使用VTK需要包含VTK发布的头文件,我们直接在vtkdlgDlg.h文件中添加以下代码:

#include "vtkDataSetMapper.h"
#include "vtkDataSetReader.h"
#include "vtkActor.h"
#include "vtkMFCWindow.h"
#include "vtkRenderer.h"
#include "vtkProperty.h"
#include "vtkWin32OpenGLRenderWindow.h"

点击“生成”,哎呀,找不到头文件!还记得教程1里面有个vtk-prefix文件夹吗?里面放着有,点击“项目”–>属性–>VC++目录–>包含目录,示意图如下:
在这里插入图片描述
修改确认后,再点击“生成”,成功了!
接下来,开始撸代码,在vtkdlgDlg.h头文件的CvtkdlgDlg类中添加以下代码,具体作用等写完所有代码后一并分析:

public:CString input_path;vtkMFCWindow* pvtkMFCWindow;vtkActor* pvtkActor;vtkDataSetMapper* pvtkDataSetMapper;vtkDataSetReader* pvtkDataSetReader;vtkRenderer* pvtkRenderer;vtkRenderWindow* pvtkRenderWindow;POINT ptBorder;void execute_pipeline();

在vtkdlgDlg.cpp文件中,找到CvtkdlgDlg的构造函数,修改如下:

CvtkdlgDlg::CvtkdlgDlg(CWnd* pParent /*=nullptr*/): CDialogEx(IDD_VTKDLG_DIALOG, pParent)
{m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);this->pvtkActor = vtkActor::New();this->pvtkDataSetMapper = vtkDataSetMapper::New();this->pvtkDataSetReader = nullptr;this->pvtkRenderer = vtkRenderer::New();this->pvtkMFCWindow = nullptr;this->ptBorder = CPoint(0, 0);
}

在vtkdlgDlg.cpp中添加execute_pipeline函数的实现:

void CvtkdlgDlg::execute_pipeline()
{if (this->pvtkDataSetReader){this->pvtkDataSetMapper->SetInputConnection(this->pvtkDataSetReader->GetOutputPort());this->pvtkActor->SetMapper(this->pvtkDataSetMapper);this->pvtkActor->GetProperty()->SetColor(0.0, 0.0, 1.0);this->pvtkRenderer->SetBackground(1.0, 1.0, 1.0);this->pvtkRenderer->AddActor(this->pvtkActor);}else{this->pvtkRenderer->SetBackground(1.0, 1.0, 1.0);}this->pvtkRenderer->ResetCamera();
}

在CvtkdlgDlg::OnInitDialog()函数中添加以下代码,这部分代码写在//TODO后,return TRUE之前:

// TODO: 在此添加额外的初始化代码this->pvtkMFCWindow = new vtkMFCWindow(this->GetDlgItem(IDC_STATIC));CRect cRectClient;this->pvtkMFCWindow->GetClientRect(&cRectClient);this->pvtkMFCWindow->GetRenderWindow()->AddRenderer(this->pvtkRenderer);execute_pipeline();

下面切换到“资源视图”,我们来编辑对话框,只需要两步,很简单。
(1)删除其余控件,只留下“确认”,把“确认”改成“打开”。
(2)添加一个Picture Control空间。
这一步的效果图如下:
在这里插入图片描述
双击“打开”按钮,修改为以下代码,并在文件开头添加包含头文件#include string:

void CvtkdlgDlg::OnBnClickedOk()
{// TODO: 在此添加控件通知处理程序代码//CDialogEx::OnOK();CString sz = _T("MyType Files (*.vtk)|*.vtk");CFileDialog dlg(true, _T(".*"), NULL, OFN_FILEMUSTEXIST | OFN_HIDEREADONLY, sz, this);if (IDOK == dlg.DoModal()){this->input_path = dlg.GetPathName();UpdateData(false);this->pvtkRenderer->RemoveActor(this->pvtkActor);std::string str(CT2A(dlg.GetPathName()));if (!this->pvtkDataSetReader)this->pvtkDataSetReader = vtkDataSetReader::New();this->pvtkDataSetReader->SetFileName(str.c_str());execute_pipeline();if (this->pvtkMFCWindow)this->pvtkMFCWindow->RedrawWindow();}
}

然后在类向导里面重载虚函数PostNcDestory,添加OnDestory的消息处理
在这里插入图片描述
在这里插入图片描述
代码修改如下:

void CvtkdlgDlg::PostNcDestroy()
{// TODO: 在此添加专用代码和/或调用基类delete this;CDialogEx::PostNcDestroy();
}void CvtkdlgDlg::OnDestroy()
{CDialogEx::OnDestroy();// TODO: 在此处添加消息处理程序代码if (this->pvtkMFCWindow != nullptr)delete this->pvtkMFCWindow;this->pvtkRenderer->Delete();this->pvtkDataSetMapper->Delete();if (this->pvtkDataSetReader != nullptr)this->pvtkDataSetReader->Delete();this->pvtkDataSetReader = nullptr;this->pvtkActor->Delete();
}

主要代码已经写好了,再次点击“生成”。完了!有一大堆无法解析的外部符号。再次回到之前的vtk-prefix文件夹,里面有lib库。点击“项目”–>属性–>链接器–>输入–>附件依赖项,将所有的lib都添加,用通配符的写法就是*.lib:
在这里插入图片描述
依旧没有解决问题,其实这里需要编译64位的版本,如下修改即可:
在这里插入图片描述
好了,编译成功!我们来运行一下,失败了,没完没了吗!在这里还有最后一步,将vtk-prefix文件夹中的bin文件夹下的所有dll文件拷贝到编译工程下即可,另外还有一个中方法,拷贝到system路径下(这种方式会对所有的程序都生效),我使用的是拷贝到编译工程下:
在这里插入图片描述
再次运行,弹出了错误,这已经不是代码的问题了,是新版本的vtk代码还需要有一个环境初始化过程,在以前的版本(5.x.x)是没有这个问题的,在vtkdlgDlg.h文件中添加以下代码:

#include "vtkAutoInit.h" 
VTK_MODULE_INIT(vtkRenderingOpenGL2); // VTK was built with vtkRenderingOpenGL2
VTK_MODULE_INIT(vtkInteractionStyle);

最后,你可能还会遇到依旧不能运行的情况,如果单步执行下去,定位到是这行代码出问题:

this->pvtkMFCWindow = new vtkMFCWindow(this->GetDlgItem(IDC_STATIC));

可以进行如下修改:
在这里插入图片描述
修改成“使用多字节字符集”。
再次运行,you got it!
在这里插入图片描述
怎么和说好的不一样,那是还没有打开文件,限于篇幅太长,讲在下一讲打开文件和分析代码。
更多VTK教程,请VX搜索CodeKit。
在这里插入图片描述

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

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

相关文章

Android中读取电话本Contacts联系人的所有电话号信息

1.首先,要知道android 的contacts里的电话信息有多类:moblie,家庭,工作,传真等。如图: 2.android的Contacts是通过ContentProvider来提供的,其实android把contacts和SMS给组织成数据库文件了,你…

虚拟化 : VT-x VT-d VT-c的分别

虚拟化 : VT-x VT-d VT-c的分别: VT-x [运行ESXI上的64bit Guest OS基本指令] Intel运用Virtualization虚拟化技术中的一个指令集。VT-x有助于提高基于软件的虚拟化解决方案的灵活性与稳定性。通过按照纯软件虚拟化的要求消除虚拟机监视器(VMM)代表…

VTK-vtkPolyDataNormals

前言:本博文主要记录vtkPolyDataNormals的用途,使用方法以及实现原理,帮助更多的小伙伴更好的理解和应用vtk。 目录 1. vtkPolyDataNormals 2. 使用示例 3. 实现原理 1. vtkPolyDataNormals vtkPolyDataNormals可以计算多边形网格数据的点…

手机联系人批量导入(字符编码、xlsx与vcf互转)

一、前言 单位同事每人都办理了一个192新手机号,一打过来不知道是谁,又懒的一个个保存姓名。一想是不是可以批量导入呢?电子表格号码名单我有啊,试试吧。 二、实践 1.先下载手机联系人文件看看吧。在手机联系人设置中有个导出选项&#x…

信创干部人事档案管理系统单机版 - 人力资源档案管理系统软件

信创干部人事档案管理系统单机版v2.0(以下简称系统),是一套具有先进性、安全性、前瞻性的人力资源档案管理系统,是在总结近二十年为万余家单位档案信息化建设实践经验的基础上,遵循ISO15489、ISO23081、ISO14721等国际…

VTK-vtkFieldData

欢迎大家加入社区,雪易VTK社区-CSDN社区云 前言:为区分vtkPoints和vtkPointData的区别,了解vtkFieldData在VTK中的存在意义,从而系统的掌握vtk中关于数据的表达方式。 vtk中通过vtkDataArray进行数据的存储,通过vtkD…

虚拟内存统计----Vmstat命令

目录 一、Vmstat命令 概述 1.1 物理内存和虚拟内存区别 1.1.1 物理内存 1.1.2 虚拟内存 1.2 vmstat 命令语法 1.2.1 格式 1.2.2 命令参数 二、 vmstat 示例 2.1 显示虚拟内存使用情况 2.1.1 查看 2.1.2 表示在1秒时间内进行2次采样 2.1.3 指定的MB 单位输…

票据机器人-OCR自动识别助力智能财务

当前票据的数字化问题尚未完全解决,人工处理海量票据的工作量较大,把票据录入系统、校验真伪的成本较高。 票据机器人对财务报销环节涉及的增票、火车票、飞机行程单、出租车票、定额发票、汽车票等票据进行自动分类、识别录入、验真及归档。 票据机器人…

第一次申请去美国面签,需要注意哪些事项提高成功率?

Teresa ,PM 296 人赞同 哈哈哈,作为一个刚毕业的无房无车无钱妹纸,刚顺利拿到美国旅游十年签证!我要去西雅图看TI5啦!整个过程耗时两周~~~热乎乎的攻略奉上~~ 所有问题都可在官网进行查询,请熟读此网站&am…

java行程单解析获取内容_java如何抓取网页上的动态信息,获取源代码后如何分析JS?...

首先明确我指的动态数据是什么。 名词定义:动态数据在这里指的是网页中由Javascript动态生成的页面内容,即网页源文件中没有,在页面加载到浏览器后动态生成的。 下面进入正题。 抓取静态页面很简单,通过Java获取到html源码&#x…

系统采集--行程单、火车票、汽车票方案

方案一:进项旅客运输采集(行程单、火车票、汽车票) 实现步骤: 建立视图(view_trip、view_trip、view_car),其中视图中税号需要关联组织表获取;后台:根据当前组织id去组…

百望云入选电子凭证会计数据标准深化试点服务保障单位 打通数字化“最后一公里”

电子凭证试点正在加速推进中! 近日,财政部会同税务总局、人民银行、国务院国资委、国家档案局、标准委、国电联办、民航局、国铁集团9部委,组织召开电子凭证会计数据标准深化试点启动会。 之后,财政部会计司相继发布《关于公布电子…

【云驻共创】华为云文字识别服务的体验之旅

文章目录 前言一、初识OCR技术1.文字识别技术的概念1.1 文字识别(OCR)介绍1.2 文字识别(OCR)应用场景 2.文字识别技术的发展历程2.1 OCR识别领域发展历程2.1.1 西文OCR2.1.1 Tesseract2.1.3 LeNet2.1.4 深度学习OCR 2.2 OCR识别流…

Python自动化办公(一) :滴滴行程单信息提取存入excel表格 2021-04-13

ython自动化办公(一):滴滴行程单信息提取存入excel表格 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目…

智能客服“听不懂人话”?消费者很“闹心”

智能客服与人工客服并非互相取代的关系。人工客服不能缺位,应通过人机协同更好地回应消费者诉求。在金融消费领域,建议与资金安全等密切相关的业务能够设置人工服务“一键转接”或者“一键冻结”功能,保障消费者财产安全;为“银发…

让ChatGPT调用10万+开源AI模型!HuggingFace新功能爆火:大模型可随取随用多模态AI工具...

萧箫 发自 凹非寺量子位 | 公众号 QbitAI 只需和ChatGPT聊聊天,它就能帮你调用10万个HuggingFace模型! 这是抱抱脸最新上线的功能HuggingFace Transformers Agents,一经推出就获得极大关注: 这个功能,相当于给ChatGPT等…

chatgpt赋能python:用Python编写录音代码:打造高效音频处理工具

用Python编写录音代码:打造高效音频处理工具 Python已经成为数据科学、人工智能和机器学习的首选编程语言,因此它也是制作音频处理工具的完美选择。Python编程语言简单易学,并能够快速实现高效的音频处理。通过使用Python,您可以…

如何把图片去水印?来试试这三种图片去水印的方法

如何把图片去水印?来试试这三种图片去水印的方法 相信大家在日常上网的时候,看到一些漂亮的图片时,想将它们保存下来,但又碍于图片带有水印不得不放弃。但其实我们是可以通过一些方法将图片中的水印给去除掉,那我们该…

什么软件去图片水印不留痕迹?三款图片去水印软件分享

我们在设计海报或者易拉宝时,偶尔需要用到网上的图片,但是一些图片加了水印,我们没法用,这个时候你们知道什么软件去图片水印好吗?我朋友跟我说下面这三个软件去图片水印很厉害,我试过了,真的很…

德国质量链接中国速度,奥迪一汽新能源汽车有限公司在电动化赛道上全速奔跑

(图片一:奥迪一汽新能源汽车有限公司经管会成员暖封闭启动仪式环节合影) 长春,2022年11月21日——11月21日,奥迪一汽新能源汽车有限公司举行了伙伴共进暨暖封闭仪式。随着暖封闭的顺利完成,奥迪一汽新能源…