示例#1
0
void VolumeSeriesSource::openSeries() {
    if(volumeHandle_)
        delete volumeHandle_;
    volumeHandle_ = 0;

    try {
        TextFileReader reader(filename_.get());
        if (!reader)
            throw tgt::FileNotFoundException("Reading sdat file failed", filename_.get());

        std::string type;
        std::istringstream args;
        std::string format, model;
        tgt::ivec3 resolution(0);
        tgt::vec3 sliceThickness(1.f);
        spreadMin_ = 0.f;
        spreadMax_ = 0.f;

        files_.clear();
        std::string blockfile;

        while (reader.getNextLine(type, args, false)) {
            if (type == "ObjectFileName:") {
                std::string s;
                args >> s;
                LDEBUG(type << " " << s);
                files_.push_back(tgt::FileSystem::dirName(filename_.get()) + "/" + s);
            } else if (type == "Resolution:") {
                args >> resolution[0];
                args >> resolution[1];
                args >> resolution[2];
                LDEBUG(type << " " << resolution[0] << " x " <<
                       resolution[1] << " x " << resolution[2]);
            } else if (type == "SliceThickness:") {
示例#2
0
// ------------------------------------------------------------------------
void groupDicomFiles(const gdcm::Directory::FilenamesType &filenames,
	   	SeriesTransform::Map &transforms)
{
	// set up the dicom scanner
	gdcm::Scanner scanner;
	gdcm::Tag seriesNumberTag(0x0020,0x0011);
	gdcm::Tag instanceTag(0x0020,0x0013);
	gdcm::Tag numberOfImagesTag(0x0018,0x1090);
	gdcm::Tag seriesDescription(0x0008,0x103e);
	gdcm::Tag sliceThickness(0x0018,0x0050);
	scanner.AddTag(seriesNumberTag);
	scanner.AddTag(sliceThickness);
	scanner.AddTag(seriesDescription);
	scanner.AddTag(instanceTag);
	scanner.AddTag(numberOfImagesTag);
	scanner.Scan(filenames);

	gdcm::Scanner::MappingType mapping = scanner.GetMappings();

	for(unsigned int i = 0; i < filenames.size(); i++)
	{
		const char * fname = filenames[i].c_str();

		// is the filename valid
		if(mapping.count(fname) > 0)
		{
			if(mapping[fname].count(seriesNumberTag) > 0 &&
					mapping[fname].count(instanceTag) > 0 &&
					mapping[fname].count(numberOfImagesTag) > 0)
			{

				// extract the dicom header information
				std::string seriesNumberStr, instanceNumberStr, 
					numberOfImagesStr, descriptionStr, thicknessStr;
				seriesNumberStr = mapping[fname][seriesNumberTag];
				instanceNumberStr = mapping[fname][instanceTag];
				numberOfImagesStr = mapping[fname][numberOfImagesTag];
				descriptionStr = mapping[fname][seriesDescription];
				thicknessStr = mapping[fname][sliceThickness];



				unsigned int seriesNum = QString::fromStdString(seriesNumberStr).toInt();
				unsigned int instanceNum = QString::fromStdString(instanceNumberStr).toInt();
				unsigned int numberOfImages = QString::fromStdString(numberOfImagesStr).toInt();
				double thickness = QString::fromStdString(thicknessStr).toDouble();

				descriptionStr = QString::fromStdString(descriptionStr).replace(" ","").toStdString();


				if(transforms.count(seriesNum) == 0) continue;

				// resize the image list if needed
				if(transforms[seriesNum].imageFilenames.size() != numberOfImages)
				{
					transforms[seriesNum].imageFilenames.resize(numberOfImages);
				}

				// put the image file into the image list
				transforms[seriesNum].description = descriptionStr;
				transforms[seriesNum].sliceThickness = thickness;
				transforms[seriesNum].imageFilenames[instanceNum-1] = fname;
			}	
		}
	}
}