2

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

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

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 服务器的响应

[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 无法接收!

4

3 回答 3

1

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

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

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

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

我希望 .dcm 从 DICOM 服务器(即我的情况下的 ConQuest 服务器)发送,但我只收到 DICOM 标签确认此数据集(作为对 ConQuest 服务器的查询)存在!

最有可能的是,您在这里得到 C-FIND 响应。这不包含图像实例。有关详细信息,请参阅此答案。

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

在收到 C-FIND 响应时,使用其中的标识符,您应该进一步发出 C-MOVE/C-GET 命令/请求。响应此请求,您将获得实际的图像实例。您的 C-FIND SCU 在这里变成 C-STORE SCP;一般称为角色反转。有关详细信息,请参阅此答案。

我还建议您阅读以下来自 Roni 的文章:

于 2019-10-25T07:56:02.187 回答
0

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

C-GET 和 C-MOVE 之间的区别在于 C-MOVE 将尝试打开与您设备的连接(它也必须充当 SCP 才能接收 C-STORE),而 C-GET 将发送 C-在您的设备协商的同一连接上存储。

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

于 2019-10-25T06:39:00.697 回答
0

您需要绑定一个可调用的处理程序函数,evt.EVT_C_STORE本例所示。

于 2019-12-27T11:13:20.580 回答