当前位置: 首页 > 编程日记 > 正文

基于DCMTK的DICOM相关程序编写攻略

2008年09月10日 星期三 15:35

基于DCMTK的DICOM相关程序编写攻略

前言:

由于现在的医学影像设备的图像存储和传输正在逐渐向DICOM标准靠拢,在我们进行医学图像处理的过程中,经常需要自己编写和DICOM格式的图像相关的各种程序模块,以完成自己处理功能。如果从头开始理解DICOM的协议,然后完全自己编写这些代码来实现这些协议,是一件工程浩大的事情。德国offis公司开发的DCMTK,为我们提供了实现DICOM协议的一个平台,使得我们可以在它的基础上轻松的完成自己的主要工作,而不必把太多的精力放在实现DICOM协议的细节问题上。本文以WINDOWSXP+VC6.0为开发平台,从DCMTK的下载、调试、使用等方面介绍基于DCMTK的DICOM相关程序编写过程。

一、             DCMTK简介

DCMTK是由德国offis公司提供的开源项目,并拥有相应的版权。这个开发包经过10多年的开发和维护,已经基本实现了DICOM协议的所有内容。该开发包提供所有的源代码、支持库和帮助文档。DCMTK提供了在各种操作系统下使用的可能版本,如LINUX、SUN、WINDOWS等,用户可更具自己的开发平台进行编译。目前DCMTK的版本是3.5.3。

二、DCMTK的下载和调试

DCMTK公司的主页是: http://dicom.offis.de。

1、首先下载DTMTK源代码。可以通过以下地址:ftp://dicom.offis.de/pub/dicom/offis/software/dcmtk/dcmtk353/dcmtk-3.5.3.zip

2、下载相关的支持库:

ftp://dicom.offis.de/pub/dicom/offis/software/dcmtk/dcmtk353/support/dcmtk-3.5.3-win32-i386-support.zip

3、安装或调试。

(1)首先是将DCMTK的源代码解压后和它的支持库放在同一个目录下面。

(2)使用CMake软件得到DCMTK的工程文件。

使用MAKE工具CMake,不仅可以创建DCMTK编译项目文件,还可以对DCMTK进行配置。步骤如下

①从http://www.cmake.org/HTML/Download.html下载CMake for Windows最新的版本。

②安装CMake并对CMake的如下选项进行设置(设置前需先删除原来的旧项目文件):如图1所示

Where is the source code: dcmtk-3.5.3 path

Where to build the binaries: dcmtk-3.5.3 path

Build for: Visual Studio 6

Configure --> Modify Cache Values! --> Configure

OK!

图1。使用CMake创建DCMTK编译项目文件

(3)用VC6打开项目文件DCMTK.dsw进行编译,根据提示,在编译环境(Tools->Option->Directories)中加入相应的头文件和库文件。

(4)DCMTK的编译可能需要比较长的时间,过程中也可能出现各种连接错误,大都有编译环境引起。

三、基于DCMTK的DICOM相关程序。

1、建立自己的应用工程并将其加入DCMTK的工作空间(Project->Insert Project To WorkSpace)。

2、在自己的工程中加入需要使用的DCMTK静态库和头文件。

按照正确的顺序填写链接库文件(对于链接库来说顺序也是很重要的!) DCMTK库有下面这些依赖关系:

dcmdata -》 ofstd

dcmimage -》 dcmimgle, dcmdata, ofstd

dcmimgle -》dcmdata, ofstd

dcmjpeg -》ijg8, ijg12, ijg16, dcmimage, dcmimgle, dcmdata, ofstd

dcmnet -》dcmdata, ofstd

dcmpstat -》 dcmimage, dcmimgle, dcmsign, dcmsr, imagectn, dcmtls, dcmnet, dcmdata,       ofstd

dcmsign -》dcmdata, ofstd

dcmsr -》dcmdata, ofstd

dcmtls -》dcmnet, dcmdata, ofstd

dcmwlm -》dcmnet, dcmdata, ofstd

imagectn -》 dcmnet, dcmdata, ofstd

3、编译自己的工程。

4、不成功的可能有如下一些问题。

(1)对于单文档工程,运行时提示:

generated debug assertion

if (!ProcessShellCommand(cmdInfo))

return FALSE;

-- File: docsingl.cpp

Line: 215

原因:缺少AFX_IDS_UNTITLED的字符串

解决:在资源文件的STRING TABLE中加入 ID= AFX_IDS_UNTITLED的键值。

(2)编辑时提示:

fatal error C1189: #error : Please use the /MD switch for _AFXDLL builds

原因:

解决:在Project->Settings->Preprocessor definitions中去掉 _AFXDLL项。

(3)编译时提示:

LIBCMTD.lib(dbgheap.obj):error LNK2005: _malloc already defined in msvcrtd.lib(MSVCRTD.dll)

原因:由于VC在编译时试图从两个不同的库中写入同一个函数代码,只要忽略这些相冲突的默认库就可以解决。

解决:在Project->Settings->Link->Category->Input—>Ignore Liberies中加入

相应的msvcprtd.lib,msvcrtd.lib等。

另一种解决:保证自己的编译环境为:

A)project->settings->c/c++->category->code generation的use run-time library 为debug multithreaded.

B) 在Project->Settings->Preprocessor definitions中去掉 _AFXDLL项。

C)如果需要,在资源文件的STRING TABLE中加入 ID= AFX_IDS_UNTITLED的键值。

D)这样就不需要忽略那些库了。

还有可以:

后来尝试了很多方法,经过摸索,最后得出解决方法:

在Preprocessor中定义_AFXDLL

如果它提示:fatal error C1189: #error : Please use the /MD switch for _AFXDLL builds

就这样改:

C/C++->Code Generation->Multithread DLL (即实现/MD选项)

(4)编译时提示:

dcmdata.lib(dcuid.obj) : error LNK2001: unresolved external symbol _Netbios@4

原因:缺少所需的链接库文件

解决:在自己的工程中加入需要使用的DCMTK静态库和头文件,并注意顺序。

(5)编译时提示:

fatal error LNK1181: cannot open input file。。。。。。。 Debug.obj

原因:类似错误,可能是由于目录中含有太长的中文名字。

解决:可以将中文的目录名改为英文就OK

(6)运行时提示:

原因:

解决:在Project->Settings->Preprocessor definitions中去掉 _AFXDLL项。

(7)如果将已经make好的dcmtk目录复制到其它目录,则需要重新make,否则会出现一大堆路径错误

四、一个实际的例子

我们经常使用的DICOM主要是读和写DICOM文件。下面以读写DICOM为例DCMTK的使用方法。

五、其它一些相关的问题

1、把DCMTK当作静态库使用:DCMTK本身提供的是静态库即Lib,在链接进自己的工程时会将全部的函数加入,因此造成可执行文件很大,而且不便于升级;如果需要使用DCMTK作为动态库链接,需要自己建立相应的Dll工程,然后把原来的程序文件加进来,再写一个导出函数的文件,这些导出函数保持固定。这样其它地方使用的时候不会因为动态库程序升级又重新编译。

2、

参考文件:

1、 DCMTK的常见问题论坛:http://forum.dcmtk.org/

2、 DCMTK的帮助文档:ftp://dicom.offis.de/pub/dicom/offis/software/dcmtk/dcmtk353/docs/dcmtk-3.5.3-html-help.zip

3、 DICOM标准2004版。

4、 DICOM Validation Tool (DVT)是一个DICOM有效性测试工具,用来测试产品的DICOM兼容性。ADVT顾名思义就是Agfa提供的DICOM Validation Tool......

5、 http://www.pacser.net/dispbbs.asp?boardID=20&ID=72&page=1

转载于:https://www.cnblogs.com/h2zZhou/p/4911556.html

相关文章:

计算机组成考试题及答案,计算机组成测试题一参考答案

计算机组成测试题一参考答案一、填空题(每空1分,共20分)1. 设二进制数X2+100(—0.10101100),用15个二进制位来表示它的浮点数,阶码用5位,其中阶符用2位;尾数用10位,其中符号用2位(2100中的100为…

典型的垃圾收集算法

上一编:《垃圾回收之标记算法》 ,用以确认那些垃圾判定为可以回收。 在确定了哪些垃圾可以被回收后,垃圾收集器要做的事情就是开始进行垃圾回收,但是这里面涉及到一个问题是:如何高效地进行垃圾回收。由于Java虚拟机规…

Oracle10g安装中遇到的错误及解决办法

linux解决xhost: unable to open display实用技巧:在Linux下设置xhost方法步骤 第一步:用root登陆linux,启动vnc服务;第二步:根据vnc起来的端口,设置export DISPLAYlocalhost:1(1表示vnc在第一个…

Result Maps collection already contains value for

启动的时候报错,junit报错一样的 Result Maps collection already contains value for mybatis 查了一下应该是 ***mapper.java和 ***mapper.xml解析有问题了, 不能注入了。 按照***mapper.java 里的方法一个一个到***mapper.xml去查 id 结果发现有一个…

创建三维建筑可视化和虚拟现实的最快和最简单的方法

创建三维建筑可视化和虚拟现实的最快和最简单的方法 时长3小时12分 1280X720 Mkv 语言:英语中文字幕(根据原英文字幕机译更准确)原英文字幕 大小解压后:2.86G 共28小节课程 标题:Skillshare–TWINMOTION实时3d架构可…

刚过国家线计算机考研报哪个好,考研估分刚过了去年国家线,今年上岸还有希望吗?有!...

随着2020年考研成绩的陆续发布,考生们的神经也愈发紧张起来。有很多的同学其实在成绩发布之前,就已经通过网上的答案对自己整体的考试分数有了个大概的估计,于是很多同学乃至是学生家长就想问了,如果估分刚刚过了去年的国家线&…

2022-2028年中国数码摄像机市场投资分析及前景预测报告

【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新(交付时间约3个工作日) 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国数码摄像机行业市场行业相关概述、中国数码摄像机行业市场行业运行环境、分析了中国数码摄…

Android中怎么使图片显示

android中经常到利用图片,利用图片时我们都是把图片放在drawable-xxx目录下,因为这里就是存储图片的地方,xxx不用理他,就是关于分辨率而已。 楼主在学习android的时候一直尝试把图片在程序中显示,但是一直不成功&#…

webElement.text()获取到内容为空

使用webElement.text()方法获取字符串时,有时候会获取失败--获取到的内容为空 使用 webElement.getAttribute("attributeName"),通过textContent, innerText, innerHTML等属性获取 public String getText(String string){WebDriverWait wait …

【blender教程】从头到尾全流程创建一辆吉普车

【blender教程】从头到尾全流程创建一辆吉普车 持续时间41小时 30分 包括项目文件 1280X720 MP4 语言:英语中文字幕(根据原英文字幕机译更准确)原英文字幕 大小解压后:34.7G 云桥网络 平台huo取 教程 blender:从头到尾打造吉普…

Hat’s Words(字典树)

Hat’s Words Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 11314 Accepted Submission(s): 4041 Problem DescriptionA hat’s word is a word in the dictionary that is the concatenation of exactly two…

遥感计算机分类的基本原理,遥感数字图像的计算机分类

《遥感数字图像的计算机分类》由会员分享,可在线阅读,更多相关《遥感数字图像的计算机分类(3页珍藏版)》请在人人文库网上搜索。1、遥感数字图像的计算机分类一、实验类型综合型二、实验目的与要求1、实验目的掌握非监督分类的过程和方法。2、实验要求(1…

Java垃圾回收之新生代垃圾收集器

分代收集算法 Stop-the-World(停止一切) JVM由于要执行GC而停止了应用程序的执行任何一种GC算法中都会发生多数GC优化通过减少Stop-the-world发生时间来提高程序性能 Safepoint (安全点) 分析过程中对象引用关系不会发生变化的…

用x86的模拟器内核记得安装intel的haxm

Android 模拟器一直以运行速度慢著称, 本文介绍使用 Intel HAXM 技术为 Android 模拟器加速, 使模拟器运行度媲美真机, 彻底解决模拟器运行慢的问题。 Intel HAXM (Hardware Accelerated Execution Manager) 使用基于 Intel(R) Virtualizatio…

我焦躁,并不只是心里承受,还是因为我上面担着。

由于工作任务紧、重,最近很焦躁,终于在今天爆发了。在这次爆发中,隐约的感到并不只是自己的“心理承压”能力的问题。 我爆发后,发现虽然任务如此紧张,但是组长只是“紧张”,工作还是“有条有序”的进行着。…

ue4商城资源 Car Configurator Template 汽车配置器模板

ue4商城资源 Car Configurator Template 汽车配置器模板 ue4商城资源 Car Configurator Template 汽车配置器模板 Unreal Engine虚幻游戏引擎素材资源 Unreal Engine Marketplace –Car Configurator Template 4.25 汽车配置器模板 素材大小解压后:0.99G 云桥网络…

Sublime Text 3 常用插件以及安装方法(转)

http://www.cnsecer.com/460.html 安装Sublime Text 3插件的方法: 朋友们,小站活着不容易,全靠广告费养着了,如果本文对你有帮助。麻烦动下手点下页面的广告吧,谢谢! 直接安装 安装Sublime text 2插件很方便…

现代计算机基本工作原理,现代计算机的基本工作原理是

现代计算机的基本工作原理是存储程序控制。“计算机”一般是指“电子计算机”,电子计算机(electronic computer)通称电脑,是现代一种用于高速计算的电子计算机器。可以进行数值计算、逻辑计算,具有存储记忆功能,能够按照程序运行&…

Java垃圾回收之老年代垃圾收集器

1、Serial Old 收集器(-XX: UseSerialOldGC, 标记-整理算法) 单线程收集,进行垃圾收集时,必须暂停所有工作线程简单高效,Client模式下默认的老年代收集器2、Parallel Od收集器(-XX: UseParallelOldGC ,标…

linux中awk下 gsub函数用法

gsub函数则使得在所有正则表达式被匹配的时候都发生替换gsub(regular expression, subsitution string, target string);简称 gsub(r,s,t)一、遇到的问题:问题:echo "a b c 2011-11-22 a:d" | awk $4gsub(/-/,"",$4)为啥…

Maya2022基础入门学习教程

Maya2022基础入门学习教程 Maya 2022 Essential Training Maya2022基础入门学习教程 Maya 2022 Essential Training MP4 |视频:h264,1280x720 |音频:AAC,44.1 KHz,2 Ch 技能水平:初级|流派:电子学习|语言:英语中文字幕(机译&…

简单几何(线段覆盖) POJ 3347 Kadj Squares

题目传送门 题意:告诉每个矩形的边长,它们是紧贴着的,问从上往下看,有几个还能看到。 分析:用网上猥琐的方法,将边长看成左端点到中心的距离,这样可以避免精度问题。然后先求出每个矩形的左右端…

服务器自动post,jquery ajax $.post自动变GET的解决方式(for CI)

环境:CI 3.x windows 2008 phpstudy jquery 1.7.2 apache以往一直用lnmp,这次用windowsapache,遇到了一些问题,记录下来。将本地的文件上传到服务器上以后,有一个将大段html提交到服务器处理的代码,是用…

2022-2028年中国数据中台行业深度调研及投资前景预测报告(全卷)

【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新(交付时间约3个工作日) 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国数据中台行业市场行业相关概述、中国数据中台行业市场行业运行环境、分析了中国数据中台行…

为什么一定要杀掉病毒?---帮一位老师解决MyDocument.exe优盘文件夹图标病毒问题...

最近一位大学老师给我抱怨了一个她遇到的烦恼,一直在纠结,生活都被打乱了,事情大概是这样的: 她的优盘里辛辛苦苦弄好备课文件,放在了优盘里,可是每次上课时,就是找不到文件。有时好多文件都被修…

微信小程序开发初探

一、关于微信小程序 1.1 小程序诞生的背景 张小龙说道: (1)一切以用户价值为依归→用户是微信的核心,所以微信中没有很多与客户无关的功能,比如QQ中的乱七八糟一系列东西。 (2)让创造发挥价值→…

ue4商城资源 The Forest v1.5 森林景观场景

ue4商城资源 The Forest v1.5 森林景观场景 ue4商城资源 The Forest v1.5 森林景观场景 ue4商城资源 The Forest v1.5 森林景观场景 Unreal Engine虚幻游戏引擎素材资源 Unreal Engine Marketplace –The Forest v1.5 森林景观场景 大小解压后:2.62G 云桥网络 平台…

服务器硬盘如何增加分区,服务器硬盘分区方法是什么?

服务器硬盘,顾名思义,就是服务器上使用的硬盘。如果说服务器是网络数据的核心,那么服务器硬盘就是这个核心的数据仓库,所有的软件和用户数据都存储在这里。用户用久了服务器硬盘就可能会出现空间不足的情况,那么应该如…

在批处理中调用JS操作MongoDB

在MongoDB中,我们可以通过JS脚本去操作数据。 一、编写数据操作JS脚本 新建JS文件writeData.js,编写数据操作内容如下: var curTime new Date(); db.user.insert({name:张三,password:123456, UpdateTime:curTime}); 另存文件,将…

Object的finalize()方法的作用是否与C++的析构函数作用相同

Object的finalize()方法的作用是否与C的析构函数作用相同 public class Finalization {private static Finalization finalization;/**finalize在gc回收中有不确定性,所以不推荐用finalize进行回收*/Overrideprotected void finalize(){System.out.println("fi…