VS2022联合Qt5开发学习10(QT5.12.3联合VTK在VS2022上开发医学图像项目4——ScrollBar控制对比度、切面位置)

这篇博文是接着VS2022联合Qt5开发学习7(QT5.12.3联合VTK在VS2022上开发医学图像项目2——十字叉标注)-CSDN博客这篇博文延伸开发医学图像的显示渲染相关项目,主要介绍的是在之前显示的图像上增加滑块控制。

用到的内容有:

VS2022联合Qt5开发学习5(QT5.12.3联合VTK在VS2022上开发医学图像项目)_vs2022 qt5.12-CSDN博客

VS2022联合Qt5开发学习7(QT5.12.3联合VTK在VS2022上开发医学图像项目2——十字叉标注)-CSDN博客

13. VTK采集点法向量标记、平面切割-CSDN博客

大家可以先提前瞅一眼,或者直接读这一篇博文,到了要用到的地方,我会都标上的。

1. ScrollBar控制jpg图像对比度

下面这个例子是个纯粹的Qt项目,用于ScrollBar控制图像对比度。先用这个小例子来熟悉一下ScrollBar的用法吧。

步骤一:新建一个Qt Widgets Application项目打开UI界面。双击.ui文件。如图所示,在界面上拖拽一个label插件,一个ScrollBar插件,调整到合适大小。

步骤二:回到VS窗口,在VS解决方案中选中方案,右键->Qt->Refresh intelliSense进行刷新。

步骤三:在VS解决方案中右键 .ui 文件 -> "编译",会生成对应的 ui_mainwindow_ScrollBar.h 头文件。

步骤四:打开mainwindow_ScrollBar.h、mainwindow_ScrollBar.cpp两个文件,添加相关功能。

mainwindow_ScrollBar.h

#pragma once#include <QtWidgets/QMainWindow>
#include "ui_mainwindow_ScrollBar.h"class mainwindow_ScrollBar : public QMainWindow
{Q_OBJECTpublic:mainwindow_ScrollBar(QWidget *parent = nullptr);~mainwindow_ScrollBar();private:Ui::mainwindow_ScrollBarClass ui;private slots:void updateContrast(int value);private:QImage originalImage;void applyContrast(int value);};

mainwindow_ScrollBar.cpp

图像地址的话自己根据自己图像在的地址改一下,我这里就用了万能的lena图了。Lena,我学习计算机可视化路上极其重要的一个女人,哈哈哈。

#include "mainwindow_ScrollBar.h"
#include <QVBoxLayout>mainwindow_ScrollBar::mainwindow_ScrollBar(QWidget *parent): QMainWindow(parent)
{ui.setupUi(this);//读取原始图像originalImage.load("lena.jpg");// 设置对比度范围和初始值ui.contrastScrollBar->setRange(-100, 100);ui.contrastScrollBar->setValue(0);// 连接信号和槽connect(ui.contrastScrollBar, &QScrollBar::valueChanged, this, &mainwindow_ScrollBar::updateContrast);// 显示原始图像ui.imageLabel->setPixmap(QPixmap::fromImage(originalImage));
}mainwindow_ScrollBar::~mainwindow_ScrollBar()
{}void mainwindow_ScrollBar::updateContrast(int value)
{// 更新对比度并应用到图像applyContrast(value);
}void mainwindow_ScrollBar::applyContrast(int value)
{// 复制原始图像QImage adjustedImage = originalImage;// 调整对比度for (int y = 0; y < adjustedImage.height(); ++y) {for (int x = 0; x < adjustedImage.width(); ++x) {QRgb pixel = adjustedImage.pixel(x, y);// 获取原始颜色分量int red = qRed(pixel);int green = qGreen(pixel);int blue = qBlue(pixel);// 调整颜色分量red = qBound(0, red + value, 255);green = qBound(0, green + value, 255);blue = qBound(0, blue + value, 255);// 设置调整后的颜色adjustedImage.setPixel(x, y, qRgb(red, green, blue));}}// 显示调整后的图像ui.imageLabel->setPixmap(QPixmap::fromImage(adjustedImage));
}

运行结果

ScrollBar控制对比度

2.ScrollBar控制STL图像切割面

这个项目我是接着前面的博客13. VTK采集点法向量标记、平面切割-CSDN博客的平面切割项目以及VS2022联合Qt5开发学习7(QT5.12.3联合VTK在VS2022上开发医学图像项目2——十字叉标注)_qt vs开发-CSDN博客中的STL显示项目做的,用的VTK版本是VTK7,也就是说,显示图像我用的是QVTKWidget这个控件。如果是用的VTK9或者其他更高版本的VTK,解决方案参考VS2022联合Qt5开发学习5(QT5.12.3联合VTK在VS2022上开发医学图像项目)_vs2022 qt5.12-CSDN博客,里面我有详细写怎么用哈,这里就不赘述了。之前博客里介绍的平面切割项目是一个纯粹的VTK项目,这里我加入了Qt界面以及Qscroll控件用于控制切割面的相关参数,主体设计参考了前面博客里的STL显示项目。

步骤一:双击.ui文件。如图所示,在界面上拖拽一个qvtkWidget插件,两个ScrollBar插件,调整到合适大小。

步骤二:回到VS窗口,在VS解决方案中选中方案,右键->Qt->Refresh intelliSense进行刷新。

步骤三:在VS解决方案中右键 .ui 文件 -> "编译",会生成对应的 ui_mainwindow_ScrollBar.h 头文件。

步骤四:打开STLshowtest_vtk7.h、STLshowtest_vtk7.cpp两个文件,添加相关功能。

STLshowtest_vtk7.h

#pragma once#include <QtWidgets/QMainWindow>
#include "ui_STLshowtest_vtk7.h"#include <vtkAutoInit.h>
#include <vtkBMPReader.h>
#include <vtkFloatArray.h>
#include <vtkImageActor.h>
#include <vtkImageChangeInformation.h>
#include <vtkImageData.h>
#include <vtkImageImport.h>
#include <vtkImageViewer2.h>
#include <vtkInteractorStyleImage.h>
#include <vtkJPEGReader.h>
#include <vtkLookupTable.h>
#include <vtkMetaImageReader.h>
#include <vtkNamedColors.h>
#include <vtkNew.h>
#include <vtkPointData.h>
#include <vtkPolyDataMapper.h>
#include <vtkProperty.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <vtkSTLReader.h>
#include <vtkSmartPointer.h>
#include <vtkXMLImageDataWriter.h>
#include <vtkCutter.h>
#include <vtkPlane.h>
#include <vtkProbeFilter.h>
#include <vtkDataSetMapper.h>#include "vtkAutoInit.h"
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);class STLshowtest_vtk7 : public QMainWindow
{Q_OBJECTpublic:STLshowtest_vtk7(QWidget *parent = nullptr);~STLshowtest_vtk7();private:Ui::STLshowtest_vtk7Class ui;private:vtkSmartPointer<vtkSTLReader> obj;vtkSmartPointer<vtkPlane> plane;vtkSmartPointer<vtkPolyData> polyData;vtkSmartPointer<vtkCutter> planeCut;vtkSmartPointer<vtkProbeFilter> probe;vtkSmartPointer<vtkDataSetMapper> cutMapper;vtkSmartPointer<vtkPointData> pData;vtkSmartPointer<vtkActor> cutActor;vtkSmartPointer<vtkRenderer> renderer;vtkSmartPointer<vtkRenderWindow> window;};

STLshowtest_vtk7.cpp

#include "STLshowtest_vtk7.h"#include <QDebug>
#include <QFileDialog>#include <vtkImageBlend.h>
#include <vtkImageCanvasSource2D.h>
#include <vtkImageChangeInformation.h>
#include <vtkImageData.h>
#include <vtkImageIterator.h>
#include <vtkImageLuminance.h>
#include <vtkImageStencil.h>
#include <vtkImageStencilData.h>
#include <vtkImageViewer.h>
#include <vtkInteractorStyleImage.h>
#include <vtkPNGReader.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include<vtkLine.h>
#include <vtkCutter.h>
#include <vtkPlane.h>
#include <vtkProbeFilter.h>
#include <vtkDataSetMapper.h>STLshowtest_vtk7::STLshowtest_vtk7(QWidget *parent): QMainWindow(parent)
{ui.setupUi(this);// 创建vtkRenderer对象renderer = vtkSmartPointer<vtkRenderer>::New();// 创建vtkRenderWindow对象window = vtkSmartPointer<vtkRenderWindow>::New();// 设置vtkRenderWindow对象的背景色renderer->SetBackground(.0, .0, .0);// 将vtkRenderer对象添加到vtkRenderWindow对象中window->AddRenderer(renderer);// 设置qvtkWidget对象的渲染窗口ui.qvtkWidget->SetRenderWindow(window);// 创建vtkSTLReader对象obj = vtkSmartPointer<vtkSTLReader>::New();// 设置vtkSTLReader对象的文件名obj->SetFileName("D:\\ct\\20201102113826651_3d\\femur.stl");// 更新vtkSTLReader对象obj->Update();// 获取vtkSTLReader对象输出的vtkPolyData对象polyData = obj->GetOutput();// 创建vtkPlane对象plane = vtkSmartPointer<vtkPlane>::New();// 设置vtkPlane对象的原点和法线向量plane->SetOrigin(polyData->GetCenter());plane->SetNormal(-0.287, 0, 0.9579);// 创建vtkCutter对象planeCut = vtkSmartPointer<vtkCutter>::New();// 设置vtkCutter对象的参数planeCut->SetInputConnection(obj->GetOutputPort());planeCut->SetCutFunction(plane);planeCut->SetValue(0, 50);planeCut->GenerateValues(20, 0, 500);// 创建vtkProbeFilter对象probe = vtkSmartPointer<vtkProbeFilter>::New();// 设置vtkProbeFilter对象的参数probe->SetInputConnection(planeCut->GetOutputPort());probe->SetSourceConnection(obj->GetOutputPort());// 创建vtkDataSetMapper对象cutMapper = vtkSmartPointer<vtkDataSetMapper>::New();// 设置vtkDataSetMapper对象的参数cutMapper->SetInputConnection(probe->GetOutputPort());cutMapper->ScalarVisibilityOn();// 创建vtkActor对象cutActor = vtkSmartPointer<vtkActor>::New();// 设置vtkActor对象的参数cutActor->SetMapper(cutMapper);// 将vtkActor对象添加到vtkRenderer对象中renderer->AddActor(cutActor);// 设置QScrollBar对象的范围ui.scrollbar->setRange(0, 50);// 将QScrollBar对象与vtkCutter对象的切割平面数量连接起来QObject::connect(ui.scrollbar, &QScrollBar::valueChanged, [=](int value) {// 设置vtkCutter对象的切割平面数量planeCut->GenerateValues(value, 0, 500);// 更新vtkRenderWindow对象window->Render();});ui.h_scrollBar->setRange(0, 500);// 将QSlider对象与vtkCutter对象的切割平面位置连接起来QObject::connect(ui.h_scrollBar, &QScrollBar::valueChanged, [=](int value) {// 设置vtkCutter对象的切割平面位置planeCut->SetValue(0, value);// 更新vtkRenderWindow对象window->Render();});}STLshowtest_vtk7::~STLshowtest_vtk7()
{}
运行结果:

scrollbar控制切面形状及数量

备注:

我这里的代码因为是直接从我之前的项目搬过来加的(人比较懒。。。),所以有一些代码冗余,比较明显的我都删掉了,要是用的的时候还发现有一些多余的,就动动你们的爪爪把不必要的代码删掉就好了。

最后,如果你觉得这篇文对你有帮助,请给博主点赞收藏评论三连hhh 

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

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

相关文章

phpstudy安装mysql5.7后在my.ini文件中无法修改sql_mode

如标题&#xff0c;windows环境下使用phpstudy安装mysql5.7后需要修改mysql中的sql_mode配置&#xff0c;但是在phpstudy中打开mysql配置文件my.ini后&#xff0c; 通过查找找不到sql_mode或sql-mode&#xff0c; 此时无法在my.ini文件中直接进行修改&#xff0c;可以使用mysq…

鸿蒙开发初体验

文章目录 前言一、环境配置1.1 安装DevEco Studio1.2 安装相关环境 二、工程创建三、工程结构介绍四、代码实现4.1 初识ArkTs4.2 具体实现 参考资料 前言 HarmonyOS是华为公司推出的一种操作系统&#xff0c;旨在为不同设备提供统一的操作系统和开发平台。鸿蒙开发的出现为用户…

(3)Elastix图像配准:项目实战(2D / 3D)

文章目录 前言一、3D图像配准1.1、项目实战(3D图像)1.2、参数文件(3D图像)1.2.1、parameter_file_rigid_3D.txt1.2.2、parameter_file_affine_3D.txt1.2.3、parameter_file_bspline_3D.txt二、2D图像配准2.1、项目实战(2D图像)2.2、参数文件(2D图像)2.2.1、parameter_f…

【云原生】Docker如何构建镜像

目录 前言 一、基于已有的镜像创建 步骤一&#xff1a;先基于现有的镜像创建一个容器&#xff0c;然后进入容器去完成修改 步骤二&#xff1a;将该容器作为一个模板提交创建为一个新的镜像 步骤三&#xff1a;基于新的镜像&#xff0c;docker run创建一个容器&#xff0c;进…

浏览器缓存机制

参考&#xff1a; 【第1250期】彻底理解浏览器的缓存机制 深入理解浏览器缓存原理 - 掘金 建议先看原文&#xff0c;我只是在原文基础做验证和补充。 网上查了很多&#xff0c;都没有查看浏览器是根据什么缓存的&#xff0c;还得是AI神器啊&#xff0c;但是神器给的结果无法…

Hadoop3.x学习笔记

文章目录 一、Hadoop入门1、Hadoop概述1.1 简介1.2 hadoop优势1.3 hadoop组成1.4 大数据技术生态体系 2、环境准备(重点)2.1 模板机配置2.2 模板创建 3、本地运行模式&#xff08;官方WordCount&#xff09;4、Hadoop集群搭建(&#x1f31f;重点)4.1 环境准备(集群分发脚本xsyn…

深入到 TLP:PCI Express 设备如何通信(第二部分)

数据链路层数据包 除了用其标头&#xff08;2 个字节&#xff09;包装 TLP 并在末尾添加一个 CRC&#xff08;LCRC 实际上是 4 个字节&#xff09;之外&#xff0c;数据链路层还运行自己的数据包以保持可靠的传输。这些特殊数据包是数据链路层数据包 &#xff08;DLLP&#xf…

抖音VR直播:沉浸式体验一键打通360度精彩

随着5G技术的发展&#xff0c;VR直播近年来也逐步进入到大众的视野中&#xff0c;相比于传统直播&#xff0c;VR直播能够提供更加丰富的内容和多样化的互动方式&#xff0c;让观众更有沉浸感和参与感。现如今&#xff0c;抖音平台也上线了VR直播&#xff0c;凭借沉浸式体验和有…

《安富莱嵌入式周报》第331期:单片机实现全功能软件无线电,开源电源EEZ升级主控,ARM 汇编用户指南,UDS统一诊断服务解析,半导体可靠性设计手册

周报汇总地址&#xff1a;嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Powered by Discuz! 目录&#xff1a; 1、单片机实现低配版全功能软件无线电&#xff0c;范围0.5-30 MHz&#xff0c;支持SSB、AM、FM和CW …

浏览器require加载devextreme-react组件

十几年前使用了devexpress公司的delphi元件&#xff0c;功能很强。它们的html元件devextreme&#xff0c;功能表现类似&#xff0c;也行强。 devextreme和devextreme-react&#xff0c;我使用的是23.2.3版本。 官方推荐的用法&#xff0c;都是要经过build&#xff1a; npx d…

对二值化后的管接头表面缺陷图像进行垂直和水平投影这里面的水平投影和垂直投影是什么意思?

问题描述&#xff1a; 对二值化后的管接头表面缺陷图像进行垂直和水平投影 这里面的水平投影和垂直投影是什么意思&#xff1f; 问题解答&#xff1a; 在图像处理中&#xff0c;垂直投影和水平投影是两种常用的直方图投影方法&#xff0c;用于分析图像的特征&#xff0c;特别…

GitHub Copilot 与 OpenAI ChatGPT 的区别及应用领域比较

GitHub Copilot 和 OpenAI ChatGPT 都是近年来颇受关注的人工智能项目&#xff0c;它们在不同领域中的应用继续引发热议。本文旨在分析和比较这两个项目的区别&#xff0c;从技术原理、应用场景、能力和限制、输出结果、能力与限制和发展前景等方面进行综合评估&#xff0c;帮助…

Mysql 学习(十 四)事务简介

为什么要有事务&#xff1f; 数据库的出现其实是有应用场景的&#xff0c;最好的例子就是交易&#xff0c;以前的交易是通过账本记录的&#xff0c;也就是通过纸和笔来记录&#xff0c;而数据库的出现大大提升了效率&#xff0c;但是现实中的有些问题&#xff0c;数据库也需要…

数据分析 - python 数据处理

数据处理 去除重复数据 # 删除重复值 保留重复行 第一行的数据 data.drop_duplicates(inplaceTrue, keepfirst)数据格式转化 日期格式化 data[order_date] pd.to_datetime(data[order_dt], format%Y%m%d)data[销售时间] pd.to_datetime(data[销售时间]) # 交货时间 销售…

MIT_线性代数笔记:线性代数常用计算公式

目录 1.矩阵的加法和数乘2.矩阵的乘法3.转置 Transposes 相关运算 1.矩阵的加法和数乘 2.矩阵的乘法 1)标准方法&#xff08;行乘以列&#xff09; 矩阵乘法的标准计算方法是通过矩阵 A 第 i 行的行向量和矩阵 B 第 j 列的列向量点积得到 cij。即我们常说的点积&#xff0c;也…

SIP INVITE method

在RFC 3261定义了SIP:INVITE,以下是具体内容。 当UA客户端希望发起session,例如voice call 或video call时,UAC就可以发送INVITE request。INVITE request会要求服务器建立session,然后该请求由代理转发,最终到达一个或多个可能接受邀请的UAS。 UAS 可以通过发送 2xx res…

c++ class总结

c class的使用总结 1.继承2.静态成员变量与静态成员函数3.多态4.虚函数5.纯虚函数6.友元类、友元函数6.1 友元类6.2 友元函数 1.继承 类Man、WoMan 继承于类Person。 类Man、WoMan 的实例对象都可以使用类Person中public属性的成员及成员函数。 #include<iostream>cla…

使用GtkSharp下载zip包过慢问题解决方案

背景 安装GtkSharp这个包准备使用C#进行跨平台窗体应用程序开发&#xff0c;运行时发现其需要从github上下载【https://github.com/GtkSharp/Dependencies/raw/master/gtk-3.24.24.zip】这个依赖包&#xff0c;不知道是被墙了还是咋的&#xff0c;下载超时导致运行失败。 解决…

【算法练习】leetcode算法题合集之动态规划篇

普通动规系列 LeetCode343. 整数拆分 LeetCode343. 整数拆分 将10的结果存在索引为10的位置上&#xff0c;需要保证数组长度是n1&#xff0c;索引的最大值是n&#xff0c;索引是从0开始的。 n的拆分&#xff0c;可以拆分为i和n-i&#xff0c;当然i可以继续拆分。而且拆分为n-…

django mysql in 有序返回

from django.db.models import * ordering f"FIELD(id, {,.join([str(_) for _ in ids])})" # 默认就按照算法返回的 id 排序p_data_result PeptidesDataResult.objects.using("polypeptide").filter(id__inids).values().extra(select{ordering: orderi…