To be able to parse a very large dataset of DICOM images, where I would be able to query and find a PET scan matching a certain RT treatment scan, I would like to parse certain dicom tags (about 30, only top level) into an SQL database. As my understanding of DCMTK does not reach that far yet, I wrote a function like this:
Code: Select all
int ParseDicom(const char *filename, std::map<DcmTagKey, std::string> &dicom_metadata) {
DcmFileFormat file_format;
OFCondition status = file_format.loadFile(filename);
if (status.bad()) {
return 1;
}
DcmDataset *dataset = file_format.getDataset();
for (const auto &dicom_tag_group : dicom_tags) {
for (const auto &dicom_tag : dicom_tag_group) {
OFCondition condition;
OFString value;
condition = dataset->findAndGetOFStringArray(dicom_tag, value);
if (condition.good()) {
dicom_metadata[dicom_tag] = value.c_str();
} else {
dicom_metadata[dicom_tag] = "";
}
}
}
return 0;
}
Code: Select all
OFCondition status = file_format.loadFile(filename);
if (status.bad()) {
return 1;
}
DcmDataset *dataset = file_format.getDataset();
DcmStack stack;
DcmObject *dobject = NULL;
DcmElement *delem = NULL;
status = dataset->nextObject(stack, OFTrue);
while (status.good())
{
dobject = stack.top();
delem = (DcmElement *)dobject;
DcmTagKey current_tag = delem->getTag();
// Do something useful, check if the tag is in a list of wanted tags
if(current_tag == DCM_PixelData)
{
std::cout << "Reached PixelData. End." << std::endl;
break;
}
status = dataset->nextObject(stack, OFTrue);
}
Best,
Jonas