DCMTK读取dcm文件信息环境搭建及经验总结

VS207读取dicom文件**

DCMTK读取dcm文件信息环境搭建及经验总结

	我做的是将基于vs下qt5实现的对dicom文件信息的读取,转换成基于vs2017下MFC实现对dicom文件的读取。
	首先搭建了基于vs下的qt5开发环境,然后在了解了原先架构基础上搭建基于MFC上的实现。文中总结了实现过程中遇到的一些主要难题,并说明解决办法,对一些常规步骤主要提供一些使用的网页链接,非常值得一看。

关键词:vs2017,qt5,MFC,DCMTK,dicom

1 介绍
1.熟悉visual studio2017下的MFC应用的使用;
2.为了统一于windows系统之下,将基于visual studio 2017开发的qt5用户界面系统转换到visual studio 2017上的MFC应用上。
3.实现用户操作界面,包括用户登录、模式选择和对患者dcm文件中的数据读取,重点是读取病人dcm文件信息并显示。

2 概要
2.1 功能描述
本框架包括用户登录界面,选择治疗模式界面和提取病人dcm文件信息界面。

  1. 用户登录:实现系统登入功能,账号初始化为masep,密码1234,登陆成功之后可以进入模式选择界面。
  2. 治疗模式:模式选择包括晨检模式、治疗模式、物理模式和维修模式,在这里主要实现治疗模式,选择之后进入治疗模式界面。
  3. 提取病人dcm文件信息:选择按钮实现对病人dcm文件的选择,并读取文件路径,会在左边组框显示病人姓名等基本信息,在右边标签页显示病人治疗的一些详细参数。
    2.2 结构描述
    在这里插入图片描述
    图2.1 系统基本流程结构图
    上图为系统基本流程实现结构,重点是治疗模式,采用编辑框和标签页实现信息的显示,采用DCMTK第三方库来实现dcm文件信息的读取,利用cmake将第三方库编译成visual studio 2017可用的库文件,然后通过生成的dll调用第三方库实现信息的提取。Dcm文件中的信息包括patientsequence,studysequence,seriessequence,rtplanbasic,dosereference,fractiongroup等信息,当然还包括图像等信息,在这里只显示部分。

3 实现步骤
3.1.搭建visual studio下qt5的原始环境
下载qt5版本,按电脑位数选择合适的版本,在visual studio中下载与qt5连接的插件工具,进行相应的配置。
Qt5在visual studio 2017配置链接:https://www.cnblogs.com/farewell-farewell/p/10751196.html
然后可以自己搭建一个qt应用,以前版本用Qt GUI Application建立工程,现在用Qt Widgest Application 即可。
注意:环境变量和路径的配置,有的地方还说有Vassistx的配置,可以考虑配置。
3.2.DCMTK第三方库的下载
由于现在的医学影像设备的图像存储和传输正在逐渐向DICOM标准靠拢,在我们进行医学图像处理的过程中,经常需要自己编写和DICOM格式的图像相关的各种程序模块,以完成自己处理功能。如果从头开始理解DICOM的协议,然后完全自己编写这些代码来实现这些协议,是一件工程浩大的事情。德国offis公司开发的DCMTK,为我们提供了实现DICOM协议的一个平台,使得我们可以在它的基础上轻松的完成自己的主要工作,而不必把太多的精力放在实现DICOM协议的细节问题上。
主要流程是,下载DCMTK第三方数据包,下载cmake软件对dcmtk数据包进行编译,编译构建成visual studio可以直接使用的库文件,路径一定要配置好。详细配置过程见下面网页链接:
DCMTK库的下载安装及使用:https://blog.csdn.net/xujunxuan/article/details/86634734
哔哩哔哩jason up主的视频:https://www.bilibili.com/video/BV1m4411T728
可能遇到的问题:
1.dcmtk的版本一定要选择正确,看你的电脑是32位,还是64位,选择合适的,要不然后面会出现库文件版本x64和目标计算机位数x86不一样的类似错误,当然此错误可以通过更改库文件和项目编译的编译器版本来达到一致,一般支持64位系统都可实现32位的编译,但最好先前配置好。
2.新版的dcmtk下载的时候直接下载icon版本就可,icu版本不需要(具体区别可上网查询),在cmake中配置相应选项。
3.遇到配置问题错误,有个windows kits的插件,看是否需要相关下载解决,具体可上网查询。
3.3.DCMTK读取dcm文件
基本流程是:
1.创建一个dcmtk可执行的dll工程,以备visual studio可以引用,制作dll的好处:减少解决方案列表中的头文件及c++文件显示太多,另一方面可以在其他项目中再次调用,方便多次使用。
2.下载一个boost插件,在后面dll中引用,是为了解决一些相应的引用权限问题,要在dll的引用目录和lib里用到。
具体流程见网页链接:https://www.jianshu.com/p/1b7a258669cd
哔哩哔哩jason up主的视频:https://www.bilibili.com/video/BV1a4411m7yH
上面站主关于dicom的解读有一个系列视频,包括5个,见解独到,值得一看。
可能遇到的问题:

  1. 目标计算机版本x86与库文件x64不匹配的问题:由于下载dctmk库的时候,版本不匹配,下载错误。解决办法:一是可以重新下载与当前计算机相匹配的版本库,重新编译构建;第二种方法是更改项目编译器,使项目编译与库版本一样,具体可查询百度,需要下载一个windows_dgb的文件进行一些文件添加。
  2. 找不到msvcr120d.dll: https://blog.csdn.net/qq_24537165/article/details/90137317
  3. Dll文件编译成功,但是无法调用,项目编译也通过,但是出现异常,无法读取数据,报错访问冲突。解决办法:这是制作的dll有问题,包括路径和包含目录等问题的错误,还有一个可能是引用dcmdata.dll等文件出错,可能是该文件失效或由于某些原因不完整。后者解决办法:将开始cmake制作的dcmtk库中的相应文件替换制作的Dll中的文件。
  4. 无法访问dcmdata.dll等文件。原因可能是制作的dll文件编译不通过,或者在vc++目录中include,lib中添加错误,还有注意在链接器中加入相应的Lib文件,包括生成的dll 文件的lib。
    3.4.进行在vc++上的界面实现
    设计采用MFC应用程序,基于对话框构建,使用多字符集,设置dll库和项目输出目录为同一个路径,方便调试。用到的控件:静态文本(static text)、按钮(button)、编辑框(edit control)、标签控件(tab control)、列表控件(list control)。
    可能遇到的问题:
    1.qt5中使用GBK字符集,所有的符号类型都转换成GBK格式再进行输出显示,在MFC中没有使用,所以涉及字符类型转换,主要是日期时间类转成可显示的string类,采用DateToString()函数进行转换。
    2.列表更新,每次更新要进行原数据的完全清除,包括表头的清除,然后再进行数据重新写入。
    3.标签的子窗口要获取父窗口的指针,要调用两次getparent(),相当于标签页的子窗口第一次得到标签窗口,第二次得到父窗口,完成调用。

在这里插入图片描述

图3.1 MFC用户登录界面
在这里插入图片描述

图3.2 模式选择

在这里插入图片描述

图3.3 治疗模式数据显示

使用 DCMTK读取 DICOM 文件需要进行以下步骤: 1. 引入 DCMTK 库 在 QT 项目中引入 DCMTK 库,可以通过在项目文件中添加以下代码引入静态库: ``` LIBS += -L/path/to/dcmtk/lib -ldcmdata -loflog -lofstd -li2d -ldcmimage -lzlib -lpng -ltiff ``` 注意:需要将 /path/to/dcmtk/lib 替换为 DCMTK 库的安装路径。 2. 初始化 DCMTK 库 在 QT 代码中,需要先初始化 DCMTK 库,可以在 main 函数中添加以下代码: ``` #include <dcmtk/config/osconfig.h> #include <dcmtk/dcmdata/dctk.h> int main(int argc, char *argv[]) { // 初始化 DCMTKDcmInitialize(argc, argv); ... } ``` 3. 读取 DICOM 文件 使用 DCMTK读取 DICOM 文件可以使用 DcmFileFormat 类,以下是一个示例代码: ``` #include <dcmtk/config/osconfig.h> #include <dcmtk/dcmdata/dctk.h> void readDICOM(const char* filename) { // 创建 DcmFileFormat 对象 DcmFileFormat fileformat; // 读取 DICOM 文件DcmFileFormat 对象中 OFCondition status = fileformat.loadFile(filename); if (!status.good()) { qDebug() << "Failed to read DICOM file"; return; } // 获取 DICOM 数据集 DcmDataset* dataset = fileformat.getDataset(); // 获取 DICOM 图像数据 Uint16 *pixelData; dataset->findAndGetUint16Array(DCM_PixelData, pixelData); // 获取 DICOM 图像大小 Uint16 rows, cols; dataset->findAndGetUint16(DCM_Rows, rows); dataset->findAndGetUint16(DCM_Columns, cols); } ``` 上述代码中,首先创建 DcmFileFormat 对象,然后使用 loadFile() 方法读取 DICOM 文件,如果读取成功,则可以使用 getDataset() 方法获取 DICOM 数据集,使用 findAndGetUint16Array() 方法获取图像数据,使用 findAndGetUint16() 方法获取图像大小。 注意:DCMTK 库使用 C++98 标准,因此需要在 QT 项目中添加 -std=c++98 编译选项。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

baidu_39340315

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值