精华内容
参与话题
问答
  • 学习使用DCMTK工具

    千次阅读 2018-03-12 15:05:27
    学习使用DCMTK工具一、了解DICOM1、DICOM语法 DICOM维护一个所有标准属性(超过2000个)的列表,即所谓的DICOM数据字典(DICOM Data Dictionary)。DICOM依靠数据字典来保证属性命名和处理的一致性。 把这些超过...

    学习使用DCMTK工具

    一、了解DICOM

    1、DICOM语法

           DICOM维护一个所有标准属性(超过2000个)的列表,即所谓的DICOM数据字典(DICOM Data Dictionary)。DICOM依靠数据字典来保证属性命名和处理的一致性。

           把这些超过2000个的项目按照一定顺序排列,所有项目首先被分成编号的项目组(group)(如果项目内容的大概相似就分为一组)。项目组是由单独的元素组合在一起的。因此,每个项目都有其自己的编号“(项目组,元素)”,这就是所谓的元素“标签(tag)”。 所有进行标签的元素都称作“属性(attribute)”,或 者DICOM“数据元素(data element)” 或简称为DICOM“元素”。项目组和元素都是用十六进制数字编号的,“(项目组,元素)”标签唯一地对应属性名称。

    摘录

    (Group,Element) tag

    (项目组,元素)标

    Attribute(data element) name

    属性(数据元素)名称

    VR

    VM

    (0008,0001)

    Length to End

    到结尾的长度

     

     

    (0008,0005)

    Specific Character Set特定的字符集

    CS

    1-N

    (0010,0010)

    Patient Name

    病人姓名

    PN

     

    (0010,0020)

    Patient ID

    病人ID

    LO

    1

    (0010,0030)

    Patient’s Birth Date

    病人出生日期

    DA

    1

    (0010,0032)

    Patient’s Birth Time

    病人出生时间

    TM

    1

     

     

     

     

     

    VR:值表现,DICOM标准在PS 3.5中定义了27个基本数据类型,每个VR都有他自己两个字母的缩写;表示内容的定义;数据中允许出现的字母描述;以及规定的数据长度。

    VM:数据元素值多样性。

     

    2、DICOM服务命令

    处理复合(composite)数据的DIMSE服务称作“DIMSE-C”服务;而处理常规数据的DIMSE服务称为“DIMSE-N”服务。“C”和“N”这种标记经常会作为服务名称的前缀,放在服务名称之前。

    例子:

    C-Echo:用来校验一个DICOM AE是否与另一个AE建立了连接。

    C-Store:承载着要存储的数据。

    C-Find:在C-Find服务提供者(如数字归档)那里进行匹配的查询参数。

    C-Move:在服务者那边下载匹配参数的文档。

     

    3、DICOM通信

           连接建立的两端都成为AE,为了区分服务请求者和服务提供者,DICOM称前者为服务类用户(Service Class Users,SCU),称后者为服务类提供者(Service Class Providers,SCP)。

           请求连接(呼叫)的AE建立并发送一个A-Associate-RQ消息,即向接收(被呼叫)的AE发出请求,要求其开启一个连接。这个消息由多个呈现上下文(我们的名片),以及附加的用户信息数据打包而成,其中用户信息数据描述了AE初始化连接的能力(用户所用的请求AE)。接收AE会查看所有建议的通讯参数,如果连接被接受,它会选择最合适的参数,并返回一个A-Assciate-AC消息。

     

    二、了解DCMTK

    1、DCMTK编译

    http://blog.csdn.net/YiLooks/article/details/7867855

    http://blog.csdn.net/ancewer/article/details/74408441

    2、DCMTK工具介绍

    scu -->  scp  发送dcm文件

    scp: storescp.exe  104  –aet myaet

    scu: storescu.exe 127.0.0.1 104 C:/DICOM/Source/CT1/CT.dcm

     

    storescp.exe是Dcmtk工具包中用于接收DICOM影像并进行保存的服务端程序

    -aet myaet中的aet为Application Entity Title

     

    scu -->  scp  查询内容

    scp: wlmscpfs.exe-dfr -dfp wlistdb 104

    scu: findscu 127.0.0.1 104 wlistqry/wlistqry.wl -aec OFFIS

         findscu 192.168.1.7 4007 -aec "myonly" -v -k0008,0052="STUDY" query.dcm -S

             findscu.exe -v -W -k 0008,0060=DR -aecDicomworklist -X 127.0.0.1 3000 worklist.dcm

     

    如果需要查多个值,只需要重复写-k 0008,0060=DR 这个参数,当然你需要查出来你所需要的属性所对应的两个4位码。

     

             -k 0010,0020="123456"   PatientID字段为123456的患者数据

            

           -dfr表接受字段不完整的DICOM文件作为查询内容;

     

          -dfpwlistdb 表wlmscpfs.exe搜索的文件夹的路径,可以为绝对路径;

     

          104  为工作列表程序的端口号;

     

    scu -->  scp  下载内容

           movescu192.168.1.7 4008 -aec "myonly" -v -k0020,000d="1.2.840.113619.2.67.2158294438.15745010109084247.20000"move.dcm -S

     

     

    3、模拟pacs实现上传下载

    scp接受多项服务

    D:\DCMTK\bin\dcmqrscp.exe -d --configdcmqrscp.cfg   

     

    scu:测试是否能连接

    D:\DCMTK\bin\echoscu.exe -d localhost 11110-aec ACME_STORE -aet ACME1

    D:\DCMTK\bin\echoscu.exe -d 192.168.1.65104 -aec ACME_STORE

     

    scu:传输dcm文件

    D:\DCMTK\bin\storescu.exe -d localhost11110 D:\CT.dcm -aec ACME_STORE

    scu:查询dcm文件

    D:\DCMTK\bin\findscu.exe -d 127.0.0.1 11110-k QueryRetrieveLevel=STUDY -k 0010,0010 -k 0010,0020 -k 0020,0010 -aecACME_STORE -v -S

    scu:下载

    D:\DCMTK\bin\movescu.exe -d 192.168.1.65104 +P 5003 -aec ACME_STORE -k QueryRetrieveLevel=STUDY -k 0010,0020=7637 -odD:\DICOM\Worklist\

     

    dcm -->  bmp  转换文件

    dcm2pnm.exe +obCT.1.2.840.113704.9.4021.3.1.1.200927949440CT.1.2.840.113704.9.4021.3.1.1.200927949440.bmp

    解析数据

    dcmdump.exe D:\CT.dcm

     

    dcmqrscp.cfg:

    NetworkTCPPort  = 104

    MaxPDUSize      = 16384

    MaxAssociations =16

     

    HostTable BEGIN

     

    echoscu            = (ECHOSCU, ywu-PC, 5000)

    findscu            = (FINDSCU, ywu-PC, 5001)

    storescu           = (STORESCU, ywu-PC, 5002)

    movescu             = (MOVESCU, ywu-PC, 5003)

    acmeCTcompany   = echoscu, findscu, storescu, movescu

    HostTable END

     

    VendorTable BEGIN

    "Acme CTCompany"   = acmeCTcompany

    VendorTable END

     

    AETable BEGIN

    ACME_STORE    D:\DICOM\DcmScuScp   RW (9, 1024mb)   acmeCTcompany

    AETable END

    展开全文
  • 利用dcmtk显示DICOM图像以及对图像调窗
  • 背景: DICOM3.0协议中有介绍关于worklist的部分。简而言之,worklist可以看做是放射科设备从医院RIS系统中自动读取患者信息的一种“通信协议”,可以指存储在RIS系统中的患者数据库,主要包括患者的基本信息(如...

    背景:

            DICOM3.0协议中有介绍关于worklist的部分。简而言之,worklist可以看做是放射科设备从医院RIS系统中自动读取患者信息的一种“通信协议”,可以指存储在RIS系统中的患者数据库,主要包括患者的基本信息(如年龄、性别、身高、体重、出生年月等),这与DCM文件信息头MetaInfo中的多数字段重合。因此从RIS系统中自动获取worklist是医院信息化的必要组成部分。下面简单的给出几个图像,形象的描述一下worklist的作用。

    clip_image001clip_image002

    worklist的实例学习:

            在简单的了解了worklist的作用后,下面我们利用DCMTK提供的工具包(wlmscpfs.exe和findscu.exe)来真实模拟一下该场景,从而更深刻的学习worklist的功能。

    worklist简单的看做一种“通讯”,那么自然就存在着通讯的两端,暂且称作“服务端”和“客户端”。这里我们用wlmscpfs.exe来作为worklist通讯的服务端,即等待外部访问的终端;用findscu.exe来作为服务端,用来发起worklist访问。

    首先简单的介绍一下工具包的指令及使用方式。wlmscpfs.exe是类似于DOS时代的命令,通过设定参数可以实现不同的目的。利用Win+R键开启操作系统的运行窗口,输入cmd后进入到命令提示行窗口。然后进入到DCMTK编译后的bin文件夹(我本机地址是C:\Program Files (x86)\DCMTK\bin)目录,此时直接输入wlmscpfs.exe就可以看到关于该命令工具的各种说明。

    >cd C:\Program Files (x86)\DCMTK\bin

    >wlmscpfs.exe

    image

    (注,此处如果为了省事,可以将bin文件夹路径添加到windows的环境变量中,如是就可以在任何目录下使用bin下的各种工具了)

            由上图看到,wlmscpfs.exe工具至少需要给出port一个参数,即开启worklist服务的本机端口号。另外还需要输入worklist数据库文件的地址,用来供客户端查询、访问使用。下面我们正式开启worklist的服务端程序,至于开启全过程,可以跟大家推荐CSDN一位博主的精品文章(http://blog.csdn.net/pachleng/article/details/5800513),博文中给出了具体的操作步骤,这个实例是对DCMTK论坛中的补充和更新。大家可以动手试一下。

    第一步:建立各级目录

            以我的电脑为例,我在D盘创建了DCMWorklist文件夹,然后建立了两个子文件夹wlistdb和wlistqry。

    image

    第二步:准备worklist数据库文件,开启worklist服务端服务。

            然后将worklist的数据库文件拷贝到wlistdb目录下,此处参见冷哥博文,记得建立OFFIS子目录。至于worklist数据库文件通常在dcmtk库的源码中已经给出了,默认目录是dcmtk-3.6.0\dcmtk-3.6.0\dcmwlm\datawlistdb(我用的是3.6.0版本)。但是源码中的文件通常是.dump扩展名的文件,也就是我们常见的文本文件(用记事本或者Notepad++等工具双击即可打开)。通过利用dcmtk工具包中的dump2dcm.exe可以将.dump文件转换成.wl文件,转换后的.wl文件就是worklist数据库文件。

    >dcmp2dcm.exe .\dcmtk-3.6.0\dcmtk-3.6.0\dcmwlm\data\wklistdb\wlist1.dump d:\DCMWorklist\wlistdb\OFFIS\wlist.wl

    >……

            有了worklist数据库文件后,我们就可以开启worklist服务了,利用的工具就是前文提到的wlmscpfs.exe(从工具名称中的SCP就可以看出这应该是服务端开启服务的)。

    >wlmscpfs.exe –d –dfr –dfp d:\DCMWorklist\wlistdb 104     (注:其中的-d是为了方便我们观察工具运行过程而开启的调试开关)

    >……

    第三步,准备查询文件,开启worklist查询。

            服务端已经准备就绪,下面就是该发起worklist查询服务啦。利用的工具是findscu.exe(从工具名称中的SCU同样可以猜测出这是客户端)。dcmtk源码包中同样给我们提供了查询worklist的查询文件,默认目录是dcmtk-3.6.0\dcmtk-3.6.0\dcmwlm\data\wlistqry,打开后可以看到里面以.dump格式存在的文件,再次利用dump2dcm.exe将.dump转换为.wl文件。

    >dcmp2dcm.exe .\dcmtk-3.6.0\dcmtk-3.6.0\dcmwlm\data\wklistqrt\wlistqry1.dump d:\DCMWorklist\wlistqry\wlistqry.wl

            然后我们利用findscu发起查询请求,

    >findscu.exe –d 127.0.0.1 104 d:\DCMWorklist\wlistqry\wlistqry.wl –aec OFFIS

            其中aec代表的是被请求或者说被呼叫的应用端的名称,即我们wlistdb文件夹内的OFFIS子文件夹。

    通过以上三步,我们就简单的利用dcmtk提供的wlmscpf.exe和findscu.exe工具包以及相应的wklistdb数据库文件和wklistqry数据库查询文件模拟了worklist服务开启及查询的整个流程。是不是很简单,很容易上手。

    实际结果分析:

            上一部分中提到了在使用wlmscpfs.exe和findscu.exe工具包的时候开启了-d调试模式,目的就是为了方便我们跟踪整个通讯的流程。另外为了方便查看,我们利用重定向技术,将wlmscpfs.exe和findscu.exe工具包的调试信息输出到txt文件,方便我们事后进行再次对比查看。下面将两个工具包的调试信息用Notopad++打开,对比分析一下,见下图:

    image

            从调试信息可以清晰的看到wlmscpfs.exe与findscu.exe之间的通信流程,该流程在DICOM3.0标准的第四部分(Service Class Specifications )和第八部分(Network Communication Support for Message Exchange)都有详细的介绍,上述的重定向生成的文本文档就是学习DICOM3.0第四、八部分最好的实例。因为dcmtk是开源的,所以这方便我们分析wlmscpfs.exe和findscu.exe两个工具包的源码。具体分析见下一节。

    wlmscpfs.exe和findscu.exe工具包源码分析:

      wlmscpfs.exe findscu.exe
    C/S worklist服务端 worklist客户端
    源码文件 wlmscpfs.cc
    wlcefs.cc
    wlmactmg.cc
    findscu.cc
    内部函数 1)ConnectToDataSource();//开启连接
    2)WlmActivityManager();
    //函数内部利用WSAStartup()启动了Windows套接字服务
    3)StartProvidingService();
    //启动worklist管理服务,位于wlmactmg.cc文件。函数内部调用(a)(b)两个函数。
    (a)ASC_initializeNetwork()函数
    ASC_initializeNetwork函数调用了DICOM协议封装的TCP协议函数DUL_InitializeNetwork(该函数内部就会出现我们在套接字编程中常见的socket、setsockopt、bind和listen函数)
    (b)WaitForAssociation();函数
    WaitForAssociation函数调用了DICOM协议封装的TCP/IP协议函数receiveTransportConnectionTCP(该函数内部利用的是select端口模式,会出现套接字编程中常见的select、accept函数)
    4)disconnectfromDataSource();
    //断开连接的函数。
    1)WSAStartup();//初始化套接字服务
    2)DcmFindSCU::initializeNetWork();
    //函数内部调用的也是ASC_initializeNetwork函数。
    3)DcmFindSCU::performQuery();
    //同样该函数内部封装了很多以DUL开头的协议操作函数。DUL是DICOM  Upper Layer 的缩写。
    4)WSACleanup();

            从上述分析中我们基本可以看出,worklist的通讯是建立在TCP/IP这一现有协议之上的,可以说是对协议的二次封装。与我们平时进行套接字编程的基本流程相似,搞清楚了这一点,对于分析工具包、学习工具包的使用都会有很大的帮助。

    worklist数据库文件或查询文件(*.wl)的生成:

    1)问题提出:

            参照冷哥博文(http://blog.csdn.net/pachleng/article/details/5800513http://blog.csdn.net/pachleng/article/details/5827232)中的说明,我们可以很容易的利用DCMTK的工具包学习worklist操作。但是在实际应用模仿过程中,有的人可能会好奇为什么要把wklist.wl和wklistqry.wl文件分别放在不同目录?为什么同为以.wl为扩展名的文件,一个就可以作为worklist的数据库文件放在服务端,而另一个就是客户单的查询文件?如果想发起自己的查询,即C-FIND请求,我们怎么手动生成wklistqry.wl文件?

            针对上述问题,在dcmtk的论坛中也曾经有人提到过,参见(http://forum.dcmtk.org/viewtopic.php?f=1&t=1475&hilit=wlmscpfs.exe%23p5016)。利用UltraEdit工具将wklist.wl和wklistqry.wl文件同时打开,对比如下:

    image

            从上图中可以看出,作为worklist客户端数据库文件的wklist.wl中是将患者真实信息以符合DICOM3.0标准字段的形式存储,而客户端发起查询请求的wklistqry.wl文件内部只是简单的需要查询的空字段,即各个字段的值域都为空。参考博文中给出了利用dump2dcm.exe工具包将.dump文件转换成wklistqry.wl文件(dump可以认为是普通的文本文件,可以利用记事本等工具进行直接编辑)。如下图所示:

    clip_image002[1]

             例如作为测试用的wlist-2.dump文件中的患者ID为123456,生成后的wlist-2.wl文件中的(0010,0020)字段也是123456。

    2)实际测试:

            从dump2dcm.exe工具包的说明我们就可以知道,.wl文件其实就是dcm文件,只是该类文件中并不存在真实的像素信息。通常只包含信息头部分,主要指的是患者的各项信息。因此想利用dcmtk的库函数直接获取.wl文件,其实就是手动构造dcm文件的过程。参见http://support.dcmtk.org/docs/mod_dcmdata.html#Examples中的第二个例子,我们可以手动生成以“.wl”为后缀的dcm文件。具体的代码如下:

     

    #include <stdio.h>
    #include <tchar.h>
    #include "dcmtk/config/osconfig.h"
    #include "dcmtk/dcmdata/dctk.h"
    #include "dcmtk/dcmdata/dcpxitem.h"
    #include "dcmtk/dcmjpeg/djdecode.h"
    #include "dcmtk/dcmjpeg/djencode.h"
    #include "dcmtk/dcmjpeg/djcodece.h"
    #include "dcmtk/dcmjpeg/djrplol.h"
    using namespace std;
    
    int main()
    {
    	char uid[100];
    	DcmFileFormat fileformat;
    	DcmDataset *dataset = fileformat.getDataset();
    	/**********************************************
    	*
    	*利用下列语句可以生成worklist的数据库文件,即
    	*不含有影像信息的dcm文件
    	*
    	************************************************/
    	dataset->putAndInsertString(DCM_SOPClassUID, UID_SecondaryCaptureImageStorage);
    	dataset->putAndInsertString(DCM_SOPInstanceUID, dcmGenerateUniqueIdentifier(uid, SITE_INSTANCE_UID_ROOT));
    	dataset->putAndInsertString(DCM_PatientName, "Doe^John");
    	OFCondition status = fileformat.saveFile("D:\\DcmWorklist\\worklist\\test.wl", EXS_LittleEndianExplicit);
    	if (status.bad())
    		cerr << "Error: cannot write DICOM file (" << status.text() << ")" << endl;
    
    	return 0;
    }

            既然服务端需要的worklist数据库文件和客户端需要的查询文件都是.wl文件,唯一的区别就是一个有值域,一个没有。因此利用上述代码我们既可以生成worklist数据库文件,也可以生成worklist查询文件。

    3)测试结果:

            查看findscu.exe工具包,我们可以找到-k选项,也就是在提供了查询文件wklistqry.wl的同时也可以指定限定的查询字段,例如

    >findscu 127.0.0.1 104 -v -k 0010,0020="123456" -aec OFFIS wlistqry.wl

            如果不添加-k 0010,0020=“123456”限定选项,查询结果如前文中重定向的结果相同,而添加了限定字段后,我们能够查询到的就只有数据库端中满足PatientID字段为123456的患者数据。具体结果如下:

    image

            从中我们可以看到服务端给我们的反馈是PatientID为123456的患者信息,所返回的信息都是wlistqry.wl文件中要求的字段,其中通过-k 0010,0020=“123456”限定项来限定了查询的结果,在服务端的反馈是两个患者中表明有一个匹配的worklist数据库文件,如上图中黄色区域所示。

         猜想:既然我们可以利用dcmtk自由生成客户端的.wl查询文件,而-k 0010,0020=”123456”就是对该查询文件的补充,那么是不是如果我们直接把123456写入到wlistqry.wl中的(0010,0020)字段的值域,而直接利用修改后的查询文件也会得到相同的结果呢?此处利用自己的代码将0010,0020字段的值域填充为123456

    #include <stdio.h>
    #include <tchar.h>
    #include "dcmtk/config/osconfig.h"
    #include "dcmtk/dcmdata/dctk.h"
    #include "dcmtk/dcmdata/dcpxitem.h"
    #include "dcmtk/dcmjpeg/djdecode.h"
    #include "dcmtk/dcmjpeg/djencode.h"
    #include "dcmtk/dcmjpeg/djcodece.h"
    #include "dcmtk/dcmjpeg/djrplol.h"
    using namespace std;
    
    int main()
    {
    	char uid[100];
    	DcmFileFormat fileformat;
    	DcmDataset *dataset = fileformat.getDataset();
    
    	/**********************************************
    	*【猜测一】:
    	*利用下列语句可以生成worklist的查询文件
    	*即,
    	*	各个字段数据都为空的dcm文件
    	************************************************/
    	dataset->putAndInsertString(DCM_SOPClassUID, UID_SecondaryCaptureImageStorage);
    	dataset->putAndInsertString(DCM_SOPInstanceUID, dcmGenerateUniqueIdentifier(uid, SITE_INSTANCE_UID_ROOT));
    	dataset->putAndInsertString(DCM_ImplementationVersionName,"OFFIS_DCMTK_361");
    	dataset->putAndInsertString(DCM_SpecificCharacterSet,"");
    	dataset->putAndInsertString(DCM_PatientName, "");
    	dataset->putAndInsertString(DCM_PatientID,"123456");
    	dataset->putAndInsertString(DCM_PatientBirthDate,"");
    	dataset->putAndInsertString(DCM_PatientSex,"");
    	OFCondition status = fileformat.saveFile("D:\\DcmWorklist\\worklist\\testqry.wl", EXS_LittleEndianExplicit);
    	if (status.bad())
    		cerr << "Error: cannot write DICOM file (" << status.text() << ")" << endl;
    	return 0;
    }


            然后利用

    >findscu 127.0.0.1 104 -v -aec OFFIS testqry.wl 指令直接发起查询。

            查询结果反馈如下图所示:

    image

            上图证明了我们的猜想通过写入wlistqry.wl的相关字段的值域,就等同于在findscu.exe指令中添加-k XXXX,XXXX限定选项

            至此我们详细的介绍了如何模拟worklist的双端服务,如何开启服务端服务、发起客户端查询,关键是对如何利用dcmtk的库函数来生成自定义的查询端.wl文件进行了补充设实例测试。

    (完)

     

    作者:zssure@163.com

    时间:2014-08-23

    展开全文
  • DICOM医学图像处理:DCMTK的wiki资料学习之PACS调试

    万次阅读 热门讨论 2014-10-03 21:12:23
    背景:前段时间着重从dcmtk和fo-dicom(mDCM)源码角度进行剖析,期望加深对DICOM协议的理解。知其然,知其所以然。如果“所以然”很不好懂,那我们还是先多多“知其然”吧。搞清楚原理的目的不也是为了更好的运用于...

    背景:

    前段时间着重从dcmtkfo-dicommDCM)源码角度进行剖析,期望加深对DICOM协议的理解。知其然,知其所以然。如果所以然很不好懂,那我们还是先多多知其然吧。搞清楚原理的目的不也是为了更好的运用于实践么?所以理论和实践应该彼此交错进行,理论搞不动了就搞搞应用,应用久了就钻研钻研理论。

    以前上DCMTK官网仅仅是浏览关于开源库中各个类的设计模式、依赖关系。最近在打开DCMTK官网的wiki时,才发现OFFISDCMTK的介绍是如此的详细。正值国庆假日,就不深挖DCMTK源码了,那就按照DCMTK wiki中给出的介绍来实际体验分析一下DCMTK,从实践角度来学习一下。

    PACSDebugging with DCMTK

    前几篇博文分别介绍了worklist查询服务(DICOM医学图像处理:基于DCMTK工具包学习和分析worklistDICOM医学图像处理:利用fo-dicom发送C-Find查询Worklist)、C-STORE服务(DICOM医学图像处理:storescp.exestorescu.exe源码剖析,学习C-STORE请求DICOM医学图形处理:storescp.exestorescu.exe源码剖析,学习C-STORE请求(续))和C-MOVE服务(DICOM医学图像处理:AETitleC-FINDC-MOVE请求中的设置问题)。此次参考wiki中的说明利用DCMTK中的工具来讲解一下如何调试PACS系统。

    下文中会用到的工具有以下两类

    服务端

    dcmqrscp

    客户端

    echoscu、storescu、findscu、movescu

    PACS是什么?在DICOM标准中并没有明确的定义,DICOM协议大多是通过定义SOP来描述相关网络服务。但是几乎每一个PACS系统会包含以下几种SOP类,

    Verification SOP Class

    又称为DICOM ECHO服务,用于查明网络对端系统(即PACS)是否符合DICOM标准(即talks DICOM),以便双方按照DICOM标准进行对话。

    Storage SOP Classes

    将一个或多个DICOM对象存储到PACS服务器。一个PACS系统往往需要支持多种Storage SOP Classes,用以存储不同设备的图像数据(如CT、US、MR等)。

    Query SOP Classes

    根据指定的关键字查询PACS数据库。但是并不下载图像,仅仅是查询图像有关的信息。

    Retrieve SOP Classes

    根据Query SOP Classes的结果找到目标图像后,利用Retrieve SOP Classes服务从PACS服务器下载图像到本地。

    Storage Commitment SOP Classes

    客户通过该服务确认PACS服务端已经成功完成了图像的归档。

    因此可以简单的理解为PACS就是提供了上述多种服务的服务端。在DCMTK工具包中给我们提供了一个PACS模拟工具——dcmqrscp,该工具提供了上表中的所有服务(Storage Commitment SOP Classes除外,该部分并未包含在DCMTK开源包中,而需要购买商用版本)。

    下面就利用dcmqrscp与其他的dcmtk工具来模拟调试一下客户端与PACS服务端的交互过程,从实际应用的角度熟悉DICOM3.0标准。

    1)安装PACS服务器:

    利用DCMTK给出的dcmqrscp工具包结合自己定制的配置文件来搭建我们的PACS服务器(为了更好的学习DCMTK工具包,不建议直接使用wiki中给出的公用版PACS,即www.dicomserver.co.uk/

    dcmqrscp跟其他dcmtk工具包一样,可以通过添加-h--help命令行参数来查看工具包的使用说明。唯一不同的是要想启动PACS服务器还需要指定一个配置文件。DCMTK提供的默认的配置文件为dmqrscp.cfg。打开dcmtk工具包中的dcmqrscp.cfg文件,其中的注释已经很清楚。简单概括为三部分:

    第一部分,网络配置,即传统网络编程中用到参数。如NetworkTCPPort——监听端口,用于监听来自客户端的各种连接请求(需要注意的是要配置自己的防火墙,开放指定的端口);MaxAssociations——允许的最大连接数;MaxPDUSize——定义PDU传输时刻的最大长度等等。

    第二部分,关于连接到dcmqrscp服务器的客户机定义。该部分包含在dcmqrscp.cfg配置文件HostTable BEGINHost Table END内。默认的定义如下:

    简而言之,该部分就是定义可能连接到PACS服务器的客户机信息,通常包含AETitleHostNamePortNamer三部分。需要指出的是目前HostName(主机名称)还不支持直接IP地址的方式,因此在本地配置的时候要格外注意。

    本地机的配置如下:

    acme1 = (ACME1,localhost,11110)

    acme2 = (ACME2,localhost,11110)

    acmeCTcompany =acme1 , acme2

    第三部分,客户机的详细信息。该部分目的多是为了方便用户的阅读,方便配置时使用。在下文中的调试过程中并未用到,因此就不做介绍了。

    第四部分,PACS服务端存储位置信息定义。通过该部分设置,可以实现将不同客户端传统过来的数据归档到不同的PACS服务器目录。同时针对不同的AE指定不同的读写权限、存储的研究(study)数量等。默认的配置文件如下,

    该部分配置的时候要注意路径必须在本地已经存在,否则会引发错误。例如我在本地的配置如下,

       ACME_STORED:\DcmScuScp\DcmScp RW (9, 1024mb) acmeCTcompany

    下面给出我在本地机的dcmqrscp.cfg配置文件,

    在命令行启动dcmqrscp工具,输出状态如下:

    2PACS的功能调试

    PACS可以简单的理解为提供了多种DICOM标准中SOP服务的软件。我们已经利用dcmqrscp工具启动了一个PACS系统,接下来就按照上一节中PACS提供的SOP服务类表格来依次进行测试

    Verification SOPClass服务测试

    VerificationSOPClass服务是每一个PACS系统必须提供的一项服务,用于指出该PACS服务符合DICOM协议。DCMTK工具包中的echoscu工具可发起该请求,具体指令如下:echoscu.exe –dlocalhost 11110

    11110对应于dcmqrscp.cfg配置文件第一部分给出的NetworkTCPPort-d是调试选项,方便我们观察工具包的运行状态。运行后的输出结果如下:

    喔?竟然出现了几个致命错误。幸好我们开启了-d调试开关,从调试结果中看出错误的原因是无法识别Called AE Title,因为我们在echoscu命令行中并未指定dcmqrscp的名称。修改后指令如下,echoscu.exe –d localhost 11110 –aec ACME_STORE

    竟然又出现了同样的错误?想必很多第一次接触dcmtk的同学看到这个结果就已经心凉了一半,无心继续下去了。DMCTKwiki中指出这个错误提示并未指出真正的错误原因,这个是dcmqrscp.exe工具包的问题。这里应该是要求我们同时指定我们自己的AE名称,再次修改后的代码如下:echoscu.exe –dlocalhost 11110 –aec ACME_STORE –aet ACME1

    好吧,又出现了同样的错误,我是服了。看来想好好学习应用也不是很容易的啊。为了能够继续后续的其他测试,查看一下dcmqrscp工具包的源码文件dcmqrscp.cc,找出产生上述问题的原因。

    问题排查:

    dcmqrscp.cc文件main函数中的waitForAssociation一行插入断点,进行单步调试。如上在命令行开启echoscu,发送C-ECHO请求。逐行运行代码,具体流程如下,

    最后代码停留在_stricmp(HostName,CNF_Config.AEEntries[i].Peers[j].HostName)一行,如下:

    该行中的HostName函数指的是我们主机的名称,例如我本机的名称是:PC-201408122158,而CNF_Config.AEEntries[i].Peers[j].HostName指的是我们配置文件dcmqrscp.cfg中的HostTable部分,其中HostName对应的就是上面配置文件中的localhost

    至此,经过简单的源码分析,已经顺利找到了问题的原因。之所以一直提示“Called AE Title Not Recognized”就是因为我们将HostTable中的Hostname误认为是本机IP地址的字符名称,所以错误的将主机名称设置成了localhost。其实在dcmqrscp工具包的配置文件dcmqrscp.cfg中曾有过提示Note:in the current implementation you cannot substitutean IP address for a hostname

    重新修改配置文件中的hostnamePC-201408122158,再次进行尝试。此次连接测试顺利通过,测试结果如下:

    Storage SOP Classes服务测试

    连接测试顺利通过后,利用storescu.exe工具包对Storage SOPClass服务进行测试。具体指令如下:storescu.exe –dlocalhost 11110 00.dcm –aec ACME_STORE –aet ACME1,测试结果显示为Success(如下图)


    经过此次storescu测试,成功的将D盘根目录下的00.dcm文件上传到了dcmqrscp.cfg中指定的存储目录下,即D:\DcmScuScp\DcmScp,在存储的过程中dcmqrscp00.dcm文件进行了重命名(关于重命名的规则可参见DCMTKdcmqrscpwiki介绍,也可以通过命令行参数来设定重命名的方式),同时在归档目录下生成了一个名称为index.dat的记录文件,如下图:

    Query SOP Classes服务测试

    继续我们的调试,通过使用storescu.exe已经能够顺利的将我们的图像上传到指定的PACS服务目录下。接下来对我们上传的数据进行查询测试,使用的工具是findscu.exe,测试的具体指令为:findscu.exe -v -S -aec ACME_STORE -aet ACME1 localhost11110 -k QueryRetrieveLevel=STUDY -k StudyDate -k StudyDescription -kStudyInstanceUID,查询的结果如下:


    查询反馈的结果与我们在利用dcmdump工具显示的信息完全一致,这说明Query SOPClasses测试顺利通过。


    Retrieve SOP Classes服务测试

    进行我们最后一项测试,就是将上传到PACS服务器的图像数据重新下载到本地。测试的工具是movescu.exe,具体指令如下:movescu.exe -v -S-aec ACME_STORE -aet ACME1 -aem ACME1 --port 11110 -od D:\DcmScuScp\DcmSculocalhost 11110 -k QueryRetrieveLevel=STUDY -k StudyInstanceUID = 2.16.840.114421.81295.9407241257

    原本以为会顺利将图像保存到本地D:\DcmScuScp\DcmScu目录下,结果PACS服务端和客户端同时停在了如下状态,


    由上图可以看出网络连接部分的交互已经完成了,而且对于dcmqrscp.exe模拟的PACS服务端的各项服务(VerificationSOPClassStorageSOPClassQuerySOPClassRetrieveSOPClass)我们都已经测试过了,为何信息交互停留在了ConstructionAssociation RQ PDU部分呢?仔细检查一下命令行参数以及dcmqrscp.cfg配置文件,发现在本地测试的时候我们将dcmqrscp.exe模拟的PACS服务器监听端口和可能连入的客户端端口都设置成了11110,因此在进行图像传输的过程中会发生冲突,为了验证我们的猜测,将ACME1客户端的端口修改为12345,再一次进行movescu的测试,指令如下:movescu.exe -v -S-aec ACME_STORE -aet ACME1 -aem ACME1 --port 12345 -od D:\DcmScuScp\DcmScu localhost11110 -k QueryRetrieveLevel=STUDY -kStudyInstanceUID=2.16.840.114421.81295.9407241257,测试结果如下:


    打开本地的D:\DcmScuScp\DcmScu目录,可以看到由storescu.exe上传到PACS服务器的文件。

    至此利用DCMTK工具对PACS的调试工作全部结束了,上述的调试完全参照DCMTKwiki的相关内容,原文链接为http://support.dcmtk.org/redmine/projects/dcmtk/wiki/Howto_PACSDebuggingWithDCMTK,这里我的操作仅供大家参考,如果有精力还希望仔细阅读一下英文原文,原文的讲解更详细更全面。


    后续专栏博文介绍

    Dicom中的MPPS服务介绍

    C#的异步编程模式在fo-dicom中的应用

    VMWare三种网络连接模式的实际测试


    作者:zssure@163.com

    时间:2014-10-03

     

    展开全文
  • Windows10平台Cmake3.11+VS2017编译、安装DCMTK[MD版本]库 一、前言  最近由于项目需要,开始接触DCMTK库,作为一个小白在网上一顿狂搜,看了几天的CSDN博客,终于有了一点头绪。在这个过程中我遇到了很多问题,...

       Windows10平台Cmake3.11+VS2017编译、安装DCMTK[MD版本]库

    一、前言

           最近由于项目需要,开始接触DCMTK库,作为一个小白在网上一顿狂搜,看了几天的CSDN博客,终于有了一点头绪。在这个过程中我遇到了很多问题,有一部分自己看CSDN博客解决掉了,还有一些问题是在技术讨论群里询问,在许多热心的前辈帮助下解决了问题。十分感谢前辈们写的DCMTK博客给了我指导与方向,同时感谢前辈抽出时间回答我的问题。

            感谢【柳北风儿~~~~~~~欲宇仙炅】博主的文章,【嗯哇的博客】等博主的文章,文末会给出这些前辈的博客的地址。感谢网友【槑】、【PacsDeveloper】等多位的大哥热心帮助。

            由于我的项目需要在Qt Creator5.10里使用DCMTK库,而网上关于这部分的资源很少,忙了好多天才解决了问题,写下此文一是向帮助我的前辈致敬、二是帮助后来的新人花更少的时间解决问题。由于本人仍然算是小白,希望路过的大神对本文错误的地方予以指正,或给出意见、建议。

            我的邮箱是:annjeff@163.com,有需要交流的同学可以给我发邮件。

    二、基础理论知识   

    1. /MT和/MTd表示采用多线程CRT库的静态lib版本。该选项会在编译时将运行时库以静态lib的形式完全嵌入。该选项生成的可执行文件运行时不需要运行时库dll的参加,会获得轻微的性能提升,但最终生成的二进制代码因链入庞大的运行时库实现而变得非常臃肿。当某项目以静态链接库的形式嵌入到多个项目,则可能造成运行时库的内存管理有多份,最终将导致致命的“Invalid Address specified to RtlValidateHeap”问题。另外托管C++和CLI中不再支持/MT和/MTd选项。

      /MD和/MDd表示采用多线程CRT库的动态dll版本,会使应用程序使用运行时库特定版本的多线程DLL。链接时将按照传统VC链接dll的方式将运行时库MSVCRxx.DLL的导入库MSVCRT.lib链接,在运行时要求安装了相应版本的VC运行时库可再发行组件包(当然把这些运行时库dll放在应用程序目录下也是可以的)。 因/MD和/MDd方式不会将运行时库链接到可执行文件内部,可有效减少可执行文件尺寸。当多项目以MD方式运作时,其内部会采用同一个堆,内存管理将被简化,跨模块内存管理问题也能得到缓解。

      结论:/MD和/MDd将是潮流所趋,/ML和/MLd方式请及时放弃,/MT和/MTd在非必要时最好也不要采用了。         [此条目摘自:柳北风儿的博客]
    2. /MD 与 /MT 用于Release 版本,前者表示链接时,不链接VC的运行时库(msvcrt.lib),而采用动态(msvcrtXX.dll,其中XX表示使用的版本);相应地,后者则表示静态链接VC的运行时库,这样的结果是链接生成的的目标模块体积明显比前者要大一些。

      /MTD与/MDD 用于Debug版本,其它规则同上。[此条目摘自:https://blog.csdn.net/cjqpker/article/details/46713791]

    三、必要软件下载安装

        1.Cmake(cmake-gui)软件下载安装

            到 https://cmake.org/download/可以进行cmake软件的下载安装,同其他Windows软件一样,根据提示安装即可,新手可根据其他专门讲Cmake软件的博客进行安装。

        2.DCMTK库的下载及编译

            DCMTK的官网:https://dcmtk.org/dcmtk.php.en提供DCMTK源码的下载,以及必要的依赖库。

            

       图 3-1 DCMTK及帮助文档下载

                

                    

                       图 3-2 根据自己的需求选择下载依赖库

            因为我的系统为Windows 10 64bit,VS为2017版本故选择了如图3-2所示的支持库。下载源码及支持库后,把源码及支持库解压到本地磁盘。例如:我在D盘新建了目录DCMTK,解压源码路径为D:\DCMTK\dcmtk3.6.3。解压支持库路径为D:\DCMTK \dcmtk-3.6.3-win64-support_MD-msvc-15.0。

            上述DCMTK提供的官方文档为英文版的HTML网页压缩包,解压用浏览器打开即可以使用。

    四、使用Cmake工具将DCMTK源码构建为VS的工程

            1.事先规划好DCMTK源码Cmake后生成二进制文件存放地点,以及DCMTK安装位置。本人于D:\DCMTK\文件夹下,新建了dcmtk-3.6.3-bin用来存放DCMTK经过Cmake编译后生成的二进制文件,这个文件夹会生成VS工程,使用VS打开工程可以看到源码。D:\DCMTK\dcmtk-3.6.3-install\文件夹下来安装DCMTK库。

            

                                                            图 4-1 DCMTK目录规划

            2.关闭VS,打开Cmake(cmake-gui),在 Where is the source code:选择DCMTK源码解压路径,在Where to build the binaries:选择我们新建的dcmtk-3.6.3-bin作为二进制文件的存放目录。

           

    图 4-2 开始Configure

            3.为工程选择一个编译器,这里我选择Visual Studio 15 2017 Win64

                

    图 4-3  选择编译器  

            点击Finish后将是一个漫长的过程,看电脑的配置,我大概编译了8分钟的样子。       

            4.当看到Configuring done的时候第一次编译结束,用时较长,此时你会发现好多 -not find,不用担心,接下来按步骤操作即可。

            

    图 4-4 此时第一编译结束

            5.选择Groupd分组,此时Cmake工具会帮我们把当前的项按首单词分成五个组,在对应的组下进行修改比较方便。我们进入CMAKE组下 修改DCMTK库的安装位置,默认安装在C盘下。建议修改为D盘或其他盘下,否则在VS生成项目时,需要以管理员的权限进行运行否则会出现失败。此处我按照自己原来的规划把安装位置放于D:/DCMTK/dcmtk-3.6.3-install目录下。即修改CMAKE_INSTALL_PREFIX=D:/DCMTK/dcmtk-3.6.3-install。

            

    图 4-5修改安装位置

            6.接下来进入DCMTK分组下,把DCMTK_OVERWRITE_WIN32_COMPILER_FLAGS 后面的√去掉,在选择MD/MDd支持库时,这一步尤为重要。

           

    图 4-6 修改DCMTK组选项

     

             7.如果你需要比较完整的使用DCMTK库,需要把以下6项进行选择,选择后DCMTK功能比较完善。

    图 4-7 为DCMTK添加库

     

            8.如果你选择了第7步骤中的几个选项,此时你需要在WITH下面把各个对应的附加库的源文件路径添加到对应的项目下。记住是DCMTK官网下载的dcmtk-3.6.3-win64-support_MD-msvc-15.0其他版本根据自己实际情况亦可。

    路径
    WITH_LIBICONVINC D:\DCMTK\dcmtk-3.6.3-win64-support_MD-msvc-15.0\libiconv-1.15
    WITH_LIBPNGINC D:\DCMTK\dcmtk-3.6.3-win64-support_MD-msvc-15.0\libpng-1.6.34
    WITH_LIBTIFFINC D:\DCMTK\dcmtk-3.6.3-win64-support_MD-msvc-15.0\libtiff-4.0.9
    WITH_LIBXMLINC D:\DCMTK\dcmtk-3.6.3-win64-support_MD-msvc-15.0\libxml2-2.9.7
    WITH_OPENSSLINC D:\DCMTK\dcmtk-3.6.3-win64-support_MD-msvc-15.0\openssl-1.1.0g
    WITH_ZLIBINC D:\DCMTK\dcmtk-3.6.3-win64-support_MD-msvc-15.0\zlib-1.2.11

    图 4-8 把添加的库对应的库文件位置配置

            9.选择Advanced,如果我们要编译Debug版本,记住看一下CMAKE_CXX_FLAGS_DEBUG后面是不是MDd,因为MDd是Debug版本的。

    图 4-9 确认MDd库信息

            10.确认无误后,开始第二次进行Configure,这一次Configure速度比较快。

    图 4-10 第二次进行Configure

            11.Configure结束后,我们开始Generate,当Generate结束后,Cmake步骤即结束,此时在DCMTK-bin目录下已经产生了VS的项目文件,接下来的操作是在VS里面进行。

    图 4-11 Generator

            五、VS下进行DCMTK的编译和安装

            1.在D:\DCMTK\dcmtk-3.6.3-bin目录下会生成DCMKT.sln,使用VS打开DCMTK.sln。

         

    图 5-1 使用VS打开Cmake生成的项目

     

            2.随便在一个项目上右击->属性->常规->字符集查看字符集是否为多字节字符集

    图 5-2 查看字符集

     

            3.同时在 C/C++ -->代码生成下查看运行库是否为 MDd。

    图 5-3 查看运行库

            4.生成-->批生成

    图 5-4 开始批生成

            5.选择ALL_BUILD Debug -->生成 ,只选这一项,这项的过程比较慢,耐心等待或做点其他的事情。

    图 5-5 开始ALL_BUILD

            6.长时间的等待后你会发现成功95个,这是便可以开始下一步。

    图 5-6 ALL_BUILD结束

            7.再次进入【批生成】选择INSTALL 开始生成,此时会在DCMTK-3.6.3-install生成安装文件。

    图 5-7 开始Install

            8.INSTALL结束。

    图 5-8 Install完成

            9.DCMTK安装成功后会在安装目录生成以下文件。

    图 5-9 DCMKT安装目录下生成的文件目录

     

           

    [嗯哇的博客]:https://blog.csdn.net/chaoenhu/article/category/7213130

    [柳北风儿~~~~~~~欲宇仙炅]:http://blog.163.com/qimo601@126

     

     

            

               

    展开全文
  • dcmtk-3.6.0版本编译出的动态库文件,包含Debug和Release版本。
  • DCMTK(MD)环境配置

    2020-04-06 20:58:52
    这里写自定义目录标题DCMTK 介绍DCMTK版本下载合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants...
  • linux 系统下DCMTK3.6.0源码
  • DCMTK 新手使用指南

    2009-05-07 18:12:23
    DCMTK 新人使用的时候会有很多疑惑之处 本人总结了部分经验心得 希望能帮助大家快速上手 Pacs事业还是需要大家支持下的...
  • dicom协议开源库DCMTK安装和使用

    千次阅读 2017-08-31 14:01:20
     DCMTK是由德国offis公司提供的开源项目,几乎实现了完整的DICOM协议,是3大dicom开源库之一。DCMTK采用C++语言开发。 准备工作 1. 安装CMake https://cmake.org/download/,我电脑里安装的3.8.2版本。 2. ...
  • dcmtk

    千次阅读 2018-11-18 19:58:50
    DCMTK 首推德国offis公司开发的DCMTKDCMTK提供了实现DICOM协议的一个平台,使得我们可以在它的基础上轻松的完成自己的主要工作,而不必把太多的精力放在实现DICOM协议的细节问题上,DCMTK是由德国offis公司提供的...
  • DCMTK3.6.2+VS2015(MD支持版)编译和安装示范,本文的编译机器是Windows10 64位系统,使用VS2015和cmake3.7.2编译DCMTK源码为64位包(运行时库为MD或MDd)。
  • DCMTK

    千次阅读 2012-04-21 21:51:52
    由于现在的医学影像设备的图像存储和传输正在逐渐向DICOM标准靠拢,在我们进行医学图像处理的...德国offis公司开发的DCMTK,为我们提供了实现DICOM协议的一个平台,使得我们可以在它的基础上轻松的完成自己的主要工作
  • dcmtk使用手册,医学领域的东东,有学习的可以下载看看,没学过,不知道好不好学
  • DCMTK(MD版)编译和安装+VS2015

    千次阅读 热门讨论 2017-10-11 09:51:20
    Visual Studio 2015+cmake编译安装MD版的DCMTK 下一章 DCMTK(MD版)、QT、VS2015编写浏览医学图像应用-- 读取模块 https://blog.csdn.net/chaoenhu/article/details/101704350 免编译,直接 去中科院分子影像重点...
  • DCMTK-已编译的dcmtk

    2012-10-16 15:31:29
    名称:DCMTK 评级:★★★★★ 开源许可:BSD 功能: 影像处理,影像归档,影像管理,影像传输 标准:DICOM 语言:英语 客户端: 桌面 平台:跨平台 编程语言:C/C++ 官方网站:http://dicom.offis.de/
  • dcmtk 开源代码

    2019-01-11 09:35:34
    是了解DICOM协议不可多得得好帮手。里面详细描述了 dicom 协议的实现方式,为后续dicom开发铺平道路。
  • 官方DCMTK的安装步骤

    2012-06-07 13:22:44
    官方安装DCMTK3.6.0的步骤: 详细中文安装步骤可以参考下面两篇: 1、DCMTK3.6(MD支持库)安装说明 2、DCMTK3.6.0 (MT支持库)安装 完整说明 BUILDING (Windows) ================== Starting ...
  • Author Message nicolaszerr  Post subject: Set output directory to DcmSCP Posted: Thu, 2011-09-22, 13:26  Joined: Thu, 2011-09-22, 12:54Posts: 4Location: ......
  • 网上关于mingw编译dcmtk的文章太少,不方便查阅,期间遇到各种问题。特意将整个编译过程记录下来。为了保证所有编译出来的文件方便我在Qt5.5.0中使用,将所有的dcmtk依赖的外部库下载下来并进行编译。整个编译过程...
  • 编译DCMTK

    千次阅读 2010-02-27 20:16:00
    编译DCMTK2008年09月11日 星期四 09:31也许是DCMTK的开发人员认为DCMTK是一个专用的库,没有必要做成动态链接库。 也许是DCMTK的开发人员认为DCMTK需要跨平台,做成动态链接库就平台相关了,违背了跨平台的本意。 ...
  • DCMTK下载及编译使用

    2015-01-16 16:11:52
    压缩文件包含了DCMTK和CMAKE的工具包,并有详细的使用文档,根据文档一步步的操作即可。希望对大家有用
  • 已编译的 DCMTK 3.6.2 Debug x64版本 实验步骤 在VS2010中新建Visual C++ Win32 控制台应用程序 空项目,命名为DcmtkDemo 在源文件中添加新建项 .cpp文件,命名为main.cpp 粘贴如下测试代码 #include <stdio.h&...
  • dcmtk详细安装文档,环境centos,各种语言通用。另附php demo
  • 最近由于项目需要,开始接触DCMTK库,作为一个小白在网上一顿狂搜,看了几天的CSDN博客,终于有了一点头绪。在这个过程中我遇到了很多问题,有一部分自己看CSDN博客解决掉了,还有一些问题是在技术讨论...
  • DCMTK安装

    千次阅读 2013-01-17 11:13:01
    一、 DCMTK简介  DCMTK是由德国offis公司提供的开源项目,并拥有相应的版权。这个开发包经过10多年的开发和维护,已经基本实现了DICOM协议的所有内容。该开发包提供所有的源代码、支持库和帮助文档。DCMTK提供...
  • dcmtk程序包简介

    千次阅读 2012-08-14 15:49:14
    dcmtk程序包简介 ***该文简单列出了dcmtk程序包的简介,包括主要接口类的简单说明,可用工具以及一些例子。下一步工作准备详细分析每个程序包中的接口类功能,并结合源码和dicom文档分析其实现过程。 Dcmtk程序...
  • DCMTK DCMSCU例子

    2012-09-15 14:01:59
    转载:http://forum.dcmtk.org/viewtopic.php?f=1&amp;t=2812&amp;hilit=DCMNET connect to PACS system biginner question Moderator: Moderator Team    Page 1 of 3  [ 31 ...
  • 编译64位dcmtk

    千次阅读 2016-11-04 20:31:04
    首先下载dcmtk源码,目前最新版本3.6.1,下载地址:ftp://ftp.dcmtk.org/pub/dicom/offis/software/dcmtk/snapshot/用最新版的CMake生成源码项目,此处开发环境为win7x64的VS2012,注意在编译选项中选择”Visual ...
  • 背景: 从DICOM网络传输一文开始,相继介绍了C-ECHO、C-FIND、C-STORE、C-MOVE等DIMSE-C服务的简单实现,博文中的代码给出的实例都是基于fo-dicom库来...本博文希望在前几篇预热的基础上,对比DCMTK、fo-dicom、mDCM

空空如也

1 2 3 4 5 ... 20
收藏数 1,289
精华内容 515
关键字:

DCMTK