当前位置: 首页 > news >正文

Windows下用CMake编译DCMTK及配置测试

作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

DCMTK是什么?

       DCMTK(DICOM Toolkit)是由德国Offis信息技术研究所开发的开源工具包,专为处理医学影像领域的 DICOM(Digital Imaging and Communications in Medicine)标准而设计。作为医学影像信息处理的核心组件,它提供了一套完整的 API 和工具集,支持 DICOM 格式文件的解析、生成、修改及网络传输等功能,广泛应用于医疗设备开发、医学影像管理系统(如 PACS)及相关科研项目中。

核心功能与架构

       DCMTK 采用模块化架构,核心组件包括:

  • dcmdata:处理 DICOM 数据结构与标签(Tag)解析,支持 DICOM 文件格式的底层操作;
  • dcmnet:实现 DICOM 网络通信协议(如 C-FIND、C-MOVE、C-STORE 等),支持医学设备间的影像传输;
  • dcmimage:提供 DICOM 影像的像素数据处理能力,包括图像解码、窗宽窗位调整及格式转换;
  • dcmjpeg/dcmraw:支持 DICOM 图像的压缩(如 JPEG、JPEG 2000)与原始数据处理;
  • 工具链:包含命令行工具(如dcm2pnmdcmsend),方便用户直接进行影像格式转换或网络传输。

应用场景与特性

       在医疗领域,DCMTK 是连接不同设备与系统的桥梁:

  • 设备开发:医疗设备厂商用其实现 DICOM 接口,确保影像能与医院系统兼容;
  • PACS/RIS 系统:用于构建影像归档与通信系统,实现影像的存储、检索与共享;
  • 科研与教学:研究者可借助其 API 开发影像分析算法,或解析 DICOM 数据结构进行学术研究。

       其技术特性包括:

  • 跨平台支持:兼容 Windows、Linux、macOS 等主流系统,适配不同开发环境;
  • 标准兼容性:持续跟进 DICOM 标准更新,支持最新的协议与数据格式;
  • 开源与许可:开源许可宽松,商业与非商业项目均可灵活使用,社区生态活跃。

价值与影响

       作为医学影像数字化的基础工具,DCMTK 降低了开发者处理 DICOM 标准的技术门槛,推动了医疗影像系统的标准化与互操作性。从医院的影像归档到科研中的影像分析,其稳定性与专业性使其成为行业内的重要技术支撑。

下载与编译

       个人建议学会编译过程,因为每个人的开发环境都不太一样,如果你是VS2022,可以用我编译好的DCMTK库,放在文后自行获取。

       1)网站:DCMTK - dicom.offis.de,下载DCMTK。

       2)下载依赖库,根据自己的VS版本选择,我这边是VS2022 64位。选MD,动态链接。

       3)解压后如下图所示,还需要用CMake进行编译。

CMake安装和配置参考:Windows下配置CMake(入门级教程,适合新人收藏学习)_window cmake-CSDN博客

        4)安装好CMake后,按Win+R打开运行,输入cmd打开命令运行窗,输入cmake-gui,中间无空格,会出现cmake界面。source输入DCMTK的文件路径,build可以在其路径下创建个build文件夹,如下图所示。勾选advanced和grouped。

       5)点击configure配置,我是vs2022 x64,点确定就开始运行了。

       6)configure第一次后应该要进行一次配置。BUILD_SHARED_ILBS打钩,为了后面生成库;CMAKE_INSTALL_PREFIX设置生成库的路径,建议是在DCMTK目录下创建个bin文件;DCMTK_OVERWRITE_WIN32_COMPILER_FLAGS取消;

       7)参照之前下载的依赖库,勾选下面几个选项,并在With里填写对应路径。

       8)然后再次点击configure,取消勾选USE_COMPILER_HIDDEN_VISBILITY,继续点击configure,直到没有红色。

       9)点击generate,生成项目。进入build文件夹,点击sln项目工程文件;选中ALL_BUILD,选择release/debug,再点击生成ALL_BUILD,此时会进行一段时间的编译操作;再选中INSTALL,点击仅生成,等待结束去看之前设置的bin文件夹,分别是DLL、头文件和LIB。

       10)至此,DCMTK库的编译已经结束。

配置与测试

       1)把之前bin文件夹里的所有文件单独拷贝到某个位置,比如我放在了G盘3rd文件夹下的dcmtk中,方便管理,编辑环境变量,输入dcmtk的bin文件路径。

       2)创建一个VS项目,可以单项目配置也可以全局配置,我喜欢每个项目独立开,各配置各的,就这样演示了。在项目设置中,包含目录中放include路径,库目录放lib路径。

       3)链接器-输入-附加依赖项和lib名字全放进去,因为名字太多,可以找到lib目录,在路径框里输入cmd,这样可以快速定位到当前位置,然后输入下方命令,即可快速获取lib的名字排列。

dir /b *.lib>out.txt

       4)接下来,开始测试,输入下方代码,看看VS有没有异常提示,如果没有就直接运行,就ok啦。

#include <iostream>
#include "dcmtk/dcmdata/dctk.h"
#include "dcmtk/dcmimgle/dcmimage.h"int main() 
{// 初始化DCMTK配置DcmFileFormat fileFormat;OFCondition status;// 将此路径替换为你实际的DICOM文件路径const char* filename = "DicomData/1.2.840.113704.1.111.2492.1490164523.1383.dcm";// 读取DICOM文件status = fileFormat.loadFile(filename);if (status.good()) {std::cout << "成功读取DICOM文件!" << std::endl;// 获取患者信息OFString patientName;if (fileFormat.getDataset()->findAndGetOFString(DCM_PatientName, patientName).good()) {std::cout << "患者姓名: " << patientName << std::endl;}OFString patientID;if (fileFormat.getDataset()->findAndGetOFString(DCM_PatientID, patientID).good()) {std::cout << "患者ID: " << patientID << std::endl;}// 获取研究信息OFString studyDescription;if (fileFormat.getDataset()->findAndGetOFString(DCM_StudyDescription, studyDescription).good()) {std::cout << "检查描述: " << studyDescription << std::endl;}// 尝试加载图像(如果有)DicomImage* image = new DicomImage(filename);if (image != NULL && image->getStatus() == EIS_Normal) {std::cout << "成功加载DICOM图像!" << std::endl;std::cout << "图像尺寸: " << image->getWidth() << " x " << image->getHeight() << std::endl;}else {std::cout << "无法加载DICOM图像。可能不是图像文件。" << std::endl;}delete image;}else {std::cerr << "读取DICOM文件失败: " << status.text() << std::endl;std::cerr << "请确保DICOM文件路径正确,并且dcmtk库已正确安装。" << std::endl;return 1;}return 0;
}

       5)如果碰上C++特性异常,如下所示,参考下方链接解决。

解决方案:__cplusplus宏的值始终为199711L(即 C++98)_cplusplus 为199711l-CSDN博客

已编译好的库

百度云地址:

通过网盘分享的文件:dcmtk.rar
链接: https://pan.baidu.com/s/1bOZ_nAnsK68IMYFEGAf9zQ 提取码: xfxe 

       以上就是“Windows下用CMake编译DCMTK及配置测试”的过程。 

       如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!

http://www.xdnf.cn/news/935605.html

相关文章:

  • DeepSeek R1 V2 深度探索:开源AI编码新利器,效能与创意并进
  • Argo CD 入门 - 安装与第一个应用的声明式同步
  • IDEA为何一直无法使用超过4g内存
  • 文献阅读:Exploring Autoencoder-based Error-bounded Compression for Scientific Data
  • LSTM-SVM多变量时序预测(Matlab完整源码和数据)
  • VB调用CryReport指南方案
  • JVM——对象模型:JVM对象的内部机制和存在方式是怎样的?
  • 【学习笔记】深入理解Java虚拟机学习笔记——第5章 调优案例分析与实战
  • 第12篇:数据库中间件日志设计与追踪系统落地实践
  • MySQL知识回顾总结----数据库基础
  • 计算机常用快捷键分类汇总,涵盖 Windows、macOS 以及通用软件场景
  • STM32[笔记]--1.前置准备
  • AI系统的构建
  • 基于React 的 AntD 库进行前端开发过程中的问题汇总
  • 空间转录组数据下游分析(二)
  • 玄机——某次行业攻防应急响应(带镜像)
  • Java求职者面试指南:计算机基础与源码原理深度解析
  • 智警杯备赛--机器学习算法实践
  • 深度学习登上Nature子刊!特征选择创新思路
  • C# 表达式和运算符(表达式和字面量)
  • 【JavaScript-Day 35】从 window 到 location,一文掌握浏览器对象模型 BOM
  • Web前端开发:JavaScript中的eval()函数
  • triton学习笔记7: GEMM相关
  • uniapp跳转到webview组件的时候,要注意:移除所有不可见字符(包括零宽空格)
  • Linux系统之grub-mkrescue详解
  • vue.js not detected解决方法
  • Oracle实用参考(13)——Oracle for Linux物理DG环境搭建(2)
  • 第四篇:服务商(工人端)-02服务商入驻审核
  • SCADA|RESTful学习,Apipost通过GET获取KingSCADA实时数据
  • 软件测试—学习Day11