应用开发---VTK放大镜(区域放大)功能实现

 VTK 医学图像处理---放大镜/区域放大功能

 本博文主要内容为:实现放大镜的源代码;实现思路;具体代码说明。

目录

 VTK 医学图像处理---放大镜/区域放大功能

简介:

1  放大镜源代码

1 wxInteractorStyleImage 类源代码

2 wxMagnifierAcotor类源代码

3 Magnifier.cpp 源代码

 2 放大镜实现思路

 总结:


简介:

       放大镜(局部放大)在医学图像处理软件中是一个常用的功能,本博文基于VTK实现放大镜功能,该功能主要涉及到交互和放大镜功能实现,具体实现过程中(源代码中),wxInteractorStyleImage类主要实现左键按下、移动到抬起这个过程中局部图像放大的交互;wxMagnifierAcotor类实现局部图像方法功能的实现和显示。

1  放大镜源代码

Main函数入口和主体在 <021_Magnifier.cpp>文件中,wxInteractorStyleImage类主要实现鼠标的交互功能,wxMagnifierAcotor类实现局部图像方法功能的实现和显示。项目工程组织如下图:

在自己的项目中添加 wxInteractorStyleImage 和 wxMagnifierAcotor 两个类的源码(可以自己新建类,把下面代码拷贝进来,然后修改下文件名称即可),然后将Magnifier.cpp文件中的内容拷贝到自己项目main函数所在文件,就可以直接运行。

1 wxInteractorStyleImage 类源代码

头文件如下:


#ifndef wxInteractorStyleImage_h
#define wxInteractorStyleImage_h#include "vtkInteractorStyleTrackballCamera.h"// Motion flags#define VTKIS_WINDOW_LEVEL 1024
#define VTKIS_SLICE        1025
#define VTKIS_MAGNIFIER    1026  /* 添加放大镜事件 ID */// Style flags#define VTKIS_IMAGE2D 2
#define VTKIS_IMAGE3D 3
#define VTKIS_IMAGE_SLICING 4class vtkImageProperty;
class wxMagnifierAcotor;class wxInteractorStyleImage : public vtkInteractorStyleTrackballCamera
{
public:static wxInteractorStyleImage *New();vtkTypeMacro(wxInteractorStyleImage, vtkInteractorStyleTrackballCamera);void PrintSelf(ostream& os, vtkIndent indent) override;virtual void SetMagnifier(wxMagnifierAcotor* pActor);//@{/*** Some useful information for handling window level*/vtkGetVector2Macro(WindowLevelStartPosition, int);vtkGetVector2Macro(WindowLevelCurrentPosition, int);//@}//@{/*** Event bindings controlling the effects of pressing mouse buttons* or moving the mouse.*/void OnMouseMove() override;void OnLeftButtonDown() override;void OnLeftButtonUp() override;void OnMiddleButtonDown() override;void OnMiddleButtonUp() override;void OnRightButtonDown() override;void OnRightButtonUp() override;//@}/*** Override the "fly-to" (f keypress) for images.*/void OnChar() override;// These methods for the different interactions in different modes// are overridden in subclasses to perform the correct motion. Since// they might be called from OnTimer, they do not have mouse coord parameters// (use interactor's GetEventPosition and GetLastEventPosition)virtual void WindowLevel();virtual void Pick();virtual void Slice();// Interaction mode entry points used internally.virtual void StartWindowLevel();virtual void EndWindowLevel();virtual void StartPick();virtual void EndPick();virtual void StartSlice();virtual void EndSlice();virtual void StartMagnifier();virtual void EndMagnifier();virtual void Magnifier();//@{/*** Set/Get current mode to 2D or 3D.  The default is 2D.  In 3D mode,* it is possible to rotate the camera to view oblique slices.  In Slicing* mode, it is possible to slice through the data, but not to generate oblique* views by rotating the camera.*/vtkSetClampMacro(InteractionMode, int, VTKIS_IMAGE2D, VTKIS_IMAGE_SLICING);vtkGetMacro(InteractionMode, int);void SetInteractionModeToImage2D() {this->SetInteractionMode(VTKIS_IMAGE2D);}void SetInteractionModeToImage3D() {this->SetInteractionMode(VTKIS_IMAGE3D);}void SetInteractionModeToImageSlicing() {this->SetInteractionMode(VTKIS_IMAGE_SLICING);}//@}//@{/*** Set the orientations that will be used when the X, Y, or Z* keys are pressed.  See SetImageOrientation for more information.*/vtkSetVector3Macro(XViewRightVector, double);vtkGetVector3Macro(XViewRightVector, double);vtkSetVector3Macro(XViewUpVector, double);vtkGetVector3Macro(XViewUpVector, double);vtkSetVector3Macro(YViewRightVector, double);vtkGetVector3Macro(YViewRightVector, double);vtkSetVector3Macro(YViewUpVector, double);vtkGetVector3Macro(YViewUpVector, double);vtkSetVector3Macro(ZViewRightVector, double);vtkGetVector3Macro(ZViewRightVector, double);vtkSetVector3Macro(ZViewUpVector, double);vtkGetVector3Macro(ZViewUpVector, double);//@}/*** Set the view orientation, in terms of the horizontal and* vertical directions of the computer screen.  The first* vector gives the direction that will correspond to moving* horizontally left-to-right across the screen, and the* second vector gives the direction that will correspond to* moving bottom-to-top up the screen.  This method changes* the position of the camera to provide the desired view.*/void SetImageOrientation(const double leftToRight[3],const double bottomToTop[3]);/*** Set the image to use for WindowLevel interaction.* Any images for which the Pickable flag is off are ignored.* Images are counted back-to-front, so 0 is the rearmost image.* Negative values can be used to count front-to-back, so -1 is* the frontmost image, -2 is the image behind that one, etc.* The default is to use the frontmost image for interaction.* If the specified image does not exist, then no WindowLevel* interaction will take place.*/virtual void SetCurrentImageNumber(int i);int GetCurrentImageNumber() { return this->CurrentImageNumber; }/*** Get the current image property, which is set when StartWindowLevel* is called immediately before StartWindowLevelEvent is generated.* This is the image property of the topmost vtkImageSlice in the* renderer or nullptr if no image actors are present.*/vtkImageProperty *GetCurrentImageProperty() {return this->CurrentImageProperty;}protected:wxInteractorStyleImage();~wxInteractorStyleImage() override;wxMagnifierAcotor* MagnifierAcotor;int WindowLevelStartPosition[2];int WindowLevelCurrentPosition[2];double WindowLevelInitial[2];vtkImageProperty *CurrentImageProperty;int CurrentImageNumber;int InteractionMode;double XViewRightVector[3];double XViewUpVector[3];double YViewRightVector[3];double YViewUpVector[3];double ZViewRightVector[3];double ZViewUpVector[3];private:wxInteractorStyleImage(const wxInteractorStyleImage&) = delete;void operator=(const wxInteractorStyleImage&) = delete;
};#endif

wxInteractorStyleImage类源代码 具体实现.cpp文件源码如下:

#include "wxInteractorStyleImage.h"#include "vtkAbstractPropPicker.h"
#include "vtkAssemblyPath.h"
#include "vtkPropCollection.h"#include "vtkCallbackCommand.h"
#include "vtkMath.h"
#include "vtkObjectFactory.h"
#include "vtkRenderer.h"
#include "vtkRenderWindow.h"
#include "vtkCamera.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkImageSlice.h"
#include "vtkImageMapper3D.h"
#include "vtkImageProperty.h"
#include "wxMagnifierAcotor.h"vtkStandardNewMacro(wxInteractorStyleImage);//----------------------------------------------------------------------------
wxInteractorStyleImage::wxInteractorStyleImage()
{this->WindowLevelStartPosition[0] = 0;this->WindowLevelStartPosition[1] = 0;this->WindowLevelCurrentPosition[0] = 0;this->WindowLevelCurrentPosition[1] = 0;this->WindowLevelInitial[0] = 1.0; // Windowthis->WindowLevelInitial[1] = 0.5; // Levelthis->CurrentImageProperty = nullptr;this->CurrentImageNumber = -1;this->MagnifierAcotor = nullptr;this->InteractionMode = VTKIS_IMAGE2D;this->XViewRightVector[0] = 0;this->XViewRightVector[1] = 1;this->XViewRightVector[2] = 0;this->XViewUpVector[0] = 0;this->XViewUpVector[1] = 0;this->XViewUpVector[2] = -1;this->YViewRightVector[0] = 1;this->YViewRightVector[1] = 0;this->YViewRightVector[2] = 0;this->YViewUpVector[0] = 0;this->YViewUpVector[1] = 0;this->YViewUpVector[2] = -1;this->ZViewRig

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

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

相关文章

Android 打开 GBK项目如何设置成UTF-8

1.标题 今天打开一个eclipse老项目&#xff0c;编码格式为GBK&#xff0c;Android studio导入项目报错&#xff0c;本人想到一个方案就是批量修改文件格式从 GBK到 UTF-8&#xff0c;这样可以一键解决问题 2.开发脚本 使用前请备份代码 使用前请备份代码 使用前请备份代码…

NLP从零开始------文本中阶处理之序列到序列模型(完整版)

1. 序列到序列模型简介 序列到序列( sequence to sequence, seq2seq) 是指输入和输出各为一个序列(如一句话) 的任务。本节将输入序列称作源序列&#xff0c;输出序列称作目标序列。序列到序列有非常多的重要应用&#xff0c; 其中最有名的是机器翻译( machine translation), 机…

WebRTC协议下的视频汇聚融合技术:EasyCVR视频技术构建高效视频交互体验

视频汇聚融合技术是指将来自不同源、不同格式、不同网络环境的视频流进行集中处理、整合和展示的技术。随着视频监控、远程会议、在线教育、直播娱乐等领域的快速发展&#xff0c;视频数据的规模急剧增长&#xff0c;对视频处理能力和效率提出了更高要求。视频汇聚融合技术通过…

思科IP访问控制列表3

#网络安全技术实现# #任务三扩展访问控制列表的控制3# #1配置计算机的IP 地址、子网掩码和网关 #2配置Switch-A的主机名称&#xff0c;创建vlan 10,20,30,并将Fa0/1划入vlan 10&#xff0c;Fa0/2划入vlan 20&#xff0c;G0/1划入vlan 30 Switch(config)#hostname Switch-A S…

「OC」iOS事件处理流程

「OC」初识iOS事件处理流程 文章目录 「OC」初识iOS事件处理流程触摸事件触摸事件的响应周期事件 响应者UIEventUITouchUIResponder 触摸流程系统响应阶段APP响应阶段寻找最佳响应者 构成响应链 寻找最佳响应者和响应链的区别总结参考资料 触摸事件 iOS的事件有好几种&#xf…

DriveLM的baseline复现

DriveLM是一篇很有意思的工作&#xff0c;把自动驾驶跟MLLM结合到一起了&#xff0c;实现端到端的感知or决策规划。 Repo&#xff1a;https://github.com/OpenDriveLab/DriveLM 该工作是基于nuScenes数据集做的&#xff0c;官方paper里给出了数据的具体构建方式&#xff0c;感…

SpringBoot依赖之Spring Boot DevTools热部署开发增效工具

摘要&#xff1a;Spring项目又大又重&#xff0c;依赖多&#xff0c;编译启动慢&#xff0c;怎么提高研发效率呢&#xff1f;方法之一热部署&#xff01; 概念 Spring Boot DevTools 依赖名称: Spring Boot DevTools功能描述: Provides fast application restarts, LiveRelo…

25k的自动化测试面试题,原来都是这样~

小编热衷于收集整理资源&#xff0c;记录踩坑到爬坑的过程。希望能把自己所学&#xff0c;实际工作中使用的技术、学习方法、心得及踩过的一些坑&#xff0c;记录下来。也希望想做软件测试的你一样&#xff0c;通过我的分享可以少走一些弯路&#xff0c;可以形成一套自己的方法…

AI绘画时代的自媒体引流攻略:如何实现粉丝暴涨与盈利

一、AI绘画在自媒体引流和赚钱中的应用 创作独特视觉内容&#xff0c;吸引粉丝关注 AI绘画技术可以帮助自媒体从业者创作出独一无二的视觉内容&#xff0c;这些内容在社交媒体上具有很高的辨识度和吸引力。通过以下方式&#xff0c;AI绘画助力引流和赚钱&#xff1a; &#xf…

SprinBoot+Vue图书馆预约与占座微信小程序的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue3.6 uniapp代码 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平…

SpringBoot+Vue实现大文件上传(断点续传-后端控制(一))

SpringBootVue实现大文件上传&#xff08;断点续传&#xff09; 1 环境 SpringBoot 3.2.1&#xff0c;Vue 2&#xff0c;ElementUI&#xff0c;spark-md5 2 问题 在前一篇文章&#xff0c;我们写了通过在前端控制的断点续传&#xff0c;但是有两个问题&#xff0c;第一个问题&…

铁打的程序员轻易“不哭”-我的大模型创业近2年来的感悟

楔子 2022年11月&#xff0c;GPT-3发布那一刻&#xff0c;我被AI的强大能力所震撼&#xff0c;意识到“超级个体”时代的来临。自那时起&#xff0c;我开始全心投入创业&#xff0c;经历了许多苦乐交织的时光。 2023年6月&#xff0c;我尝试将AI应用于智能营销导购&#xff0…

云原生架构概念

云原生架构概念 云原生架构&#xff08;Cloud Native Architechtrue&#xff09;作为一种现代软件开发的革新力量&#xff0c;正在逐渐改变企业构建、部署和管理应用程序的方式。它的核心优势在于支持微服务架构&#xff0c;使得应用程序能够分解为独立、松耦合的服务&#xf…

window系统怎么设置闹钟提醒?分享一个桌面提醒设置办法

在日常工作和生活中&#xff0c;我们常常会因忙碌而遗忘一些重要事项。对于很多使用电脑办公的用户来说&#xff0c;如果能在桌面上设置闹钟提醒&#xff0c;无疑会大大提高工作效率&#xff0c;减少遗漏。那么&#xff0c;如何设置这样的闹钟提醒呢&#xff1f; 这时&#xf…

ElementUI实现el-table组件的合并行功能

前言 有时遇到一些需求&#xff0c;需要实现ElementUI中&#xff0c;el-tabled组件合并单元格的功能&#xff0c;稍微了解一下它的数据格式&#xff0c;不难可以写出比合并方法。但是在鼠标经过单元行时&#xff0c;会出现高亮的行与鼠标经过的行不一致的BUG。因此还需要实现c…

8月刷题笔记

刷题笔记—8月 LCP40.心算挑战(贪心、排序) class Solution { public:int maxmiumScore(vector<int>& cards, int cnt) {//24.8.1ranges::sort(cards, greater()); //从大到小排序int s reduce(cards.begin(), cards.begin()cnt, 0);if(s%2 0) return s;auto rep…

无线麦克风哪个牌子的好,麦克风哪个好,无线麦克风品牌推荐

​在自媒体日益繁荣的当下&#xff0c;内容创作成为了许多人追求的目标。对于视频内容创作者而言&#xff0c;出色的内容是成功的基石&#xff0c;而高质量的设备则是保证作品品质的关键。为了提升视频音质&#xff0c;拥有一款专业的无线麦克风是不可或缺的。 然而&#xff0…

PHP智能匹配轻松预订自习室在线订座系统小程序源码

智能匹配&#xff0c;轻松预订——自习室在线订座系统 &#x1f4da;【开篇&#xff1a;告别排队&#xff0c;迎接智能学习新时代】&#x1f4da; 还在为找不到合适的自习室座位而烦恼吗&#xff1f;是不是每次去图书馆或自习室都要提前好久去排队占位&#xff1f;现在&#…

太速科技-1路万兆光纤SFP+和1路千兆网络 FMC子卡模块

1路万兆光纤SFP和1路千兆网络 FMC子卡模块 一、概述 该板卡是基于kc705和ml605的fmc 10g万兆光纤扩展板设计&#xff0c;提供了1路万兆光纤SFP和1路千兆网络接口。可搭配我公司开发的FPGA载卡使用。载卡可参考&#xff1a;ID204 SFP&#xff08;10 Gigabit Small…

AWS-亚马逊网络服务(基础服务)-AWS 定价计算器-概述与动手部署:

让我们来概述并亲身实践如何使用 AWS 定价计算器来计算 概述&#xff1a; AWS 定价计算器是 Amazon Web Services (AWS) 提供的基于 Web 的工具&#xff0c;可帮助用户估算其特定用例的 AWS 服务成本。欢迎来到雲闪世界。 它允许客户建模他们的基础设施并根据他们打算使用的…