首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >DICOM C_MOVE与gdcm's CompositeNetworkFunctions

DICOM C_MOVE与gdcm's CompositeNetworkFunctions
EN

Stack Overflow用户
提问于 2015-03-21 08:23:58
回答 1查看 1.1K关注 0票数 5

我正在尝试使用gdcm的CompositeNetworkFunctions从服务器上获取DICOMS。我的测试服务器是使用"Orthanc“设置的。

当我运行移动请求时,我得到:

代码语言:javascript
运行
复制
terminate called after throwing an instance of 'gdcm::Exception'

what():/home/myname/Builds/GDCM/Source/Source/Common/gdcmException.h:74 ():

当我捕捉到这个异常时,我发现它是一个“未处理的异常”,没有更多的信息。因此,我没有捕获它,而是使用gdb运行程序。我得到的是:

代码语言:javascript
运行
复制
0x00007ffff3e4dcc9 in __GI_raise (sig=sig@entry=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:56
56  ../nptl/sysdeps/unix/sysv/linux/raise.c: No such file or directory.
(gdb) bt
#0  0x00007ffff3e4dcc9 in __GI_raise (sig=sig@entry=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:56
#1  0x00007ffff3e510d8 in __GI_abort () at abort.c:89
#2  0x00007ffff44526b5 in __gnu_cxx::__verbose_terminate_handler() () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#3  0x00007ffff4450836 in ?? () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#4  0x00007ffff4450863 in std::terminate() () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#5  0x00007ffff4450aa2 in __cxa_throw () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#6  0x0000000000781772 in std::istream& gdcm::DataSet::ReadWithLength<gdcm::ExplicitDataElement, gdcm::SwapperNoOp>(std::istream&, gdcm::VL&) ()
#7  0x00000000007cd268 in gdcm::network::PresentationDataValue::ConcatenatePDVBlobsAsExplicit(std::vector<gdcm::network::PresentationDataValue, std::allocator<gdcm::network::PresentationDataValue> > const&) ()
#8  0x00000000007d6af1 in gdcm::network::ULConnectionManager::RunEventLoop(gdcm::network::ULEvent&, gdcm::network::ULConnection*, gdcm::network::ULConnectionCallback*, bool const&) ()
#9  0x00000000007d5190 in gdcm::network::ULConnectionManager::RunMoveEventLoop(gdcm::network::ULEvent&, gdcm::network::ULConnectionCallback*) ()
#10 0x00000000007d4acf in gdcm::network::ULConnectionManager::SendMove(gdcm::BaseRootQuery const*, gdcm::network::ULConnectionCallback*) ()
#11 0x00000000007c1750 in gdcm::CompositeNetworkFunctions::CMove(char const*, unsigned short, gdcm::BaseRootQuery const*, unsigned short, char const*, char const*, char const*) ()
#12 0x0000000000666c5c in PACSCMove::run (this=0x25a9dd0) at /home/myname/Projects/Hiwi/Source/src/PACSCMove.cpp:67
#13 0x00007ffff4798384 in ?? () from /home/myname/Qt/5.4/gcc_64/lib/libQt5Core.so.5
#14 0x00007ffff70fa182 in start_thread (arg=0x7fffd8cf5700) at pthread_create.c:312
#15 0x00007ffff3f1147d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:111

这是我的密码:

代码语言:javascript
运行
复制
mQuery.InitializeDataSet( mQueryLevel );
setSearchParameter( gdcm::Tag( 0x20, 0x000d ), studyUID.toStdString() );    // Study UID
setSearchParameter( gdcm::Tag( 0x20, 0x000e ), seriesUID.toStdString() );   // Series UID

std::cout << "New Move Query: " << mQuery.ValidateQuery(true) << std::endl;


mQuery.WriteQuery("MoveQuery.dcm");


bool res = gdcm::CompositeNetworkFunctions::CMove(
                "localhost", 4242,
                &mQuery,
                11110,
                "IMHOTEP",
                NULL,
                "/home/myname/TestPatient" );

mQueryLevel是gdcm::eSeries

有趣的是,使用书面查询文件"MoveQuery.dcm",我可以很好地使用movescu下载该文件:

代码语言:javascript
运行
复制
movescu -v -p -aet IMHOTEP -od /home/myname/TestPatient/ --port 11110 localhost 4242 MoveQuery.dcm

我试过:

  • AET和CALL的不同值
  • 相对路径和绝对路径
  • 不同的端口(尽管不应该是这样--毕竟,我的movescu调用使用了相同的端口!)
  • mQuery当前的类型是gdcm::MovePatientRootQuery,但我尝试过MoveStudyRootQuery、FindPatientRootQuery、FindStudyRootQuery
  • 深入GDCM代码,遵循堆栈跟踪--但我对发生了什么事情不太了解
  • 将"PatientID“的值也添加到查询中,或者只提供"SeriesUID”(相同的结果)

通过将PatientID添加到查询中,MoveQuery.dcm的内容如下:

代码语言:javascript
运行
复制
$ dcmdump MoveQuery.dcm 

# Dicom-File-Format

# Dicom-Meta-Information-Header
# Used TransferSyntax: Unknown Transfer Syntax

# Dicom-Data-Set
# Used TransferSyntax: Little Endian Implicit
(0008,0052) CS [SERIES]                                 #   6, 1 QueryRetrieveLevel
(0010,0020) LO [4589301]                                #   8, 1 PatientID
(0020,000d) UI [1.2.840.113619.2.55.1.1762893669.2104.1060778173.267] #  52, 1 StudyInstanceUID
(0020,000e) UI [1.2.840.113619.2.55.1.1762893669.2104.1060778173.271] #  52, 1 SeriesInstanceUID
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-23 22:19:40

C-GET服务在DICOM标准中没有退役.C-GET使用相同的连接从SCP检索映像,而C-MOVE使用并行连接,其中服务器将其角色切换到SCU (客户端),并将尝试连接到移动目的地AE (目标服务器)。在这种情况下,您需要在您的侧有一个DICOM侦听器(SCP)来处理传入的连接。

我认为您是说调用AE标题(C移动服务请求者)是"IMHOTEP“,您应该让一个DICOM侦听器监听端口”11110“。您正在请求远程AE“ORTHANC”(称为AE)将该系列移动到C移动目的地AE (这应该是您的DICOM侦听器(SCP),即"IMHOTEP")。

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

https://stackoverflow.com/questions/29180692

复制
相关文章

相似问题

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