技术标签: 环境配置 vs2019 DCMTK 医学图像处理
DCMTK是一个比较优秀的支持DICOM文件读写的C++版本第三方库。
下载链接:https://dicom.offis.de/dcmtk.php.en
源文件:
支持库:
下载后进行解压
DCMTK支持库的参数说明:
选择MD的表示构建动态库,MT表示构建静态库,代码会很大。
选择iconv的,icu的库会很大。
网上说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
关闭所有和VS有关的程序,然后打开CMake-gui
设置soure code路径,就是DCMTK包解压后的路径
设置build the binaries路径,就是构建出来的DCMTK工程的存放路径(这里自己新建一个文件夹DCMTK_Solution)
勾选Grouped和Advanced
点击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打开工程
生成过程需要等待一段时间。。。
编译成功后:
iphlpapi.lib
ws2_32.lib
wsock32.lib
netapi32.lib
ofstd.lib
oflog.lib
dcmdata.lib
zlib_d.lib
(前四个为系统库、随后三个为DCMTK库、最后一个是支持包里的库)
// 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;
}
感谢以下大佬,避免自己走了很多坑
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
关于xmpp协议可以参考:http://www.jabbercn.org什么是OpenFireOpenfire 采用Java开发,开源的实时协作(RTC)服务器基于XMPP(Jabber)协议。 您可以使用它轻易的构建高效率的即时通信服务器。Openfire安装和使用都非常简单,并利用Web进行管理。单台服务器可支持上万并发用户。由于是采用开放的XMPP协议,您可以使用各种支...
今天看到一篇关于ORA_ROWSCN的文章,虽然简短,没有什么实例,但是已经把ORA_ROWSCN大概是怎么回事介绍清楚了。记录一下。=================================================================================默认的情况下,每个块中所有的记录的ORA_ROWSCN都是相同的,当块中任意一条记录发生改变的情况下,块...
文章目录Jenkins漏洞防护MySQL漏洞搭建CVE-2012-2122漏洞环境复现漏洞MySQL的弱密码破解NmapHydraMySQL注入利用sqlmap防护phpmyadmin漏洞通过general log获取webshell防护Jenkins漏洞Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作.JenkinsMiner加密货币挖矿软件攻...
使用nexus搭建docker私服一、需求:二、实现步骤1、编写`docker-compose`文件,实现`nexus`的部署2、修改/usr/lib/systemd/system/docker.service 配置文件3、访问 `nexus`创建一个 `docker`仓库> docker仓库类型1、此处我们简单演示一个 `hosted` 类型的仓库a)、创建一个 Blob Stores,用...
前几天做的项目里有用到下拉刷新。使用了vant-ui里的List 列表瀑布流滚动加载,用于控制长列表的展示先说使用 1.用npm下载该模块包npm i vant -S2.引入组件官方提供了三种方法。(我使用了第三种,全局引入方法)方式一. 使用 babel-plugin-import (推荐)babel-plugin-import 是一款 babel 插件,它会...
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项目第一次导入需要的操作在IDEA中对vue项目第一次导入需要的操作刚开始接触Vue的小白,在第一次用IDEA导入Vue项目时遇到了一些问题,成功导入后整理了一下我个人成功操作的步骤,小白的文章仅供参考第一步:open项目,不要用import第二步:点击file,settings(我这里用的是中文版的,就点击文件,设置就行第三步:进入settings(设置)之后选择plugins(插件),搜索Vue,点击install或者安装第四步:搭建node.js环境.node.j
3D模型我们可以转换、加载并且在Cesium中使用3D模型。Cesium支持glTF(一个新兴的Web 3D模型工业标准)格式的3D模型,并且提供在线的 COLLADA - glTF转换工具。Cesium针对3D模型支持关键帧动画、皮肤、单独节点选取等特性。Cesium自带了三个模型:飞机、车辆、人。下面的例子载入一个车辆模型:var scene = viewer.scen
访问控制权限面向对象的基本思想之一是封装 实现细节 并且公开方法。Java语言采用访问控制修饰符来控制类及类的方法和变量的访问权限,从而只向使用者暴露方法,但隐藏实现细节。访问控制分4种级别。访问级别 访问控制修饰符同类同包子类 不同的包公开级别public 受保护 protected 默认 没有访问控制 私有 private成员变量、成员方法和构造方法(构造器)可以处于4个访问级别中的一个 顶层类只可以处于公开或默认访问级别;注意:p
对象-关系映射(Object/Relation Mapping,简称ORM),是随着面向对象的软件开发方法发展而产生的。面向对象的开发方法是当今企业级应用开发环境中的主流开发方法,关系数据库是企业级应用环境中永久存放数据的主流数据存储系统。对象和关系数据是业务实体的两种表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据。内存中的对象之间存在关联和继承关系,而在数据库中,关系数据无...
一、JVM简介JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java语言的一个非常重要的特点就是与平台的 无关性。而使用Java虚拟机是实现这一特点的关键。一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码。而引入Java语言虚拟机后,J...