首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SCU如何通过C-GET从Dicom服务器接收dcm图像?

SCU如何通过C-GET从Dicom服务器接收dcm图像?
EN

Stack Overflow用户
提问于 2019-10-25 09:47:50
回答 3查看 1.2K关注 0票数 2

我已经看过官方的pynetdicom文档,但我还没有获得正确的事件处理程序(用于SCU)来接收图像。

首先,我已经创建了所需的.dcm文件数据集,并使用了C-GET命令,该命令实际上应该为我提供.dcm文件,但我也没有指定我的图像将存储在SCU上的什么位置。我是否需要使用C-MOVE命令来实际获取图像,或者我的代码不完整(从某种意义上说,没有为SCU onReceiveStore指定事件处理程序)?

代码语言:javascript
复制
from pydicom.dataset import Dataset
import pydicom

from pynetdicom import (
    AE, evt, build_role,
    PYNETDICOM_IMPLEMENTATION_UID,
    PYNETDICOM_IMPLEMENTATION_VERSION
)

from pynetdicom.sop_class import (
    PatientRootQueryRetrieveInformationModelGet,
    CTImageStorage
)


ae = AE()

ae.add_requested_context(PatientRootQueryRetrieveInformationModelGet)
ae.add_requested_context(CTImageStorage)

role = build_role(CTImageStorage, scp_role=True)

ds = Dataset()
ds.QueryRetrieveLevel = 'SERIES'
ds.PatientID = '0009703828'
ds.StudyInstanceUID = '1.3.46.670589.5.2.10.2156913941.892665384.993397'
ds.SeriesInstanceUID = '1.3.46.670589.5.2.10.2156913941.892665339.860724'

assoc = ae.associate('127.0.0.1', 5678)

if assoc.is_established:

responses = assoc.send_c_get(ds, PatientRootQueryRetrieveInformationModelGet)
for (status,dataset) in responses:
    if status:
        print('C-GET query status: 0x{0:04x}'.format(status.Status))
        # If the status is 'Pending' then `identifier` is the C-GET response
        if status.Status in (0x0000, 0x1022):
            print(dataset)
        else:
            print('Connection timed out, was aborted or received invalid response') 

    assoc.release()
else:
    print('Association rejected, aborted or never connected')

我希望.dcm是从DICOM服务器(也就是我的例子中的ConQuest服务器)发送的,但是我只是收到了DICOM标签,确认这个数据集(作为对ConQuest服务器的查询)存在!我想确切地知道如何使用此应用程序实体(ae)接收SCU上的图像

这是来自ConQuest服务器的响应

代码语言:javascript
复制
[CONQUESTSRV1] UPACS THREAD 11: STARTED AT: Fri Oct 25 06:56:23 2019
[CONQUESTSRV1]  Calling Application Title : "PYNETDICOM      "
[CONQUESTSRV1]  Called Application Title : "ANY-SCP         "
[CONQUESTSRV1]  Application Context : "1.2.840.10008.3.1.1.1", PDU length: 16382
[CONQUESTSRV1]  Presentation Context 0 "1.2.840.10008.5.1.4.1.2.1.3" 1
[CONQUESTSRV1]  Presentation Context 1 "1.2.840.10008.5.1.4.1.1.2" 1
[CONQUESTSRV1] Number of images to send: 2
[CONQUESTSRV1] Sending file : c:\users\sagar\onedrive\desktop\dicomserver1419d1\data\0009703828\1.3.46.670589.5.2.10.2156913941.892665339.860724_0001_002000_14579035620000.dcm
[CONQUESTSRV1] [recompress]: recompressed with mode = un (strip=1)
[CONQUESTSRV1] C-Get (PatientRoot)
[CONQUESTSRV1] UPACS THREAD 11: ENDED AT: Fri Oct 25 06:56:23 2019
[CONQUESTSRV1] UPACS THREAD 11: TOTAL RUNNING TIME: 0 SECONDS

ConQuest服务器正在发送文件,但SCU无法接收它!

EN

回答 3

Stack Overflow用户

发布于 2019-10-25 15:56:02

我是否需要使用C-MOVE命令来实际获取图像

可以;C-MOVE或C-GET都可以正常工作;使用哪一个取决于您的需求。C-MOVE将建立新的连接(角色将颠倒),并在新建立的连接上发送实例。C-GET将在相同的连接上工作。

或我的代码不完整(从某种意义上说,没有为SCU onReceiveStore指定事件处理程序)?

我不知道编程语言和工具包。因此,我可能不会对此发表评论。

我期望.dcm是从DICOM服务器(也就是我的例子中的ConQuest服务器)发送的,但是我只是收到了DICOM标签来确认这个数据集(作为对ConQuest服务器的查询)存在!

最有可能的是,你在这里得到了C-FIND响应。不包含镜像实例。有关更多详细信息,请参阅this答案。

我想确切地知道如何使用此应用程序实体(ae)接收SCU上的图像

在接收到C-FIND响应时,使用其中的标识符,您应该进一步发出C-MOVE/C-GET命令/请求。作为对此请求的响应,您将获得实际的镜像实例。您的C-FIND SCU在这里变成了C-STORE SCP;通常称为角色颠倒。有关更多详细信息,请参阅this答案。

我还建议你阅读下面来自Roni的文章:

  • http://dicomiseasy.blogspot.com/2012/01/dicom-queryretrieve-part-i.html
  • http://dicomiseasy.blogspot.com/2012/02/c-move.html
票数 1
EN

Stack Overflow用户

发布于 2019-10-25 14:39:01

C-GET和C-MOVE都会使SCP将包含数据集的C-STORE命令发送回您的设备。

C-GET和C-MOVE之间的不同之处在于,C-MOVE将尝试打开一个到您的设备的连接(它还必须充当SCP来接收C-STORE),而C-GET将在您的设备协商的同一连接上发送C-STORE。

C-GET和C-MOVE的响应只包含操作的状态。

票数 0
EN

Stack Overflow用户

发布于 2019-12-27 19:13:21

您需要将一个可调用的处理函数绑定到evt.EVT_C_STORE,如this example中所示。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58551159

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档