I do not understand what you want me to learn.
Here is my code:
Code:
/***
Charge sur le disque les series qui sont demandées depuis la zone d'importation
-serverIpAdress represente l'adresse IP nécéssaire à la connexion
-serverPort represente le numero du port nécéssaire à la connexion, coté serveur
-serverAet represente l'AET nécéssaire à la connexion
-monIpAdress represente l'adresse IP de la machine
-monPort represente le numero du port nécéssaire à la connexion coté client
-monAet represente l'AET de la machine
-listeStudyIDGet représente la liste des DCM_StudyInstanceUID des Study à charger sur le disque
*/
bool MedicTool2::getImagePacs(QString serverIpAdress, QString serverPort, QString serverAet, QString monIpAdress, QString monPort, QString monAet, QStringList listeStudyIDGet)
{
for (int numeroStudy=0; numeroStudy<listeStudyIDGet.size();numeroStudy++) //Idéalement cette boucle devrait etre placée plus en profondeur pour ne pas redemander une connexion à chaque fois au serveur
{
//Récupération de l'examen courant
QString numeroIDStudy = listeStudyIDGet[numeroStudy];
QProgressDialog progressDialog (tr("Récuperation en cours :")+" "+numeroIDStudy+"\n"+tr("Veuillez patienter..."),QString(),0,100);
progressDialog.setWindowModality(Qt::WindowModal);
progressDialog.show();
//Mise en place des parametre pour établire la connexion DICOM
OFLog::configure(OFLogger::DEBUG_LOG_LEVEL);
DcmTestSCU scu;
DcmTestSCUN scuN;
progressDialog.setValue(10);
//Mise en place des parametres AET
OFString OFmonAet = monAet; scu.setAETitle(OFmonAet); scuN.setAETitle(OFmonAet);
OFString OFipAdresse = serverIpAdress; scu.setPeerHostName(OFipAdresse); scuN.setPeerHostName(OFipAdresse);
Uint16 OFport = serverPort.toUInt(); scu.setPeerPort(OFport); scuN.setPeerPort(OFport);
OFString OFaet = serverAet; scu.setPeerAETitle(OFaet); scuN.setPeerAETitle(OFaet);
progressDialog.setValue(20);
//Utilisation du contexte de présentation FIND / MOVE dans la racine des series, pour proposer toutes les syntaxes de transfert compressées (Use presentation context for FIND/MOVE in study root, propose all uncompressed transfer syntaxes)
OFList<OFString> ts;
ts.push_back(UID_LittleEndianExplicitTransferSyntax);
ts.push_back(UID_BigEndianExplicitTransferSyntax);
ts.push_back(UID_LittleEndianImplicitTransferSyntax);
scu.addPresentationContext(UID_FINDStudyRootQueryRetrieveInformationModel, ts); scu.addPresentationContext(UID_MOVEStudyRootQueryRetrieveInformationModel, ts); scu.addPresentationContext(UID_VerificationSOPClass, ts);
scuN.addPresentationContext(UID_FINDStudyRootQueryRetrieveInformationModel, ts); scuN.addPresentationContext(UID_MOVEStudyRootQueryRetrieveInformationModel, ts); scuN.addPresentationContext(UID_VerificationSOPClass, ts);
progressDialog.setValue(30);
//Initialisation du reseau
OFCondition result = scu.initNetwork();
result = scuN.initNetwork();
if (result.bad())
{//PROBLEME DE CONNEXION
QString add = result.text();
QMessageBox::warning(0,"CONNEXION","TENTATIVE DE CONNEXION :\nJe suis : "+monIpAdress+":"+monPort+" ("+monAet+")\nEt je veux parler à : "+serverIpAdress+":"+serverPort+" ("+serverAet+")\n\nImpossible d'initialiser le reseau: "+add);
return false;
}
progressDialog.setValue(40);
//TENTATIVE D'ASSOCIATION
result = scu.negotiateAssociation();
result = scuN.negotiateAssociation();
if (result.bad())
{//PROBLEME D'IDENTIFICATION
QString add = result.text();
QMessageBox::warning(0,"CONNEXION","TENTATIVE DE CONNEXION :\nJe suis : "+monIpAdress+":"+monPort+" ("+monAet+")\nEt je veux parler à : "+serverIpAdress+":"+serverPort+" ("+serverAet+")\n\nImpossible de negocier l'association: "+add);
return false;
}
progressDialog.setValue(50);
//Voyons si le serveur est en écoute: Contruction et envoi d'une demande C-ECHO (Let's look whether the server is listening: Assemble and send C-ECHO request)
result = scu.sendECHORequest(0);
result = scuN.sendECHORequest(0);
if (result.bad())
{//PROBLEME, LE SERVER NE REPOND PAS
QString add = result.text();
QMessageBox::warning(0,"CONNEXION","TENTATIVE DE CONNEXION :\nJe suis : "+monIpAdress+":"+monPort+" ("+monAet+")\nEt je veux parler à : "+serverIpAdress+":"+serverPort+" ("+serverAet+")\n\nImpossible d'utiliser le processus E-ECHO avec le serveur: "+add);
return false;
}
progressDialog.setValue(60);
//Construction et envoi d'une requete C-FIND, pour trouver les examens
FINDResponses findResponses;
OFList<QRResponse*> OFfindResponses;
DcmDataset req;
req.putAndInsertOFStringArray(DCM_QueryRetrieveLevel, "STUDY");
//CONSTRUCTION DE LA REQUETE
//Avec les numéro ID des series selectionnées
OFString OFNumeroIDStudy = numeroIDStudy;
req.putAndInsertOFStringArray(DCM_StudyInstanceUID, OFNumeroIDStudy);
T_ASC_PresentationContextID presID = findUncompressedPC(UID_FINDStudyRootQueryRetrieveInformationModel, scu);
presID = findUncompressedPC(UID_FINDStudyRootQueryRetrieveInformationModel, scuN);
if (presID == 0)
{//PROBLEME avec le contexte de présentation
QMessageBox::warning(0,"CONNEXION","TENTATIVE DE CONNEXION :\nJe suis : "+monIpAdress+":"+monPort+" ("+monAet+")\nEt je veux parler à : "+serverIpAdress+":"+serverPort+" ("+serverAet+")\n\nIl n'y a pas de contexte de présentation non compressé pour Study Root FIND");
return false;
}
progressDialog.setValue(70);
result = scu.sendFINDRequest(presID, &req, &findResponses);
result = scuN.sendFINDRequest(presID, &req, &OFfindResponses);
if (result.bad())
{//PROBLEME AVEC LE RESULTAT DE LA RECHERCHE, il n'y a pas de serie disponnible
QString add = result.text();
QMessageBox::warning(0,"CONNEXION","TENTATIVE DE CONNEXION :\nJe suis : "+monIpAdress+":"+monPort+" ("+monAet+")\nEt je veux parler à : "+serverIpAdress+":"+serverPort+" ("+serverAet+")\n\nIl n'y a pas de series disponnibles: "+add);
return false;
}
else
{ //La connexion est opérationnelle et il y a des series à récupérer
//QMessageBox::information(0,"CONNEXION","TENTATIVE DE CONNEXION :\nJe suis : "+monIpAdress+":"+monPort+" ("+monAet+")\nEt je veux parler à : "+serverIpAdress+":"+serverPort+" ("+serverAet+")\n\nIl y a des series disponnibles");
}
progressDialog.setValue(80);
//Construction et envoi d'une requete C-MOVE, pour tous les examens identifiés au dessus
presID = findUncompressedPC(UID_MOVEStudyRootQueryRetrieveInformationModel, scu);
presID = findUncompressedPC(UID_MOVEStudyRootQueryRetrieveInformationModel, scuN);
if (presID == 0)
{//PROBLEME avec le contexte de présentation
QMessageBox::warning(0,"CONNEXION","TENTATIVE DE CONNEXION :\nJe suis : "+monIpAdress+":"+monPort+" ("+monAet+")\nEt je veux parler à : "+serverIpAdress+":"+serverPort+" ("+serverAet+")\n\nIl n'y a pas de contexte de présentation non compressé pour Study Root MOVE");
return false;
}
progressDialog.setValue(90);
//OFListIterator(FINDResponse*) study = findResponses.begin();
OFListIterator(QRResponse*) study = OFfindResponses.begin();
Uint32 studyCount = 1;
OFBool failed = OFFalse;
while (study != OFfindResponses.end() && result.good())
{
// Pour chaque boucle en réponse, soit chaque examen, toutes les images seront récupérées
OFList<RetrieveResponse*> moveResponses;//MOVEResponses moveResponses;
if ( (*study)->m_dataset != NULL) //Il faut etre certain que ce n'est pas la derniere réponse, elle ne contient pas d'information
{
OFString studyInstanceUID;
result = (*study)->m_dataset->findAndGetOFStringArray(DCM_StudyInstanceUID, studyInstanceUID);
// only try to get study if we actually have study instance uid, otherwise skip it
if (result.good())
{
req.putAndInsertOFStringArray(DCM_StudyInstanceUID, studyInstanceUID);
// fetches all images of this particular study
OFString OFmonAet = monAet;
result = scuN.sendMOVERequest(presID, OFmonAet, &req, &moveResponses);
if (result.good())
{
QMessageBox::information(0,"CONNEXION","YES MA POULE");
studyCount++;
}
else
{
QString add = result.text();
QMessageBox::warning(0,"Recuperation depuis noeud DICOM","A) Problème : Impossible de récupérer l'examen distant : "+add);
return false;
}
}
else
{
QString add = result.text();
QMessageBox::warning(0,"Recuperation depuis noeud DICOM","B) Problème ; impossible de récupérer l'instance ID de l'examen récupéré sur le reseau : "+add);
return false;
}
}
else
{
QMessageBox::warning(0,"Recuperation depuis noeud DICOM","C) Problème : pionteur vers examen récupéré NULL");
return false;
}
study++;
}
if (result.bad())
{
QString add = result.text();
QMessageBox::warning(0,"CONNEXION","TENTATIVE DE CONNEXION :\nJe suis : "+monIpAdress+":"+monPort+" ("+monAet+")\nEt je veux parler à : "+serverIpAdress+":"+serverPort+" ("+serverAet+")\n\nImpossible de récupérer toutes les séries: "+add);
return false;
}
progressDialog.setValue(99);
// Release association
//scu.closeAssociation(DCMSCU_RELEASE_ASSOCIATION);
QMessageBox::warning(0,"Recuperation depuis noeud DICOM","FIN D'UNE RECUPERATION");
progressDialog.setValue(100);
//*/
//Fin de l'importation d'UN examen
}
//Fin de l'importation de tous les examens demandés
return true;
}
My question is simple yet how to retrieve images from PACS (for examens that I ask).
How STORESCP work? Do I need an object of type STORSCP??
相关推荐
3. **命令行工具**:DCMTK提供了一系列的命令行工具,如dcmdump用于查看DICOM文件内容,dcmsend用于发送DICOM数据,dcmscp作为DICOM接收器,以及dcmmkdir用于创建DICOM目录结构等。 4. **API接口**:DCMTK提供了C++...
10. **持续更新**:虽然这里讨论的是3.6.6版本,但DCMTK一直在发展,新的版本可能包含性能改进、新功能和对DICOM标准更新的支持。 总之,DCMTK是医疗图像处理领域的重要工具,提供了丰富的功能来操作和管理DICOM...
以下是对DCMTK库在Windows Qt环境中的编译和使用进行的详细阐述。 1. **DCMTK库介绍** DCMTK由多个模块组成,包括用于解析和创建DICOM数据集的dcmdata,用于网络传输的dcmnet,以及用于图像处理的dcmimgle等。它...
这个3.6.0版本的官方帮助文档是开发者和使用者理解DCMTK的重要资源,提供了详尽的函数、类和方法的说明。 DCMTK的核心功能包括: 1. **DICOM网络协议实现**:DCMTK提供了实现DICOM网络协议的工具,如dcmnet库,允许...
7. **dcmsend**和**dcmscp**:分别用于发送和接收DICOM对象,支持DICOM网络传输协议。 8. **dcmimgle**和**dcmimage**:处理DICOM图像的显示和转换,包括色彩空间转换和像素数据解码。 9. **ofstd**和**oflog**:...
DCMTK提供了丰富的API和工具,可以帮助开发者读取、写入、转换以及网络传输DICOM数据。 CMAKE则是一个跨平台的自动化构建系统,它不依赖特定的构建工具,如Make或Visual Studio,而是生成适合各种编译器和构建环境...
DCMTK(DICOM ToolKit)是一套开源的软件库,专门用于开发处理DICOM(Digital Imaging and Communications in Medicine)...同时,由于DCMTK是开源的,开发者还可以贡献代码或参与社区讨论,以解决特定问题或扩展功能。
调窗是指根据图像的灰度范围和对比度,调整显示的亮度和对比度,以便更好地观察图像的细节。在DCMTK中,这可以通过设置窗宽(Window Width)和窗位(Window Center)来实现。这两个参数决定了图像中哪些像素值将被...
dcmtk使用手册,医学领域的东东,有学习的可以下载看看,没学过,不知道好不好学
DCMTK(Digital Imaging and Communications in Medicine Toolkit)是一款开源的医学图像处理库,主要用于医疗影像数据的处理、传输和解析。这个压缩包提供的是已经针对Windows 10操作系统编译好的DCMTK工具集,意味...
DCMTK 新手使用指南 ...DCMTK 库提供了 DICOM 协议的实现和DICOM 文件处理功能,但需要配置好 DCMTK 工程文件和添加相应的库文件和头文件。同时,需要解决可能遇到的问题,以便顺利使用 DCMTK 库。
此外,为了在Win11系统上编译和使用DCMTK,你需要确保系统已安装了C++编译器和支持库,如OpenSSL,因为某些DCMTK功能可能依赖于它们。 总之,DCMTK 3.6.7是一个强大的 DICOM 库,为开发医疗影像应用提供了丰富的...
最后,使用CMake生成DCMTK的工程文件,并使用VC打开dcmtk.dsw文件,编译和调试DCMTK。 DCMTK提供了多种命令行调用方式,包括dcmdump、dcm2pnm等。dcmdump命令可以用来解析DICOM数据集,而dcm2pnm命令可以将DICOM...
DCMTK(DICOM Toolkit)是一套开源的软件库和工具集,专为处理DICOM(Digital Imaging and Communications in Medicine)标准而设计,广泛应用于医学图像通信、医学影像处理和医疗信息化系统中。在Linux系统上,...
【标题】"基于DCMTK的DICOM图像查看器"是一个专门为医学图像处理设计的应用程序,它利用了开源的DCMTK库来实现对DICOM格式图像的读取、显示和解析。DICOM(Digital Imaging and Communications in Medicine)是医疗...
6. `dcmsend` 和 `dcmscp`:分别是DICOM发送和接收服务的实现,用于在不同设备间传输DICOM数据。 7. `oflog` 和 `ofstd`:提供日志管理和通用的工具函数,支持DCMTK库的内部操作。 为了使用DCMTK 3.5.4的lib库,...
DCMTK提供了丰富的API和命令行工具,使得开发人员能够轻松地在自己的应用程序中集成DICOM功能。 DCMTK的核心组件包括以下几个部分: 1. **dcmdata**:这是DCMTK的基础模块,负责处理DICOM数据元素和数据集。它包含...
在实际开发过程中,利用VC++(Microsoft Visual C++)和DCMTK(DICOM Toolkit)库可以有效地实现DICOM图像的显示功能。DCMTK是一个开放源码的软件开发包,支持多种操作系统,广泛应用于医学影像领域的软件开发中。 ...
在编译DCMTK库之前,你需要确保你的系统已经安装了必要的依赖项,例如CMake构建系统,以及各种编译器和开发工具。在Linux系统中,通常需要安装gcc/g++,make,以及相应的开发库,如libxml2-dev和zlib1g-dev等。在...
在开发 DICOM 应用时,DCMTK 提供了详尽的文档和示例代码,帮助开发者理解DICOM协议的细节,例如如何创建和解析DICOM消息,如何处理网络传输,以及如何处理不同类型的DICOM对象(如图像、报告等)。此外,DCMTK支持...