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


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