我已经看过官方的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 SECONDSConQuest服务器正在发送文件,但SCU无法接收它!
发布于 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的文章:
发布于 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的响应只包含操作的状态。
发布于 2019-12-27 19:13:21
您需要将一个可调用的处理函数绑定到evt.EVT_C_STORE,如this example中所示。
https://stackoverflow.com/questions/58551159
复制相似问题