我已经看过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 Server的查询)!我想确切地知道如何使用此应用程序实体(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 Server正在发送文件,但SCU无法接收它!
我是否需要使用C-MOVE命令来实际获取图像
是; C-MOVE或C-GET都可以正常工作;使用哪种取决于您的要求。 C-MOVE将建立新的连接(角色将被逆转),并且实例将在新建立的连接上发送。 C-GET将在同一连接上工作。
或我的代码不完整(在某种意义上说,没有为SCU onReceiveStore指定事件处理程序)?
我不知道编程语言和工具包。因此,我对此不作评论。
我希望从DICOM服务器(在我的情况下为ConQuest服务器)发送.dcm,但是我只接收DICOM标签,以确认存在此数据集(作为对ConQuest Server的查询)!
[很可能,您在这里得到C-FIND响应。这不包含图像实例。有关更多详细信息,请参考this答案。
我想确切地知道如何使用此应用程序实体(ae)在SCU上接收图像
在收到C-FIND响应后,使用它的标识符,您应该进一步发出C-MOVE / C-GET命令/请求。响应此请求,您将获得实际的图像实例。您的C-FIND SCU在这里成为C-STORE SCP;通常称为角色反转。有关更多详细信息,请参考this答案。
我也建议您阅读以下罗尼的文章:
C-GET和C-MOVE都将使SCP将包含数据集的C-STORE命令发送回您的设备。
C-GET和C-MOVE之间的区别在于,C-MOVE将尝试打开与您设备的连接(该设备还必须充当SCP来接收C-STORE),而C-GET将发送通过您的设备协商的同一连接上的C-STORE。
C-GET和C-MOVE的响应仅包含操作状态。