​ 先说结论,本文最终也没有解决图像反转问题,仅仅是过程记录。咨询了老大,老大说以我的能力,暂时还搞不定,所以就暂时先搁置。

电梯

  • 1 都是演示的错
  • 2 编译MITK2.21.2
  • 3 找问题原因
    • 3.1vtkResliceCursorLineRepresentation
      • 3.1.1GetRepresentation
      • 3.1.2SetSliceOrientation
  • ☞ 源码

1 都是演示的错

​ 哎呀,今天可是丢人大方了,今天博士来公司了,我兴匆匆的去嘚瑟下,告诉博士我实现了四视图了,博士说那就给我演示下呗,我这就麻溜的打开我的工程,演示起来,结果,呵呵哒。

​ 如上图所示,我的图像是反转的。

​ 在MITK中打开,人家的是真确的,为此,我编译了VTK官方的示例QtVTKRenderWindow,也是反的,我还以为我抄代码都能抄错了呢。但是问题来了,我改怎么搞呢,为什么是翻的呢,以我目前的认知,应该是坐标系的问题吧。

2 编译MITK2.21.2

​ 其实编译MITK完全是吃饱了撑的,因为不用编译,就可以看到源码,我还是编译了,并且折腾了好久,链接在这里,当你掌握了,就简单了,真的简单,曾经也在多个夜晚骂MITK团队,搞得啥破玩意,最后发现小丑竟是自己哈哈。其实编译MITK是想看看人家是怎么实现的。

https://blog.csdn.net/z609932088/article/details/118831590?spm=1001.2014.3001.5502

3 找问题原因

​ 在读取DICOM文件的时候,我使用的是vtkDICOMImageReader,而且用法也很简单,代码如下,这里不是出问题的地方,而且我也通过另外一个例子证明了。

        if(!reader){reader = vtkSmartPointer<vtkDICOMImageReader>::New();}reader->SetDirectoryName(fn);                              //这里主要,是文件夹哈,不是文件名reader->Update();                                          //得更新呀,惰性渲染reader->GetOutput()->GetDimensions(imageDims);             //还不理解,翻译为获取维度,注释掉以后三维中有影响

​ 在下面,使用了vtkResliceImageViewer,这里仅仅就是创建了三个vtkResliceImageViewer对象,也是没有问题的。

        for (auto i = 0; i < 3; i++){riw[i] = vtkSmartPointer< vtkResliceImageViewer >::New();
//            vtkNew<vtkGenericOpenGLRenderWindow> renderWindow;
//            riw[i]->SetRenderWindow(renderWindow);
//            riw[i]->SetColorLevel(128);
//            riw[i]->SetColorWindow(256);}

​ 再往下就是设置渲染窗口和设置交互器,也没有问题。

        riw[0]->SetRenderWindow(ui->widget_1->GetRenderWindow());riw[0]->SetupInteractor(ui->widget_1->GetRenderWindow()->GetInteractor());riw[1]->SetRenderWindow(ui->widget_2->GetRenderWindow());riw[1]->SetupInteractor(ui->widget_2->GetRenderWindow()->GetInteractor());riw[2]->SetRenderWindow(ui->widget_3->GetRenderWindow());riw[2]->SetupInteractor(ui->widget_3->GetRenderWindow()->GetInteractor());

​ 到了怀疑的地方了,这里rep->GetResliceCursorActor()->GetCursorAlgorithm()->SetReslicePlaneNormal(i);,如果把这句话注释掉的话,那就会报错误Resetting view-up since view plane normal is parallel,这个错误里面有一个关键字view-up,通过有道翻译出来的也不咋懂,重置视图,因为视图平面法线是平行的

        for (int i = 0; i < 3; i++){vtkResliceCursorLineRepresentation *rep =vtkResliceCursorLineRepresentation::SafeDownCast(riw[i]->GetResliceCursorWidget()->GetRepresentation());riw[i]->SetResliceCursor(riw[0]->GetResliceCursor());rep->GetResliceCursorActor()->GetCursorAlgorithm()->SetReslicePlaneNormal(i);riw[i]->SetInputData(reader->GetOutput());riw[i]->SetSliceOrientation(i);
//            riw[i]->SetResliceModeToAxisAligned();riw[i]->SetResliceModeToOblique();}

3.1vtkResliceCursorLineRepresentation

​ 凭着我男人的第六感,我感觉应该是这个类搞得事情,所以我要看看这个类。通过我强大的翻译能力,把这个类名分割一下**Re slice Cursor Line Representation **翻译过来应该是重新切片光标表示。

​ 这里出现了一个新的东西SafeDownCast()开始以为是一个VTK的接口,后面发现在VTK中是搜不到这个东西的,具体是什么,我也不知道,Google以后就只有下面的解释。

3.1.1GetRepresentation

​ 这里可以研究下GetRepresentation()它返回的正是vtkWidgetRepresentation

vtkWidgetRepresentation *GetRepresentation(){this->CreateDefaultRepresentation();return this->WidgetRep;}

SetReslicePlaneNormal源码如下:

​ 根据有道翻译,SetReslicePlaneNormal就是设置默认平面的。经过尝试,也不是这里出的问题,仅仅是设置平面。

  enum {XAxis=0,YAxis,ZAxis};/*** Set the planes that correspond to the reslice axes.*/void SetReslicePlaneNormalToXAxis(){ this->SetReslicePlaneNormal(XAxis); }void SetReslicePlaneNormalToYAxis(){ this->SetReslicePlaneNormal(YAxis); }void SetReslicePlaneNormalToZAxis(){ this->SetReslicePlaneNormal(ZAxis); }

3.1.2SetSliceOrientation

​ 后面我又开始研究SetSliceOrientation,源码如下:

​ 测试这个接口是有影响,但是呢,运行就死机,好尴尬。

  /*** Set/get the slice orientation*/enum{SLICE_ORIENTATION_YZ = 0,SLICE_ORIENTATION_XZ = 1,SLICE_ORIENTATION_XY = 2};vtkGetMacro(SliceOrientation, int);virtual void SetSliceOrientation(int orientation);virtual void SetSliceOrientationToXY(){ this->SetSliceOrientation(vtkImageViewer2::SLICE_ORIENTATION_XY); };virtual void SetSliceOrientationToYZ(){ this->SetSliceOrientation(vtkImageViewer2::SLICE_ORIENTATION_YZ); };virtual void SetSliceOrientationToXZ(){ this->SetSliceOrientation(vtkImageViewer2::SLICE_ORIENTATION_XZ); };

​ 在使用原生Demo测试时候,也是会出现错误,VS报告如下:这个Qt就得出来背锅了,不明白的就是为什么设置按照顺序012可以,倒过来就不可以呢,费解,发生这个问题后面找到了解决方法,就是换Qt版本,目前我虽然使用了5.14.2 的壳子,但是内核还是5.7.1 这个版本的的问题还真是多,也不知道算不算是BUG。

​ 更换Qt版本也很简单,如下图所示。

​ 最终测试也不是这里的问题。目前还未解决!!!

​ 2021年7月26日更新,今天问题还是未接,询问博士,博士说我能力暂时搞不定呀,那几只能先开坑,后面再说了。本篇到此结束。

☞ 源码

源码链接:https://github.com/DreamLife-Jianwei/Qt-Vtk

使用方法:☟☟☟


医学四视图-003-解决图像反转(失败)相关推荐

  1. 医学四视图-007-增加按钮,增加文档提示

    ​ 本文将记录实现给每个视图增加按钮和文字提示. 文章目录 1 增加按钮.增打开文档提示 2 自定义模块"VTKRenderWidget" 2.1 vtkrenderwidget. ...

  2. 医学四视图-004-四视图增加文字显示

    ​ 这篇文章中就要给我的四视图增加文字显示了,这个东西就是在我摄像机上面的,不会随着图像变化而变化,感觉这个是不是就是在3D中的那种HUD呢. 电梯 1 效果展示 2 vtkTextActor 3 实 ...

  3. 医学四视图-002-四视图实现

    ​ 本篇文章将参考大神们的足迹,模仿这实现四视图. 电梯 1 参考资料 2 参考代码 3 自己的代码 4 运行效果 ☞ 源码 1 参考资料 ​ 其实说四视图是不是很不专业,是不是应该叫多平面重建及三维 ...

  4. 医学四视图-005-四视图加按钮

    ​ 先说结果,没有成功,如下图所示:要看成功的,需要再看我下下篇文章**<增加按钮.增加文字显示>**的那篇. 电梯 1 效果展示 2 QWidget::createWindowConta ...

  5. 医学四视图-008-增加十字线开关功能,按钮显隐功能

    ​ 本文将实现每个窗口中的三个按钮在鼠标滑入时显示,在鼠标离开时隐藏,同时完成了十字线联动的开关. 电梯 1 演示效果 2 实现按钮显示与隐藏 2.1 头文件声明 2.2 实现 3 十字线显隐 ☞ 源 ...

  6. VTK-医学三维图像四视图显示以及鼠标滑轮控制切片交互

    VTK-医学三维图像四视图显示以及鼠标滑轮控制切片交互 一.四视图介绍 vs直接创建Qt Widgets Application项目 四视图界面,采用vtk和QVTKOpenGLNativeWidge ...

  7. 上传照片显示服务器繁忙怎么回事,解决WordPress上传图片“图像后期处理失败,可能是服务器忙或没有足够的资源”问题...

    最近WordPress升级到了最新的5.6X版本,会出现"图像后期处理失败.如果这是一张照片或较大图像,请将其缩小到2500像素并重新上传."的问题.从网上查了下,大概有几种解决方 ...

  8. win7ie11调用java失败,不忘旧人,四招轻松解决Win7系统IE11兼容性问题

    Win7之家( www.win7china.com):不忘旧人,四招轻松解决Win7系统IE11兼容性问题 IE11是IE最高版本的浏览器,也可能是微软最后一个版本的IE浏览器啦,在Win10系统中作 ...

  9. 三维重建 医学图像的可视化 PyQt Python VTK 四视图(横断面,冠状面,矢状面,3D)

    本文实现了 Python C++ 版本 的 四视图,横断面,冠状面,矢状面,3D 主要功能: 1:可以通过进度条换层       2:鼠标双击放大/缩小窗口 3:按住鼠标中键拖动图像 4:鼠标右键滑动 ...

最新文章

  1. 约瑟夫环双向链表c语言实,双向链表与约瑟夫环代码
  2. SyntaxError: invalid syntax的问题原因和解决办法
  3. python datetime datetime_Python datetime.tzinfo方法代碼示例
  4. 多线程在任何情况下均能提高效率吗?
  5. git-flow 工作流程简介
  6. 3DSlicer12:风格准则
  7. as3 java 交互_求大佬用 Java 实现这段 AS3 的 socket 通讯功能
  8. 【AIX 命令学习】lsattr 显示一个给定设备或一种设备的属性
  9. mysql数据库char类型长度_mysql数据库设计字符类型及长度
  10. scala 随机生成整数_如何在Scala中以整数形式获取当前年份?
  11. 20-21-2网络管理quiz6
  12. Appium API文档中文版
  13. c# 系列 - 基本知识
  14. 【转载】【原创】贵在,难在,成在
  15. Android OpenCV 身份证训练
  16. 黑苹果alc269声卡仿冒id_笔记本制作仿冒声卡驱动AppleHDA最详细教程
  17. 微信内置浏览器无法下载文件的解决方案
  18. Android发送edp服务器,Android开发之基于OneNET平台的EDP传输协议的使用
  19. yocto 知:BitBake用户手册
  20. 楼板的弹性计算和塑形计算_双向板计算的弹性算法和塑性算法

热门文章

  1. 基于深度学习立体匹配中的‘Cost Volume‘
  2. 从源码分析tomcat如何调用Servlet的初始化
  3. CF1821 E. Rearrange Brackets
  4. 月薪30K的软件测试简历怎么包装,软件测试项目经验怎么写?软件测试简历编写,软件测试简历模板
  5. python通信达数据_通达信用了这么久也该学学Python了!1
  6. cips2016+学习笔记︱NLP中的消岐方法总结(词典、有监督、半监督)
  7. [单片机][cx32][填坑日记] 从AC5到AC6 flash写入功能异常
  8. 小游戏进入增长快车道,行业变现模式分析
  9. 【Zotero文献管理】使用zotero+坚果云进行文献管理
  10. 细粒度图像分类 fine-grained classification