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

news2024/11/15 16:35:27

这篇博文是接着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_OBJECT

public:
    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_OBJECT

public:
    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.coloradmin.cn/o/1411606.html

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

相关文章

Linux常用命令之文件管理篇

文章目录 前言文件管理命令1、cat 由第一行开始显示文件内容2、ls 列出目录3、cd 切换目录4、mkdir 创建新目录5、touch 创建文件6、 rm 移除文件或目录7、cp 即拷贝文件和目录。8、 mv 移动文件与目录&#xff0c;或修改名称9、 chmod&#xff1a;更改文件9个属性10、chown&am…

Kubernets Deployment详解

因为Pod生命周期是短暂的&#xff0c;一旦运行完成则立即回收&#xff0c;且涉及Pod的创建、自愈、删除等操作比较复杂&#xff0c;所以很少在Kubernetes中直接使用Pod。而是使用更高级的称为Controller&#xff08;控制器&#xff09;的抽象层&#xff0c;来完成对Pod的创建、…

如何解决服务器端口被占用的问题,减少带来的影响

在现代网络环境中&#xff0c;服务器扮演着至关重要的角色&#xff0c;其稳定性和安全性对企业的正常运营具有重要意义。然而&#xff0c;服务器端口被占用的问题却时常困扰着企业网络管理员。本文将深入探讨服务器端口被占用的影响&#xff0c;并提出相应的解决方案。 一、服务…

linux ubuntu下面好用的录屏截图工具kazam 简单好用

kazam可以录屏&#xff0c;可以截图。 安装 apt install kazam使用 开始录制 ctrlmetashiftR 停止&#xff1a; ctrlmetashiftF 保存位置 ~/Videos KKVIEW:一键远控手机电脑

深圳工业元宇宙赋能新型工业化,推动工业制造业数字化转型发展

在当今数字化时代&#xff0c;工业制造业正面临着巨大的变革。随着技术的不断进步&#xff0c;工业元宇宙的概念逐渐成为推动工业制造业数字化转型的重要力量。深圳作为中国的高科技之都&#xff0c;在这方面走在了前列&#xff0c;积极探索工业元宇宙的应用&#xff0c;赋能新…

JUC Future 与 ForkJoin

文章目录 Runable 和 CallableFuture^1.5^FutureTask^1.5^示例 Fork/Join^1.7^ForkJoinPool^1.7^ 线程池任务的类型实例化方式 ForkJoinTask^1.7^示例执行 ForkJoinTask 任务的几个方法 Runable 和 Callable FunctionalInterface public interface Runnable {public abstract …

C语言从入门到入坟

前言 1.初识程序 有穷性 在有限的操作步骤内完成。有穷性是算法的重要特性&#xff0c;任何一个问题的解决不论其采取什么样的算法&#xff0c;其终归是要把问题解决好。如果一种算法的执行时间是无限的&#xff0c;或在期望的时间内没有完成&#xff0c;那么这种算法就是无用…

k8s学习(RKE+k8s+rancher2.x)成长系列之概念介绍(一)

一、前言 本文使用国内大多数中小型企业使用的RKE搭建K8s并拉起高可用Rancher2.x的搭建方式&#xff0c;以相关技术概念为起点&#xff0c;实际环境搭建&#xff0c;程序部署为终点&#xff0c;从0到1的实操演示的学习方式&#xff0c;一步一步&#xff0c;保姆级的方式学习k8…

黑马程序员——javase进阶——day02——关键字,接口,代码块,枚举

目录&#xff1a; Java中的关键字 static关键字final关键字Java中的权限修饰符代码块 构造代码块静态代码块接口 接口的介绍接口的定义和特点接口的成员特点接口的案例接口中成员方法的特点枚举随堂小记 继承方法重写抽象类模板设计模式staticfinal权限修饰符接口回顾上午内容…

【云原生】Docker网络模式和Cgroup资源限制

目录 一、Docker 网络实现原理 二、Docker 的网络模式 #网络模式详解&#xff1a; 第一种&#xff1a;host模式 第二种&#xff1a;bridge模式 第三种&#xff1a;container模式 第四种&#xff1a;none模式 第五种&#xff1a;自定义网络 三、Cgroup资源控制 第一种&a…

帆软数据决策系统——用户名或密码错误解决方案

今天在公司调试本地大屏效果效果&#xff0c;死活登录不上数据决策系统。 附上截图&#xff1a; 解决方案&#xff1a; 找到本地FineReport设计器的安装路径&#xff0c;例如&#xff1a;D:\commonsoftware\FineReport_11.0\setup\FineReport_11.0\webapps\webroot\WEB-INF\em…

利用STM32CubeMX和Keil模拟器,3天入门FreeRTOS(4.1) —— 静态创建队列

前言 &#xff08;1&#xff09;FreeRTOS是我一天过完的&#xff0c;由此回忆并且记录一下。个人认为&#xff0c;如果只是入门&#xff0c;利用STM32CubeMX是一个非常好的选择。学习完本系列课程之后&#xff0c;再去学习网上的一些其他课程也许会简单很多。 &#xff08;2&am…

一文深度解读多模态大模型视频检索技术的实现与使用

当视频检索叠上大模型Buff。 万乐乐&#xff5c;技术作者 视频检索&#xff0c;俗称“找片儿”&#xff0c;即通过输入一段文本&#xff0c;找出最符合该文本描述的视频。 随着视频社会化趋势以及各类视频平台的快速兴起与发展&#xff0c;「视频检索」越来越成为用户和视频平…

PyQtGraph 之PlotCurveItem 详解

PyQtGraph 之PlotCurveItem 详解 PlotCurveItem 是 PyQtGraph 中用于显示曲线的图形项。以下是 PlotCurveItem 的主要参数和属性&#xff1a; 创建 PlotCurveItem 对象 import pyqtgraph as pg# 创建一个 PlotCurveItem curve pg.PlotCurveItem()常用的参数和属性 setData(…

jQuery实现选择方法和保护信息方法

最近呢&#xff01;一直在学习jQuery语法&#xff0c;也没时间发布文章&#xff0c;现在学的差不多了&#xff0c;先跟大家分享下学习感受吧&#xff01;JavaScript学过后&#xff0c;再学习jQuery语法&#xff0c;应该是简单的&#xff0c;但我总是容易把它们搞混&#xff0c;…

day16打卡

day16打卡 104. 二叉树的最大深度 递归法时间复杂度&#xff1a;O(N)&#xff0c;空间复杂度&#xff1a;O(N) class Solution { public:int maxDepth(TreeNode* root) {if(root nullptr) return 0;return 1 max(maxDepth(root->left), maxDepth(root->right));} };…

蓝牙----蓝牙消息传输_GATT服务发现

蓝牙消息传输_GATT服务发现 1.主机和从机GATT服务的发现2.通知的使用 1.主机和从机GATT服务的发现 GATT服务的发现由主机执行&#xff0c;一共三个阶段  1.处理交换 MTU 请求和响应&#xff0c;启动对 Simple Service 服务的发现。 if (discState BLE_DISC_STATE_MTU){// MT…

C语言之指针的地址和指向的内容总结(八十四)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

Tomcat_项目部署局域网可访问方法

Tomcat_项目部署局域网可访问方法 前提假设tomcat已经正确安装部署,项目已经部署。 1. win+r运行ipconfig/all,查看wlan的IPv4地址。 2. 修改Tomcat配置文件Server.xml,修改以下两处为:以上查找本地IP地址。

动手学深度学习7 线性回归+基础优化算法

线性回归基础优化算法 1. 线性回归1. 模型1. 房价预测--一个简化的模型2. 拓展到一般化线性模型3. 线性模型可以看做是单层神经网络 2. 预测1. 衡量预估质量2. 训练数据3. 求解模型4. 显示解5. 总结 2. 基础优化算法1. 梯度下降2. 小批量随机梯度下降3. 总结练习 3. 线性回归的…