2

我正在开发一个快速DICOM viewer使用方法DCMTK library,我正在遵循此链接中提供的示例。

对于任何标签 ID,来自 的缓冲区API总是返回 null,例如: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”,实际名称为“PATIENT”。

片段 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。

4

2 回答 2

2

以下示例方法从 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
}
于 2017-09-04T12:42:58.457 回答
1

我已经用你的数据集尝试了你的代码。我刚刚将 QT 控制台类的输出替换为 std::cout。它对我有用 - 即它打印正确的患者姓名(例如 scan2.dcm 的“PATIENT2”)。一切似乎都是正确的,除了您显然想将数据集的所有权转移到智能指针。

要从 DcmFileFormat 获取 DcmDataset 的所有权,您必须调用 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?

于 2017-09-18T15:00:20.113 回答