findAndGetString () в DCMTK возвращает нуль для тега

Я быстро развиваюсь DICOM viewer с помощью DCMTK library и я следую примеру, приведенному в эта ссылка.

Буфер из API всегда возвращает ноль для любого идентификатора тега, например: DCM_PatientName,
Но findAndGetOFString() API работает нормально, но возвращает только первый символ тега в ASCIIэто как этот API должен работать?

Может кто-нибудь сообщить мне, почему в буфере пусто прежнее API?

Так же DicomImage API также та же проблема.

Фрагмент 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() << ")";
}

В приведенном фрагменте name имеет значение ASCII «50», а фактическое имя — «ПАЦИЕНТ».

Фрагмент 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();

В приведенном выше фрагменте буфер пуст. Это не читает имя.

НОТА:

Это всего лишь образец. Я просто играю по API для обучения
цель.

1

Решение

Следующий пример метода считывает имя пациента из объекта 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
}
1

Другие решения

Я пробовал ваш код с вашими наборами данных. Я просто заменил вывод на классы консоли QT на std :: cout. Это работает для меня — то есть печатает правильное имя пациента (например, «PATIENT2» для scan2.dcm). Все кажется правильным, за исключением того факта, что вы, очевидно, хотите передать владение набором данных интеллектуальному указателю.

Чтобы получить владение DcmDataset из DcmFileFormat, вы должны вызвать getAndRemoveDataset () вместо getDataset (). Тем не менее, я не думаю, что ваша проблема связана с этим. Вы можете попробовать мой модифицированный фрагмент:

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();

Это, вероятно, поможет вам узнать, что ваш код и используемые вами методы dcmtk верны, но это не решит вашу проблему. Еще я бы порекомендовал проверить результат, возвращаемый file_format.loadFile (). Может быть, там есть сюрприз.

Не уверен, смогу ли я вам чем-нибудь помочь, но моим следующим шагом будет проверка вашей среды сборки, например, параметры, которые вы используете для сборки dcmtk. Используете ли вы CMake для сборки dcmtk?

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector