背景
DCMTK是由德国offis公司提供的开源项目,几乎实现了完整的DICOM协议,是3大dicom开源库之一。DCMTK采用C++语言开发。
准备工作
1. 安装CMake https://cmake.org/download/,我电脑里安装的3.8.2版本。
2. 下载dcmtk3.6.0 源码,解压。
CMAKE编译
1.修改CMakeList.txt配置文件。打开CMakeLists.txt,使用文本编辑器的替换功能,把/MTd 替换成/MDd 、/MD 替换成 /MT,这样做是指定我们编译动态库版本而非静态库版本;修改DCMTK支持库,搜索DCMTK build options ,可以将前面的5个支持项(DCMTK_WITH_TIFF,DCMTK_WITH_PNG,DCMTK_WITH_XML,DCMTK_WITH_ZLIB,DCMTK_WITH_OPENSSL)都设置成ON,需要相关的库支持,不过测试过不下载相应的库,后面的编译也不会出问题,所以这里根据需要设置。
2. a) 关闭VS2012,打开CMake-gui,选择dcmtk3.6.0源码位置,选择生成路径;
b) 点击Configure,选择Visual Studio 11 2012 Win64(我的系统是64位的,这里还可以选择VisualStudio 11 2012, 这样会生成X86库),点击finish。
c) 根据需要设置下CMAKE_INSTALL_PREFIX,64位程序默认是”C:/ProgramFiles/DTMCK”,因为我计算机上的权限问题,我的安装路径改到“D:/Program Files/DTMCK”,设置好之后点击Generate,等待生成VS工程,生成完成之后,点击OpenProject打开VS工程。
VS2012编译dcmtk库
经过上面的步骤,我们已经得到了用于编译dcmtk库的vs2012工程,点击vs2012菜单:生成-批生成(英文版是Build->BatchBuild),选择ALL_BUILD Debug版和Release版,点击生成,漫长的等待之后,会出现下面的画面,代表dcmtk库已经生成好了。安装库,点击vs2012菜单:生成-批生成,选择INSTALL Debug版本,点击生成,库安装到前面指定的目录。
VS项目属性配置(这里使用的都是64位库)
1. 新建一个VS工程,添加DTMCK头文件包含:
2. 添加DTMCK库路径和需要的库包含:
3. 测试源码,(这里借用了Opencv做图像显示)
//dcmtk.cpp : 定义控制台应用程序的入口点。
#include"stdafx.h"
#include"dcmtk\config\osconfig.h"
#include"dcmtk\dcmdata\dctk.h"
#include"opencv2\opencv.hpp"
#include"dcmtk\dcmimage\diargimg.h"
usingnamespacecv;
usingstd::cout;
int_tmain(intargc,_TCHAR*argv[])
{
DcmFileFormatdfile;
dfile.loadFile("image-000001.dcm");
DcmMetaInfo*Metalnfo=dfile.getMetaInfo();
DcmTagTag;
Tag=Metalnfo->getTag();
Uint16G_tag=Tag.getGTag();
cout<<"G_tag: "<<G_tag<<std::endl;
DcmDataset*data=dfile.getDataset();
DcmElement*element=NULL;
data->findAndGetElement(DCM_PixelData,element);
doubledata_len=data->getLength();
doubleelement_len=element->getLength();
cout<<"data_len "<<data_len<<std::endl;;
cout<<"elemetn_len "<<element_len<<std::endl;;
OFStringpatientName;
data->findAndGetOFString(DCM_PatientName,patientName);
cout<<"patientName: "<<patientName.data()<<std::endl;;
OFStringpatientId;
data->findAndGetOFString(DCM_PatientID,patientId);
cout<<"patientId: "<<patientId<<std::endl;;
OFStringpatientAge;
data->findAndGetOFString(DCM_PatientAge,patientAge);
cout<<"patientAge: "<<patientAge.data()<<std::endl;;
OFStringPatientPosition;
data->findAndGetOFString(DCM_PatientPosition,PatientPosition);
cout<<"PatientPosition: "<<PatientPosition.data()<<std::endl;;
OFStringImagePositionPatient;
data->findAndGetOFString(DCM_ImagePositionPatient,ImagePositionPatient);
cout<<"ImagePositionPatient: "<<ImagePositionPatient<<std::endl;;
OFStringPixelSpacing;
data->findAndGetOFString(DCM_PixelSpacing,PixelSpacing);
cout<<"PixelSpacing: "<<PixelSpacing.data()<<std::endl;;
Uint16*pixData16;
element->getUint16Array(pixData16);
cout<<element->getLength()<<std::endl;
cv::Matimag=cv::Mat(512,512,CV_8U,pixData16);// , element);
for(inti=0;i<100;i++)
{
cout<<*(pixData16+i)<<" ";
}
cv::imshow("image",imag);
cv::waitKey(0);
return0;
}
结果
上面编译使用的是64位库,32位库编译使用过程和64库一样。
百度网盘连接有VS2012 VS2013 32位 64位 Debug Release 库和测试用数据:
http://pan.baidu.com/s/1bpzZB4r r678
opencv库的安装使用请参见我的上一篇博文:http://blog.csdn.net/wanhongluli/article/details/77573854