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

  • 相关阅读:
    WinowsXP 任务栏无法显示当前运行程序图标
    日志记录组件[Log4net]详细介绍(转)
    桌面上的IE图标变成了快捷方式那种图标 怎么还原回来
    面试必须要知道的SQL语法,语句(转载)
    兼容 火狐 IE 的JS时间控件 任意格式 年月日时分秒
    Nagios远程监控软件的安装与配置详解(1)
    linux集群 负载均衡实验笔记
    PHPB2B 模板 标签
    PHP 去除 HTML 回车 换行 空格
    OpenX参考网址
  • 原文地址:https://www.cnblogs.com/h2zZhou/p/4911556.html
Copyright © 2011-2022 走看看