医学图像处理入门:VS2019+DCMTK3.6.8编译及环境配置
1. 下载DCMTK的源文件包和支持库
首先下载dcmtk软件包,此处我们下载源码和支持库来进行自己编译。下载网址:
https://dicom.offis.de/en/dcmtk/dcmtk-software-development/
如图所示,选择合适的版本进行下载,此处采用VS2019进行编译。
2. 解压文件包和支持库
对下载的dcmtk软件包和支持库进行解压。
在dcmtk软件包中新建build和sdk文件夹,以便后续进行cmake编译。
3. cmake配置
下面对cmake进行配置,选择合适的路径文件夹以后,参照图中选项进行配置设置。
取消勾选DCMTK_OVERWRITE_WIN32_COMPILER_FLAGS
此处用到了下载的二进制支持包文件。
点击config按钮,等待完成后,再点击Generate按钮生成VS工程项目。
4.编译DCMTK库
点击Open project 按钮打开VS项目工程,然后先选择 ALL_BUILD进行生成,随后选择INSTALL进行sdk整理。
如果遇到“文件中有常量”的错误提醒,可以用记事本打开对应的.cc文件,另存为“utf8-BOM”格式即可,毕竟这是VS支持的文件格式。
编译完成后,生成下面的SDK包。
5.示例项目
下面我们验证一下编译的SDK包是否可用。
5.1 下载Dicom示例文件
先下载所需要的Dicom文件,下载网址:https://www.dicomlibrary.com/,
在左侧DICOM Samlples任意选择一个图片进去,然后点击上面的Export——Download按钮。
对下载的文件进行解压后,如下所示:
5.2 创建vs项目并进行属性设置
新建一个VS控制台程序,然后进行sdk设置:
依赖项:
iphlpapi.lib
ws2_32.lib
wsock32.lib
netapi32.lib
ofstd.lib
oflog.lib
dcmdata.lib
zlib_d.lib
5.3 运行效果
编译生成后如下,把需要的几个dll拷贝过来。
5.4 源码
// DCMTKTest.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//#include <iostream>#include <dcmtk/config/osconfig.h>
#include <dcmtk/dcmdata/dctk.h>//读DICOM文件中的病人名
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 << "Read PatientName:" << PatientName << std::endl;}else{std::cout << "Read PatientName Error:" << status.text() << std::endl;return false;}return true;
}//修改保存DICOM文件中的病人名
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; std::string dicomFile = "F:\\Qt_vtk_itk\\series-00000\\image-00000.dcm";ReadPatientName(dicomFileformat, dicomFile); //读写病人的名称SavePatientName(dicomFileformat, dicomFile, "Lebron Wade"); //改写病人的名称为John SnowReadPatientName(dicomFileformat, dicomFile);system("pause");return 0;
}