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_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.mfbz.cn/a/347607.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

雪花算法 Nginx

雪花算法介绍 SnowFlake 算法&#xff0c;是 Twitter 开源的分布式 id 生成算法。其核心思想就是&#xff1a;使用一个 64 bit 的 long 型的数字作为全局唯一 id 1位&#xff0c;不用。二进制中最高位为1的都是负数&#xff0c;但是生成的id都是正数&#xff0c;所以这个最高位…

深入理解badblocks

文章目录 一、概述二、安装2.1、源码编译安装2.2、命令行安装2.3、安装确认 三、重要参数详解3.1、查询支持的参数3.2、参数说明 四、实例4.1、全面扫描4.2、破坏性写入并修复4.3、非破坏性写入测试 五、实现原理六、注意事项 团队博客: 汽车电子社区 一、概述 badblocks命令是…

【码农新闻】原来这就是网络,小霸王是我儿时快乐源泉之一,不知这里有没有你儿时玩过的游戏机呢......

目录 【码农新闻】原来这就是网络&#xff0c;小霸王是我儿时快乐源泉之一,不知这里有没有你儿时玩过的游戏机呢...... 【何同学】我毕业了&#xff01;&#xff01;原来这就是网络承载童年的游戏机&#xff0c;已停产&#xff01;但我在 GitHub 找到了它们国货正当潮-那些你所…

蓝桥杯省赛无忧 编程12 四元组问题

#include <bits/stdc.h> using namespace std; bool FoursNumberFind(vector<int>& nums) {stack<int> st;int n nums.size(), k INT_MIN, INF INT_MAX;//min_r[i] min(nums[r]), i < r < n。//表示第i个数&#xff08;不包括第i个数&#xff…

2024年电工(初级)证考试题库及电工(初级)试题解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年电工&#xff08;初级&#xff09;证考试题库及电工&#xff08;初级&#xff09;试题解析是安全生产模拟考试一点通结合&#xff08;安监局&#xff09;特种作业人员操作证考试大纲和&#xff08;质检局&#…

k8s---安全机制

k8s的安全机制&#xff0c;分布式集群管理工具&#xff0c;就是容器编排。安全机制的核心&#xff1a;APIserver。为整个集群内部通信的中介&#xff0c;也是外控控制的入口。所有的机制都是围绕apiserver来进行设计&#xff1a; 请求api资源&#xff1a; 1、认证 2、鉴权 …

陈酿过程中的物质转化与品质改善

陈酿是酿酒过程中至关重要的环节&#xff0c;它能够改善酒的品质和口感&#xff0c;使酒更加醇厚、芳香。云仓酒庄的豪迈白酒在陈酿过程中&#xff0c;物质转化与品质改善方面表现得尤为杰出。 首先&#xff0c;陈酿能够促进酒中物质的转化。在长时间的陈酿过程中&#xff0c;酒…

遇到IP禁令怎么办?别慌,解决方法在这

相信很多人遇到过IP禁令&#xff1a;比如你在访问社交媒体、搜索引擎或电子商务网站时会被限制访问&#xff0c;又或者你的的账号莫名被封&#xff0c;这些由于网络上的种种限制我们经常会遭遇IP被封的情况&#xff0c;导致无法使用继续进行网络行动。在本文中&#xff0c;我们…

Docker容器引擎(3)

目录 一.Docker 镜像的创建 1&#xff0e;基于现有镜像创建 2&#xff0e;基于本地模板创建 3.基于Dockerfile创建&#xff1a; Dockerfile 操作常用的指令&#xff1a; ADD 和 COPY 的区别&#xff1f; CMD 和 ENTRYPOINT 的区别&#xff1f; 容器启动命令的优先级 如…

c++day2

计算矩形的面积 #include <iostream> using namespace std; class Rect {int width;int heigh; public:void init(int w, int h){width w;heigh h;}void set_w(int w){width w;}void set_h(int h){heigh h;}void show(){cout << "该矩形面积:" <…

ASP.NET Core NE8实现HTTP Upgrade和HTTP CONNECT代理服务器

看到一个文章[Go] 不到 100 行代码实现一个支持 CONNECT 动词的 HTTP 服务器 在NET8中如何实现 创建项目为MiniApi 编辑Program.cs文件。 var builder WebApplication.CreateSlimBuilder(args);var app builder.Build();// 将HTTP请求通过协议升级机制转为远程TCP请求&…

可视化智慧水电站EasyCVR视频智能监控系统方案设计与技术应用介绍

一、背景需求 水电站作为国家重要的能源基地&#xff0c;其安全运行对于保障能源供应和社会稳定具有重要意义。然而&#xff0c;传统的人工监控方式存在着诸多问题&#xff0c;如人力成本高、监控范围有限、反应不及时等。因此&#xff0c;水电站急需引进一种先进的视频智能监…

开始学习Vue2(组件的生命周期和数据共享)

一、组件的生命周期 1. 生命周期 & 生命周期函数 生命周期&#xff08;Life Cycle&#xff09;是指一个组件从创建 -> 运行 -> 销毁的整个阶段&#xff0c;强调的是一个时间段。 生命周期函数&#xff1a;是由 vue 框架提供的内置函数&#xff0c;会伴随着 组件…

解读Android进程优先级ADJ算法

本文基于原生Android 9.0源码来解读进程优先级原理,基于篇幅考虑会精炼部分代码 一、概述 1.1 进程 Android框架对进程创建与管理进行了封装,对于APP开发者只需知道Android四大组件的使用。当Activity, Service, ContentProvider, BroadcastReceiver任一组件启动时,当其所…

[极客大挑战 2019]Upload1

直接上传php一句话木马&#xff0c;提示要上传image 把文件名改成gif并加上gif文件头后&#xff0c;绕过了对image类型的检测&#xff0c;但是提示文件内含有<?&#xff0c;且bp抓包后改回php也会被检测 那我们考虑使用js执行php代码 <script languagephp>eval($_PO…

使用 LinkAi 打造自己的知识库和数字人

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、LinkAi 介绍 二、文档库 2.1 创建知识库 2.2 配置知识库 2.3 Ai配置 2.4 导入文档 2.5 接入微信 三、扩展 四、总结…

华媒舍:15种媒体发稿推广的创意理念与案例分析

媒体发稿已经成为推广知名品牌、产品与服务关键方式之一。怎样通过媒体发稿提升曝光度和吸引住受众却是一个挑战。下面我们就详细介绍15种创意理念和案例分析&#xff0c;帮助你更好地进行新闻媒体发稿推广。 1.造就日常生活小故事通过展示真实用户故事和感受&#xff0c;读者对…

Elasticsearch内核解析 - 写入篇

Elasticsearch内核解析 - 写入篇 - 知乎 目前的Elasticsearch有两个明显的身份,一个是分布式搜索系统,另一个是分布式NoSQL数据库,对于这两种不同的身份,读写语义基本类似,但也有一点差异。 写操作 实时性: 搜索系统的Index一般都是NRT(Near Real Time),近实时的,比…

vue3项目中用codemirror实现格式化java代码及不太成熟的历程

本期只介绍创作的曲折历程&#xff0c;并不能解决实际问题&#xff0c;现有插件不支持&#xff0c;总结在了最后 一、案例效果 vue3项目使用preitter 搭配prettier-plugin-java 实现codemirror 格式化 java 二、步骤 1. 安装prettier和prettier-plugin-java&#xff0c;可以…

Tomcat好帮手---JDK

目录 1、Tomcat好帮手---JDK 2、安装JDK 部署Tomcat参考博主博客 部署TOMCAT详解-CSDN博客 1、Tomcat好帮手---JDK JDK是 Java 语言的软件开发工具包&#xff0c;JDK是整个java开发的核心&#xff0c;它包含了JAVA的运行环境&#xff08;JVMJava系统类库&#xff09;和JAVA…
最新文章