VS2019+DCMTK3.6.6环境配置_boss-dog的博客-程序员ITS304_vs支持库

技术标签: 环境配置  vs2019  DCMTK  医学图像处理  

DCMTK是一个比较优秀的支持DICOM文件读写的C++版本第三方库。

1.下载DCMTK的源文件包和支持库

下载链接:https://dicom.offis.de/dcmtk.php.en
   源文件:
在这里插入图片描述
   支持库:
在这里插入图片描述
   下载后进行解压
在这里插入图片描述

DCMTK支持库的参数说明:
选择MD的表示构建动态库,MT表示构建静态库,代码会很大。
选择iconv的,icu的库会很大。

2.使用Cmake构建DCMTK工程

2.1 CMake下载

网上说CMake版本一定一定要小于3.19.0,建议选择3.14.3。

CMake官网:https://cmake.org/download/
CMake3.14.3下载:https://github.com/Kitware/CMake/releases?
page=9

在这里插入图片描述
在这里插入图片描述
确定CMake是否安装成功:打开cmd,输入

cmake --version

在这里插入图片描述

2.2 使用CMake构建工程

  • 关闭所有和VS有关的程序,然后打开CMake-gui
    在这里插入图片描述

  • 设置soure code路径,就是DCMTK包解压后的路径
    在这里插入图片描述

  • 设置build the binaries路径,就是构建出来的DCMTK工程的存放路径(这里自己新建一个文件夹DCMTK_Solution)
    在这里插入图片描述

  • 勾选GroupedAdvanced
    在这里插入图片描述

  • 点击Conifigue,在打开的窗口里选择相应的VS版本(这里为Visual Studio 16 2019 Win64),点击Finish
    在这里插入图片描述

  • 等待设置完成后,界面出现设置选项,进行设置

  • BUILD组设置如图
    将BUILD_SHARED_LIBS打勾,因为下载的是MD的工程(动态链接库),程序运行的过程中是需要dll文件的。
    在这里插入图片描述

  • CMAKE组:可以选择保持默认。但如果C盘只有管理员权限,则可以将CMAKE_INSTALL_PREFIX设置为其他路径(后续修改工程的CMake文件也可以,这里我选择新建一个文件夹DCMTK_LIB用于存放),这个设置就是下一步DCMTK工程编译出来的一系列文件的存放路径。
    我建议这里新建一个文件夹DCMTK_LIB,后续新建VS工程配置环境的时候需要用到这个文件夹里面的配置文件
    在这里插入图片描述
    在这里插入图片描述

  • DCMTK组
    取消勾选DCMTK_ENABLE_EXTERNAL_DICTIONARY
    取消勾选DCMTK_OVERWRITE_WIN32_COMPILER_FLAGS
    勾选如下这些:
    在这里插入图片描述

  • DOXYGEN组和ICU组按默认设置不需要修改

  • WITH组
    将DCMTK支持库dcmtk-3.6.6-win64-support-MD-iconv-msvc-15.8中的几个模块按照名字一一对应填入WITH组中,
    其中WITH组中有一个WITH_SNDFILEINC模块在DCMTK源码中没有这个模块,那就不填。在这里插入图片描述
    填完后如下所示:
    在这里插入图片描述

  • 再次点击Configure,等待进一步设置完成
    在这里插入图片描述

  • 再点击Generate,生成工程后,可以在DCMTK_Solution文件夹里面看到生成的配置文件
    在这里插入图片描述

  • 点击Open Project打开工程
    在这里插入图片描述

2.3 检查工程属性

  • 打开VS2019的工程文件,查看任一工程的属性,查看以下工程选项(如果都满足,表示DCMTK工程构建成功)
  • 字符集是否设置为多字节字符集
  • 运行库是否为MDd和MD(Debug和Release环境下都看看)
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

3.编译DCMTK库

  • 打开VS2019菜单栏中的生成->批生成对话框,在ALL_BUILD里勾选Debug和Release,点击生成,编译完成后会在工程bin目录下生成exe和dll,lib目录下生成lib。
    (注意把文件选项改成ALL_BUILD)
    在这里插入图片描述

在这里插入图片描述
生成过程需要等待一段时间。。。
在这里插入图片描述
编译成功后:
在这里插入图片描述
在这里插入图片描述

  • 在VS2019中打开批生成对话框,在INSTALL里勾选你想配置的install版本(Debug或Release),这步的作用是将DCMTK所需要的库文件和头文件拷贝到刚才CMake中设置的路径(这里我放到了DCMTK_LIB文件夹中,只选择了Debug)
    在这里插入图片描述
  • 点击Build,会将相应的文件拷贝到最初在CMake里设置的CMAKE_INSTALL_PREFIX的路径下
    在这里插入图片描述
  • bin目录里为exe和dll
  • include目录为头文件
  • lib目录下生成lib
    在这里插入图片描述
  • PS:将支持库包里的zlib_d.lib拷贝到生成的lib目录下(这里因为我生成的是Debug库,所以拷贝的是zlib_d.lib库)
    在这里插入图片描述
    在这里插入图片描述

4.编写测试用例验证DCMTK库

4.1 VS环境配置

  • 新建一个控制台程序
  • 配置该工程项目的中VC++目录——包含目录库目录
    (注意保持环境一致)
    在这里插入图片描述
  • 配置相关的依赖库
    在这里插入图片描述
iphlpapi.lib
ws2_32.lib
wsock32.lib
netapi32.lib
ofstd.lib
oflog.lib
dcmdata.lib
zlib_d.lib

(前四个为系统库、随后三个为DCMTK库、最后一个是支持包里的库)

  • 将DCMTK的bin目录下的ofstd.dlloflog.dlldcmdata.dll拷贝到该工程的exe程序同目录下
    在这里插入图片描述
    在这里插入图片描述

4.2 编写测试代码

  • 先下载所需要的Dicom文件,并把文件路径修改在代码中
    网址:https://www.dicomlibrary.com/
    进去之后左下角DICOM Samlples随便点一个图片进去——点击上面的Export——Download
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    解压后如下:
    在这里插入图片描述
    在这里插入图片描述
  • 编写测试代码
    本程序的功能:
    读DICOM文件中的病人名(函数ReadPatientName());
    保存DICOM文件中的病人名(SavePatientName())。
// C++_Dicom_Sample.cpp : Defines the entry point for the console application.
//

#include <dcmtk/config/osconfig.h>
#include <dcmtk/dcmdata/dctk.h>
#include <iostream>

bool ReadPatientName(DcmFileFormat& fileformat, std::string& filePath)
{
    
    OFCondition status = fileformat.loadFile(filePath.c_str());
    if (!status.good())
    {
    
        std::cout << "Load Dimcom File Error: " << status.text() << std::endl;
        return false;
    }
    OFString PatientName;
    status = fileformat.getDataset()->findAndGetOFString(DCM_PatientName, PatientName);
    if (status.good())
    {
    
        std::cout << "Get PatientName:" << PatientName << std::endl;
    }
    else
    {
    
        std::cout << "Get PatientName Error:" << status.text() << std::endl;
        return false;
    }
    return true;
}

bool SavePatientName(DcmFileFormat& fileformat, std::string& filePath, const std::string& info)
{
    
    OFCondition status = fileformat.getDataset()->putAndInsertString(DCM_PatientName, info.c_str());
    if (status.good())
    {
    
        std::cout << "Save PatientName:" << info.c_str() << std::endl;
    }
    else
    {
    
        std::cout << "Save PatientName Error: " << status.text() << std::endl;
        return false;
    }

    status = fileformat.saveFile(filePath.c_str());
    if (!status.good())
    {
    
        std::cout << "Save Dimcom File Error: " << status.text() << std::endl;
        return false;
    }
    return true;
}

int main()
{
    
    DcmFileFormat dicomFileformat; //定义DICOM格式的变量
    std::string dicomFile = "E:\\C++_work\\DCMTK_Sample\\Anonymized_20211126\\series-00000\\image-00001.dcm";

    ReadPatientName(dicomFileformat, dicomFile); //读写病人的名称
    SavePatientName(dicomFileformat, dicomFile, "John Snow"); //改写病人的名称为John Snow
    ReadPatientName(dicomFileformat, dicomFile); 

    system("pause");
    return 0;
}
  • 运行并查看输出
    在这里插入图片描述
    正确输出病人姓名,至此已成功编译DCMTK库

感谢以下大佬,避免自己走了很多坑
https://blog.csdn.net/weixin_42089190/article/details/117440207
https://www.jianshu.com/p/b06349d609ba
https://www.bilibili.com/video/BV1m4411T728?from=search&seid=5091255401670271543&spm_id_from=333.337.0.0
DCMTK 3.6.2(MD支持库)与Microsoft Visual Studio 2017开发环境的搭建
https://blog.csdn.net/chaoenhu/article/details/78200274

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_45445740/article/details/121538759

智能推荐

android openfire 和 xmpp_weixin_30876945的博客-程序员ITS304

关于xmpp协议可以参考:http://www.jabbercn.org什么是OpenFireOpenfire 采用Java开发,开源的实时协作(RTC)服务器基于XMPP(Jabber)协议。  您可以使用它轻易的构建高效率的即时通信服务器。Openfire安装和使用都非常简单,并利用Web进行管理。单台服务器可支持上万并发用户。由于是采用开放的XMPP协议,您可以使用各种支...

mysql的rowscn_Oracle ORA_ROWSCN_weixin_39559804的博客-程序员ITS304

今天看到一篇关于ORA_ROWSCN的文章,虽然简短,没有什么实例,但是已经把ORA_ROWSCN大概是怎么回事介绍清楚了。记录一下。=================================================================================默认的情况下,每个块中所有的记录的ORA_ROWSCN都是相同的,当块中任意一条记录发生改变的情况下,块...

Jenkins漏洞 && MySQL漏洞 && PHPadmin漏洞_CN_SHzhaoyujie的博客-程序员ITS304

文章目录Jenkins漏洞防护MySQL漏洞搭建CVE-2012-2122漏洞环境复现漏洞MySQL的弱密码破解NmapHydraMySQL注入利用sqlmap防护phpmyadmin漏洞通过general log获取webshell防护Jenkins漏洞Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作.JenkinsMiner加密货币挖矿软件攻...

使用nexus搭建一个docker私服_huan_1993的博客-程序员ITS304

使用nexus搭建docker私服一、需求:二、实现步骤1、编写`docker-compose`文件,实现`nexus`的部署2、修改/usr/lib/systemd/system/docker.service 配置文件3、访问 `nexus`创建一个 `docker`仓库&gt; docker仓库类型1、此处我们简单演示一个 `hosted` 类型的仓库a)、创建一个 Blob Stores,用...

vant-ui框架的一个bug(切换后onload不触发)_赋予不予的博客-程序员ITS304

前几天做的项目里有用到下拉刷新。使用了vant-ui里的List 列表瀑布流滚动加载,用于控制长列表的展示先说使用 1.用npm下载该模块包npm i vant -S2.引入组件官方提供了三种方法。(我使用了第三种,全局引入方法)方式一. 使用 babel-plugin-import (推荐)babel-plugin-import 是一款 babel 插件,它会...

hadoop 命令执行报错解决_雪水的博客-程序员ITS304

ls: Failed on local exception: java.io.IOException: javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Failed to find any

随便推点

在IDEA中对vue项目第一次导入需要的操作_程序媛小白白的博客-程序员ITS304_idea导入vue项目

在IDEA中对vue项目第一次导入需要的操作在IDEA中对vue项目第一次导入需要的操作刚开始接触Vue的小白,在第一次用IDEA导入Vue项目时遇到了一些问题,成功导入后整理了一下我个人成功操作的步骤,小白的文章仅供参考第一步:open项目,不要用import第二步:点击file,settings(我这里用的是中文版的,就点击文件,设置就行第三步:进入settings(设置)之后选择plugins(插件),搜索Vue,点击install或者安装第四步:搭建node.js环境.node.j

Cesium (四) 3D模型_GISEarth的博客-程序员ITS304_cesium 支持哪些格式

3D模型我们可以转换、加载并且在Cesium中使用3D模型。Cesium支持glTF(一个新兴的Web 3D模型工业标准)格式的3D模型,并且提供在线的 COLLADA - glTF转换工具。Cesium针对3D模型支持关键帧动画、皮肤、单独节点选取等特性。Cesium自带了三个模型:飞机、车辆、人。下面的例子载入一个车辆模型:var scene = viewer.scen

访问控制权限详解_suwu150的博客-程序员ITS304

访问控制权限面向对象的基本思想之一是封装 实现细节 并且公开方法。Java语言采用访问控制修饰符来控制类及类的方法和变量的访问权限,从而只向使用者暴露方法,但隐藏实现细节。访问控制分4种级别。访问级别 访问控制修饰符同类同包子类 不同的包公开级别public 受保护 protected 默认 没有访问控制 私有 private成员变量、成员方法和构造方法(构造器)可以处于4个访问级别中的一个 顶层类只可以处于公开或默认访问级别;注意:p

ORM 框架简介_weixin_30258901的博客-程序员ITS304

对象-关系映射(Object/Relation Mapping,简称ORM),是随着面向对象的软件开发方法发展而产生的。面向对象的开发方法是当今企业级应用开发环境中的主流开发方法,关系数据库是企业级应用环境中永久存放数据的主流数据存储系统。对象和关系数据是业务实体的两种表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据。内存中的对象之间存在关联和继承关系,而在数据库中,关系数据无...

【JVM】JVM加载class文件的原理机制_FAIRY哦的博客-程序员ITS304_jvm加载类文件原理机制

一、JVM简介JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java语言的一个非常重要的特点就是与平台的 无关性。而使用Java虚拟机是实现这一特点的关键。一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码。而引入Java语言虚拟机后,J...

推荐文章

热门文章

相关标签