我的程序,对于使用 DCMTK 3.6.4-2 的 Ubuntu 20 系统,读取一个 dicom 文件(系列)并从相应的标签中获取比例斜率,首先测试它们是否存在:
tmpfile.loadFile ( filename );
tmpdata = tmpfile.getDataset();
tmpdata -> findAndGetOFString ( DCM_RescaleSlope, tmpstring );
if ( !tmpstring.empty() ) {
mydcm.scl_slope = static_cast <float> ( stof ( std::string ( tmpstring.c_str() ) ) );
tmpdata -> findAndGetOFString ( DCM_RescaleIntercept, tmpstring );
mydcm.scl_inter = static_cast <float> ( stof ( std::string ( tmpstring.c_str() ) ) );
} else {
tmpdata -> findAndGetOFString ( DCM_RealWorldValueSlope, tmpstring );
mydcm.scl_slope = static_cast <float> ( stof ( std::string ( tmpstring.c_str() ) ) );
tmpdata -> findAndGetOFString ( DCM_RealWorldValueIntercept, tmpstring );
mydcm.scl_inter = static_cast <float> ( stof ( std::string ( tmpstring.c_str() ) ) );
}
在我使用的文件中,dcmdump 不会为DCM_RescaleSlope
标签返回任何内容,但它会为标签返回任何内容DCM_RealWorldValueSlope
:
dcmdump filename | grep RealWorld
(0040,9096) SQ (Sequence with undefined length #=1) # u/l, 1 RealWorldValueMappingSequence
(0040,9224) FD 0 # 8, 1 RealWorldValueIntercept
(0040,9225) FD 4.1318681318681323 # 8, 1 RealWorldValueSlope
当我使用
std::cout << getItemString ( tmpdata, DCM_RescaleSlope ) << std::endl;
std::cout << getItemString ( tmpdata, DCM_RealWorldValueSlope ) << std::endl;
std::cout << getItemString ( tmpdata, DCM_Modality ) << std::endl;
(getItemString
为方便起见,这里是一个函数)并使用调试器查看第二行中发生的情况,然后:
- 标签转换为
g = 64
,e = 37413
- 该行
OFStatus s = theCondition.theStatus;
设置为 false (这就是全部,除了theText = "Tag not found"
)
我不明白,因为(i)标签的值是程序已知的——否则它不会编译,(ii)标签在图像中,如图所示dcmdump
,(iii)其他标签处理正常:DCM_Modality
打印为MR
.
是我做错了什么,还是这些特殊标签需要特殊处理?
编辑
我从评论中尝试了一个建议:在测试中使用findAndGetFloat64
而不是,findAndGetOFString
double tmpdbl;
tmpdata -> findAndGetFloat64 ( DCM_RescaleSlope, tmpdbl );
std::cout << "A" << tmpdbl << std::endl;
tmpdata -> findAndGetFloat64 ( DCM_RealWorldValueSlope, tmpdbl );
std::cout << "B" << tmpdbl << std::endl;
tmpdata -> findAndGetFloat64 ( DCM_AcquisitionDuration, tmpdbl );
std::cout << "C" << tmpdbl << std::endl;
这导致
A0
B0
C297.6
theStatus
并且在读取行期间的错误B
仍然是相同的:theText = "Tag not found"
(我一直在使用字符串,因为到目前为止大多数双值标签都是DS
,感谢您让我意识到其中的区别!)