2017-09-04 7 views
1

DCMTK libraryを使用してDICOM viewerを素早く開発しており、this linkで提供されている例に従っています。DCMTKのfindAndGetString()は、タグのnullを返します

APIのバッファは、常にタグIDにNULLを返します。たとえば、DCM_PatientNameです。 findAndGetOFString() APIは正常に動作しますが、ASCIIというタグの最初の文字のみを返します。このAPIはどのように動作するのでしょうか?

誰かが、以前のAPIのバッファが空である理由を教えてもらえますか?

また、DicomImage APIも同じ問題です。

スニペット1:上記のスニペットname

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

は、 "50" のASCII値を有し、実際の名前は、 "患者" です。

スニペット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の周りを遊んでいます。

+0

名前=新しいchar [patientName.length()];名前=新しいchar [patientName.length()+ 1]である必要があります。ヌルターミネータを含める。デバッガが文字列の最初の文字だけを表示している可能性があります。試してくださいqDebug()<< name –

+0

いいえ運がいいです。 50を印刷します。私はまた、この警告 "W:DcmMetaInfo:メタ情報ヘッダーのグループ長が間違った値を持っていますが、.dcmファイルが既存のツールでうまく開きます。 –

+0

@kaviergeoffreyファイルを匿名化すると共有できますか? –

答えて

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 
} 
+0

このコードは、名前タグにあるPATIENTの文字Pにちょうど "50"のASCIIを返します。 –

+0

マイナーコメント:OFStringからDCMTKをコンパイルしたときにOFStringインスタンスをstd :: stringインスタンスに変換する必要はありませんstd :: stringの別名です。 –

+0

@XavierGeoffrey:データセットは、ここでは期待しない文字セットでエンコードされていると思われます。 (0008,0005)特定キャラクタセットの属性値は何ですか? –

1

私はあなたのデータセットを使用してコードを試してみました。 QTコンソールクラスの出力をstd :: coutに置き換えました。それは私のために働きます。つまり、正しい患者名を表示します(例えば、scan2.dcmの場合は「PATIENT2」)。あなたが明らかにデータセットの所有権をスマートポインタに転送したいという事実を除いて、すべて正しいようです。

DcmDatasetの所有権をDcmFileFormatから取得するには、getDataset()の代わりにgetAndRemoveDataset()を呼び出す必要があります。しかし、私はあなたの問題がそれに関連しているとは思わない。

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をビルドしていますか?

+0

おかげですぐにそれをチェックしてお知らせします... –

関連する問題