zoukankan      html  css  js  c++  java
  • 基于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

  • 相关阅读:
    HDU 4539郑厂长系列故事――排兵布阵(状压DP)
    HDU 2196Computer(树形DP)
    HDU 4284Travel(状压DP)
    HDU 1520Anniversary party(树型DP)
    HDU 3920Clear All of Them I(状压DP)
    HDU 3853LOOPS(简单概率DP)
    UVA 11983 Weird Advertisement(线段树求矩形并的面积)
    POJ 2886Who Gets the Most Candies?(线段树)
    POJ 2828Buy Tickets
    HDU 1394Minimum Inversion Number(线段树)
  • 原文地址:https://www.cnblogs.com/h2zZhou/p/4911556.html
Copyright © 2011-2022 走看看