背景
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