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

转载 2011年01月10日 08:22:00

基于 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, ofs td

       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、  

6、  

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

相关文章推荐

最全DCMTK攻略

  • 2015年11月12日 11:24
  • 572KB
  • 下载

VS2010 ATL服务程序编写全攻略(一) - 建立ATL服务

网上有很多关于编写ATL服务程序的代码和文章,但多数仍使用Visual C++ 6.0的ATL服务程序框架。对于XP系统,Visual C++ 6.0提供的框架能够正常工作,但对于Vista、Wind...

VS2010 ATL服务程序编写全攻略(二) - 内核对象访问

在上一篇中,我们实现了基本的ATL系统服务框架,在这一篇中,我们来看一看服务程序与应用程序内核对象的访问。 首先,先在ATL服务中创建一个内核对象,这里我选用了事件对象。 在上...

DICOM医学图像处理:基于DCMTK工具包学习和分析worklist

背景: DICOM3.0协议中有介绍关于worklist的部分。简而言之,worklist可以看做是放射科设备从医院RIS系统中自动读取患者信息的一种“通信协议”,可以指存储在RIS系统中的患者数...
  • zssureqh
  • zssureqh
  • 2014年08月23日 08:01
  • 15903

应用DCMTK资源浏览Dicom图片

  • 2010年07月01日 08:55
  • 3.42MB
  • 下载

DICOM医学图像处理:开源库mDCM与DCMTK的比较分析(一),JPEG无损压缩DCM图像

背景介绍: 最近项目需求,需要使用C#进行最新的UI和相关DICOM3.0医学图像模块的开发。在C++语言下,我使用的是应用最广泛的DCMTK开源库,在本专栏的起初阶段的大多数博文都是对DCMTK开...
  • zssureqh
  • zssureqh
  • 2014年08月11日 16:15
  • 13265

VS2010 ATL服务程序编写全攻略(三) - 创建用户桌面进程(突破Session 0隔离)

上一篇中,我们完成了服务层与应用层的内核对象访问。 这篇文件,将主要说明如何在服务层创建一个用户进程,显示在用户桌面上,并且允许交互。 这里就引入了Windows Vista之后的Session ...

DICOM医学图像处理:DCMTK的wiki资料学习之PACS调试

背景:前段时间着重从dcmtk和fo-dicom(mDCM)源码角度进行剖析,期望加深对DICOM协议的理解。知其然,知其所以然。如果“所以然”很不好懂,那我们还是先多多“知其然”吧。搞清楚原理的目的...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:基于DCMTK的DICOM相关程序编写攻略
举报原因:
原因补充:

(最多只允许输入30个字)