2017-09-04 5 views
1

Je développe un rapide DICOM viewer en utilisant DCMTK library et je suis l'exemple fourni en this link.findAndGetString() dans DCMTK renvoie null pour l'étiquette

Le tampon du API renvoie toujours la valeur null pour n'importe quel ID de tag, par exemple: DCM_PatientName. Mais le findAndGetOFString() API fonctionne bien mais renvoie uniquement le premier caractère de la balise dans ASCII, est-ce que cette API devrait fonctionner? Est-ce que quelqu'un peut me faire savoir pourquoi le tampon est vide l'ancienne API?

Également le DicomImage API également le même problème.

Snippet 1:

DcmFileFormat fileformat; 
OFCondition status = fileformat.loadFile(test_data_file_path.toStdString().c_str()); 
if (status.good()) 
{ 
    OFString patientName; 
    char* name; 
    if (fileformat.getDataset()->findAndGetOFString(DCM_PatientName, patientName).good()) 
    { 
     name = new char[patientName.length()]; 
     strcpy(name, patientName.c_str()); 
    } 
    else 
    { 
     qDebug() << "Error: cannot access Patient's Name!"; 
    } 
} 
else 
{ 
    qDebug() << "Error: cannot read DICOM file (" << status.text() << ")"; 
} 

Dans l'extrait ci-dessus name a la valeur ASCII "50" et le nom réel est "patient".

Snippet 2:

DcmFileFormat file_format; 
OFCondition status = file_format.loadFile(test_data_file_path.toStdString().c_str()); 
std::shared_ptr<DcmDataset> dataset(file_format.getDataset()); 
qDebug() << "\nInformation extracted from DICOM file: \n"; 
const char* buffer = nullptr; 
DcmTagKey key = DCM_PatientName; 
dataset->findAndGetString(key,buffer); 
std::string tag_value = buffer; 
qDebug() << "Patient name: " << tag_value.c_str(); 

Dans l'extrait ci-dessus, le tampon est nulle. Il ne lit pas le nom.

REMARQUE:

Ceci est seulement un échantillon. Je suis juste en train de jouer autour des API pour apprendre le but .

+0

nom = nouveau caractère [nomPoste.longueur()]; devrait être name = new char [patientName.length() + 1]; pour inclure le terminateur null. Les chances sont que le débogueur montre juste le premier caractère de la chaîne. Essayez qDebug() << nom –

+0

Pas de chance. Impressions 50.J'ai également reçu cet avertissement "W: DcmMetaInfo: longueur de groupe d'en-tête d'informations méta a une valeur incorrecte" mais le fichier .dcm s'ouvre correctement dans un outil existant. –

+0

@kaviergeoffrey si le fichier est anonymisé pouvez-vous le partager? –

Répondre

1

La méthode exemple suivant lit le nom du patient d'un objet DcmDataset:

std::string getPatientName(DcmDataset& dataset) 
{ 
    // Get the tag's value in ofstring 
    OFString ofstring; 
    OFCondition condition = dataset.findAndGetOFString(DCM_PatientName, ofstring); 
    if(condition.good()) 
    { 
     // Tag found. Put it in a std::string and return it 
     return std::string(ofstring.c_str()); 
    } 

    // Tag not found 
    return ""; // or throw if you need the tag 
} 
+0

Ce code retourne seulement "50" ASCII pour la lettre P de PATIENT qui est dans le tag de nom ... –

+0

Commentaire mineur: La conversion d'une instance OFString en une instance de std :: string n'est pas nécessaire lorsque le DCMTK est compilé avec STL activé depuis OFString est alors juste un autre nom pour std :: string. –

+0

@XavierGeoffrey: Alors je soupçonne que l'ensemble de données est codé dans un jeu de caractères auquel on ne s'attend pas ici. Quelle est la valeur d'attribut de (0008,0005) jeu de caractères spécifiques? –

1

J'ai essayé votre code avec vos jeux de données. Je viens de remplacer la sortie sur les classes de la console QT par std :: cout. Cela fonctionne pour moi - c'est-à-dire qu'il imprime le nom correct du patient (par exemple "PATIENT2" pour scan2.dcm). Tout semble correct, sauf le fait que vous voulez apparemment transférer la propriété de l'ensemble de données à un pointeur intelligent.

Pour obtenir la propriété de DcmDataset à partir de DcmFileFormat, vous devez appeler getAndRemoveDataset() au lieu de getDataset(). Cependant, je ne pense pas que votre problème soit lié à cela. Vous pouvez essayer mon extrait modifié:

DcmFileFormat file_format; 
OFCondition status = file_format.loadFile("d:\\temp\\StackOverflow\\scan2.dcm"); 
std::shared_ptr<DcmDataset> dataset(file_format.getAndRemoveDataset()); 
std::cout << "\nInformation extracted from DICOM file: \n"; 
const char* buffer = nullptr; 
DcmTagKey key = DCM_PatientName; 
dataset->findAndGetString(key, buffer); 
std::string tag_value = buffer; 
std::cout << "Patient name: " << tag_value.c_str(); 

Il vous aide sans doute de savoir que votre code et les méthodes de dcmtk que vous utilisez sont corrects, mais cela ne résout pas votre problème. Une autre chose que je recommande est de vérifier le résultat retourné par file_format.loadFile(). Peut-être qu'il y a une surprise là-dedans.

Je ne sais pas si je peux vous aider davantage, mais ma prochaine étape consistera à vérifier votre environnement de construction, par ex. les options que vous utilisez pour construire dcmtk. Utilisez-vous CMake pour construire dcmtk?

+0

merci :) va le vérifier bientôt et vous faire savoir ... –