基于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
基于DCMTK的DICOM相关程序编写攻略相关推荐
- 【转】基于DCMTK的DICOM相关程序编写攻略
转自:https://blog.csdn.net/jackmacro/article/details/5332654 零.前言: 由于现在的医学影像设备的图像存储和传输正在逐渐向DICOM标准靠拢,因 ...
- 从入门到入土:[linux实践]-pam|编写基于libpam的用户认证程序|编写基于PAM认证的应用程序|详细说明|实验步骤|实验截图
写在前面: 此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 编写基于libpam的用户认证程序|编写基于PAM认证的应用 ...
- 基于Springboot+Vue的MOBA类游戏攻略分享平台
摘 要 随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息.为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,各行各业相继进入信息管理时代,M ...
- AIGC:ChatGPT(一个里程碑式的对话聊天机器人)的简介(意义/功能/核心技术等)、使用方法(七类任务)、案例应用(提问基础性/事实性/逻辑性/创造性/开放性的问题以及编程相关)之详细攻略
AIGC:ChatGPT(一个里程碑式的对话聊天机器人)的简介(意义/功能/核心技术等).使用方法(七类任务).案例应用(提问基础性/事实性/逻辑性/创造性/开放性的问题以及编程相关)之详细攻略 导读 ...
- 软件创富密码:iPhone应用程序开发攻略之iPhone特色传感器应用(双色)
软件创富密码:iPhone应用程序开发攻略之iPhone特色传感器应用(双色) 王志刚等 编著 ISBN978-7-121-14440-0 2011年9月出版 定价:69.00元 16开 288 ...
- EL:集成学习(Ensemble Learning)的概念讲解、问题应用、算法分类、关键步骤、代码实现等相关配图详细攻略
EL:集成学习(Ensemble Learning)的概念讲解.算法分类.问题应用.关键步骤.代码实现等相关配图详细攻略 目录 集成学习Ensemble Learning 1.集成学习中弱分类器选择 ...
- 基于ANSYS Polyflow的逆向挤出模头设计攻略
摘要:内侧灯罩属于复杂截面塑料异型材,目前其挤出模头的设计主要依赖于经验,需要反复试模和修模,使得模具质量难以保证,生产周期长,成本高. 本文采用数值模拟方法对内侧灯罩进行了反向挤出模头设计.首先对内 ...
- VS2015编译TensorFlow C++程序完全攻略
VS2015编译TensorFlow C++程序完全攻略 本文参考和综合了多篇网络博客文章,加以自己的实践,最终终于在windows环境下,编译出可以用于C++程序调用tensorflow API的程 ...
- 安装程序 Repack 攻略 之 MSI 篇(IS版)
本文主要讨论使用 InstallShield 进行 MSI 安装包的修改封装,要查看如何使用微软提供的开发工具进行此操作,请查看此贴: [原创]安装程序 Repack 攻略 之 MSI 篇(MS版) ...
最新文章
- HTML、CSS、JS都有哪些区别
- 虚函数和纯虚函数的区别?
- linux oracle删除恢复数据恢复,Linux下Oracle误删除数据文件恢复操作
- 小脑袋智能推广软件360专版
- vega56刷64_Vega56刷入BIOS跑分直逼旗舰Vega64
- 无ide编译java_无IDE编译和运行java
- 自定义StartIO
- 在markdown中通过html语法实现表格中的有序列表和无需列表
- java 银行卡号格式化_JS银行卡号格式化 - JavaScript常用效果 - Front-End - NalanXue's Blog...
- elementui 嵌套表单验证_vue elementUI 表单嵌套验证的实例代码
- Oracle数据库使用Navicat premium创建用户时遇到的坑
- Selenium滚动条window.scrollTo和window.scrollBy
- 计算机网络知识学习(核心:网络协议)-- 应用层
- VC2005用不惯呀....
- Ubuntu下常用软件介绍
- CH340G版USB转串口自动下载器原理图
- 数学建模与数学实验3.4习题1
- 使用JavaScript打开Chrome的设置页面
- 标签上title属性与alt属性的区别是什么
- Flutter 3更新详解