dicom协议开源库DCMTK安装和使用

背景

        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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章