1

基本的に、gdcm C++ ライブラリを使用して、DICOM ファイルからすべてまたはほとんどの属性値を読み取ろうとしています。文字列以外の値を取得するのに苦労しています。gdcm の例では、一般に、属性テンプレート クラスを使用できるようにグループ/要素番号を事前に知っていると想定していますが、属性テンプレート クラスを使用する必要も関心もありません。すべての属性名と値を報告する必要があるだけです。実際には、値は XML に入る必要があるため、文字列表現が必要です。私が現在持っているのは次のようなものです:

for (gdcm::DataSet::ConstIterator it = ds.Begin(); it!=ds.End(); ++it) {
    const gdcm::DataElement& elem = *it;
    if (elem.GetVR() != gdcm::VR::SQ) {
        const gdcm::Tag& tag = elem.GetTag();
        std::cout << dict.GetDictEntry(tag).GetKeyword() << ": ";
        std::cout << elem.GetValue() << "\n";
    }
}

UL のような数値の場合、出力は "Loaded:4" のようになります。これは、おそらくライブラリが 4 バイトのデータ (unsigned long) をロードしたことを意味します。これはまったく役に立ちません。実際の値を取得するにはどうすればよいですか? 私は確かに明らかな何かを見落としているに違いありません。

例から、それを行うことができるgdcm::StringFilterクラスがあるようですが、アルゴリズムの複雑さを二次的にするDICOMファイル内の各要素を単独で検索したいようです。これは確かに私がしたいことです避けるのが好きです。

ティア・パーヴォ

4

4 に答える 4

1

gdcmdumpを見たことがありますか?これを使用して、DICOMファイルをテキストまたはXMLとして出力できます。ソースを見て、これがどのように行われるかを確認することもできます。

于 2012-08-27T17:17:07.717 に答える
1

FAQ を読むことから始めることもできます。特に、属性値を文字列に変換するにはどうすればよいですか?

そこで説明されているように、単に gdcm:: StringFilterを使用する必要があります:

sf = gdcm.StringFilter()
sf.SetFile(r.GetFile())
print sf.ToStringPair(gdcm.Tag(0x0028,0x0010))
于 2013-12-31T12:25:25.907 に答える
0

次のようなことを試してください:

gdcm::リーダー リーダー;

reader.SetFileName( absSlicePath.c_str() );

if( !_reader.Read() )
{
    return;
} 

gdcm::File file = reader.GetFile();
gdcm::DataSet ds = file.GetDataSet();
std::stringstream strm;
strm << ds;

すべての DICOM タグ値を含む文字列ストリームを取得します。実際、ほとんどの DICOM クラス (DataElement、DataSet など) には、std::ostream & operator<< (std::ostream &_os, const *Some_Class* &_val) がオーバーロードされています。したがって、for ループを展開し、operator<< を使用して値を文字列ストリームに入れ、次に文字列に入れることができます。

たとえば、 QT を使用している場合:

ui->pTagsTxt->append(QString(strm.str().c_str()));

于 2013-07-15T11:19:20.160 に答える