1

我正在尝试使用 dcmtk 从 DICOM 图像中提取实例编号。代码如下所示:

DcmFileFormat fileformat;
    OFCondition status = fileformat.loadFile(src_path);
    if (status.good())
      {
        OFString instanceNumber=0;
        if (fileformat.getDataset()->findAndGetOFString(DCM_InstanceNumber, instanceNumber).good())
        {
            std::cout << "instance Number N: " << instanceNumber << std::endl;
            sprintf(instanceNum, "%s\n", instanceNumber);

            printf("%s\n", instanceNum);
        }
        else
            std::cerr << "Error: cannot access instance Number!" << std::endl;
       }
    else
        std::cerr << "Error: cannot read DICOM file (" << status.text() << ")" << std::endl;

现在我得到了实例号,但我想将实例号复制到一个字符或字符串中(以便进一步编程)。但是由于数字是一个 OFString,我如何将其转换为所需的数据类型。有什么想法吗?

4

3 回答 3

2

实际上,OFString 实现了 std::string 的一个子集,因此如果您想像其他人已经建议的那样获得“const char*”,则可以使用 c_str()。或者,您也可以编译定义了 HAVE_STD_STRING 的 DCMTK,并且 OFString 与 std::string 相同。

当然,所有这些也都在文档中进行了描述。

于 2016-02-03T11:25:03.020 回答
1

如果你愿意,你可以c_str()用来获取并基于它const char*创建一个。string

std::string s(instanceNumber.c_str());
于 2016-02-03T06:49:31.170 回答
1

您可以使用 dcmtk 通过 findAndGetXXX 方法直接读入请求的数据类型。在您的特定情况下,实例编号的 VR 是 IS,因此使用的方法是 findAndGetSint32。见:这里

应用于您的代码:

DcmFileFormat fileformat;
OFCondition status = fileformat.loadFile(src_path);
if (status.good())
  {
    SInt32 instanceNumber=0;
    if (fileformat.getDataset()->findAndGetSint32(DCM_InstanceNumber, &instanceNumber).good())
    {
        std::cout << "instance Number N: " << instanceNumber << std::endl;
        sprintf(instanceNum, "%d\n", instanceNumber);

        printf("%d\n", instanceNum);
    }
    else
        std::cerr << "Error: cannot access instance Number!" << std::endl;
   }
else
    std::cerr << "Error: cannot read DICOM file (" << status.text() << ")" << std::endl;

应该工作...

于 2016-02-03T07:47:26.327 回答