⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 readerwriterdicom.cpp

📁 最新osg包
💻 CPP
📖 第 1 页 / 共 2 页
字号:
            }            osg::ref_ptr<osg::RefMatrix> matrix = new osg::RefMatrix;            osg::ref_ptr<osg::Image> image;            unsigned int imageNum = 0;            EP_Representation pixelRep;            unsigned int numPlanes = 0;            GLenum pixelFormat = 0;            GLenum dataType = 0;            unsigned int pixelSize = 0;            bool invertOrigiantion = false;                        typedef std::list<FileInfo> FileInfoList;            FileInfoList fileInfoList;            typedef std::map<double, FileInfo> DistanceFileInfoMap;            typedef std::map<osg::Vec3d, DistanceFileInfoMap> OrientationFileInfoMap;            OrientationFileInfoMap orientationFileInfoMap;                        unsigned int totalNumSlices = 0;            for(Files::iterator itr = files.begin();                itr != files.end();                ++itr)            {                DcmFileFormat fileformat;                OFCondition status = fileformat.loadFile((*itr).c_str());                if(!status.good()) return ReadResult::ERROR_IN_READING_FILE;                                FileInfo fileInfo;                fileInfo.filename = *itr;                double pixelSize_y = 1.0;                double pixelSize_x = 1.0;                double sliceThickness = 1.0;                double imagePositionPatient[3] = {0, 0, 0};	        double imageOrientationPatient[6] = {1.0, 0.0, 0.0, 0.0, 1.0, 0.0 };                Uint16 numOfSlices = 1;                                double value = 0.0;                if (fileformat.getDataset()->findAndGetFloat64(DCM_PixelSpacing, value,0).good())                {                    pixelSize_y = value;                    fileInfo.matrix(1,1) = pixelSize_y;                }                if (fileformat.getDataset()->findAndGetFloat64(DCM_PixelSpacing, value,1).good())                {                    pixelSize_x = value;                    fileInfo.matrix(0,0) = pixelSize_x;                }                // Get slice thickness                if (fileformat.getDataset()->findAndGetFloat64(DCM_SliceThickness, value).good())                {                    sliceThickness = value;                    notice()<<"sliceThickness = "<<sliceThickness<<std::endl;                    fileInfo.sliceThickness = sliceThickness;                }                    notice()<<"tagExistsWithValue(DCM_NumberOfFrames)="<<fileformat.getDataset()->tagExistsWithValue(DCM_NumberOfFrames)<<std::endl;                notice()<<"tagExistsWithValue(DCM_NumberOfSlices)="<<fileformat.getDataset()->tagExistsWithValue(DCM_NumberOfSlices)<<std::endl;                Uint32 numFrames;                if (fileformat.getDataset()->findAndGetUint32(DCM_NumberOfFrames, numFrames).good())                {                    fileInfo.numSlices = numFrames;                    notice()<<"Read number of frames = "<<numFrames<<std::endl;                }                                OFString numFramesStr;                if (fileformat.getDataset()->findAndGetOFString(DCM_NumberOfFrames, numFramesStr).good())                {                    fileInfo.numSlices = atoi(numFramesStr.c_str());                    notice()<<"Read number of frames = "<<numFramesStr<<std::endl;                }                if (fileformat.getDataset()->findAndGetUint16(DCM_NumberOfFrames, numOfSlices).good())                {                    fileInfo.numSlices = numOfSlices;                    notice()<<"Read number of frames = "<<numOfSlices<<std::endl;                }                                if (fileformat.getDataset()->findAndGetUint16(DCM_NumberOfSlices, numOfSlices).good())                {                    fileInfo.numSlices = numOfSlices;                    notice()<<"Read number of slices = "<<numOfSlices<<std::endl;                }                // patient position                for(int i=0; i<3; ++i)                {		    if (fileformat.getDataset()->findAndGetFloat64(DCM_ImagePositionPatient, imagePositionPatient[i],i).good())                    {                        notice()<<"Read DCM_ImagePositionPatient["<<i<<"], "<<imagePositionPatient[i]<<std::endl;                    }                    else                    {                        notice()<<"Have not read DCM_ImagePositionPatient["<<i<<"]"<<std::endl;                    }                }                //notice()<<"imagePositionPatient[2]="<<imagePositionPatient[2]<<std::endl;                                fileInfo.matrix.setTrans(imagePositionPatient[0],imagePositionPatient[1],imagePositionPatient[2]);                for(int i=0; i<6; ++i)                {                    double value = 0.0;		    if (fileformat.getDataset()->findAndGetFloat64(DCM_ImageOrientationPatient, value,i).good())                    {                        imageOrientationPatient[i] = value;                        notice()<<"Read imageOrientationPatient["<<i<<"], "<<imageOrientationPatient[i]<<std::endl;                    }                    else                    {                        notice()<<"Have not read imageOrientationPatient["<<i<<"]"<<std::endl;                    }                }                osg::Vec3d dirX(imageOrientationPatient[0],imageOrientationPatient[1],imageOrientationPatient[2]);                osg::Vec3d dirY(imageOrientationPatient[3],imageOrientationPatient[4],imageOrientationPatient[5]);                osg::Vec3d dirZ = dirX ^ dirY;                dirZ.normalize();                                dirX *= pixelSize_x;                dirY *= pixelSize_y;                                fileInfo.matrix(0,0) = dirX[0];                fileInfo.matrix(1,0) = dirX[1];                fileInfo.matrix(2,0) = dirX[2];                                fileInfo.matrix(0,1) = dirY[0];                fileInfo.matrix(1,1) = dirY[1];                fileInfo.matrix(2,1) = dirY[2];                                fileInfo.matrix(0,2) = dirZ[0];                fileInfo.matrix(1,2) = dirZ[1];                fileInfo.matrix(2,2) = dirZ[2];                                fileInfo.distance = dirZ * (osg::Vec3d(0.0,0.0,0.0)*fileInfo.matrix);                notice()<<"dirX = "<<dirX<<std::endl;                notice()<<"dirY = "<<dirY<<std::endl;                notice()<<"dirZ = "<<dirZ<<std::endl;                notice()<<"matrix = "<<fileInfo.matrix<<std::endl;                notice()<<"pos = "<<osg::Vec3d(0.0,0.0,0.0)*fileInfo.matrix<<std::endl;                notice()<<"dist = "<<fileInfo.distance<<std::endl;                notice()<<std::endl;                (orientationFileInfoMap[dirZ])[fileInfo.distance] = fileInfo;                totalNumSlices += fileInfo.numSlices;            }            if (orientationFileInfoMap.empty()) return 0;                        typedef std::map<double, FileInfo> DistanceFileInfoMap;            typedef std::map<osg::Vec3d, DistanceFileInfoMap> OrientationFileInfoMap;            for(OrientationFileInfoMap::iterator itr = orientationFileInfoMap.begin();                itr != orientationFileInfoMap.end();                ++itr)            {                notice()<<"Orientation = "<<itr->first<<std::endl;                DistanceFileInfoMap& dfim = itr->second;                for(DistanceFileInfoMap::iterator ditr = dfim.begin();                    ditr != dfim.end();                    ++ditr)                {                    FileInfo& fileInfo = ditr->second;                    notice()<<"   d = "<<fileInfo.distance<<" "<<fileInfo.filename<<std::endl;                }            }                        DistanceFileInfoMap& dfim = orientationFileInfoMap.begin()->second;            if (dfim.empty()) return 0;            double totalDistance = 0.0;            if (dfim.size()>1)            {                totalDistance = fabs(dfim.rbegin()->first - dfim.begin()->first);            }            else            {                totalDistance = dfim.begin()->second.sliceThickness * double(dfim.begin()->second.numSlices);            }                        notice()<<"Total Distance including ends "<<totalDistance<<std::endl;            double averageThickness = totalNumSlices<=1 ? 1.0 : totalDistance / double(totalNumSlices-1);                        notice()<<"Average thickness "<<averageThickness<<std::endl;            for(DistanceFileInfoMap::iterator ditr = dfim.begin();                ditr != dfim.end();                ++ditr)            {                FileInfo& fileInfo = ditr->second;                                std::auto_ptr<DicomImage> dcmImage(new DicomImage(fileInfo.filename.c_str()));                if (dcmImage.get())                {                    if (dcmImage->getStatus()==EIS_Normal)                    {                        // get the pixel data                        const DiPixel* pixelData = dcmImage->getInterData();                        if(!pixelData)                         {                            warning()<<"Error: no data in DicomImage object."<<std::endl;                            return ReadResult::ERROR_IN_READING_FILE;                        }                                                osg::ref_ptr<osg::Image> imageAdapter = new osg::Image;                                                EP_Representation curr_pixelRep;                        unsigned int curr_numPlanes;                        GLenum curr_pixelFormat;                        GLenum curr_dataType;                        unsigned int curr_pixelSize;                        // create the new image                        convertPixelTypes(pixelData,                                          curr_pixelRep, curr_numPlanes,                                           curr_dataType, curr_pixelFormat, curr_pixelSize);                        imageAdapter->setImage(dcmImage->getWidth(), dcmImage->getHeight(), dcmImage->getFrameCount(),                                              curr_pixelFormat,                                              curr_pixelFormat,                                              curr_dataType,                                              (unsigned char*)(pixelData->getData()),                                              osg::Image::NO_DELETE);                        if (!image)                        {                            pixelRep = curr_pixelRep;                            numPlanes = curr_numPlanes;                            dataType = curr_dataType;                            pixelFormat = curr_pixelFormat;                            pixelSize = curr_pixelSize;                            (*matrix)(0,0) = fileInfo.matrix(0,0);                            (*matrix)(1,0) = fileInfo.matrix(1,0);                            (*matrix)(2,0) = fileInfo.matrix(2,0);                            (*matrix)(0,1) = fileInfo.matrix(0,1);                            (*matrix)(1,1) = fileInfo.matrix(1,1);                            (*matrix)(2,1) = fileInfo.matrix(2,1);                            (*matrix)(0,2) = fileInfo.matrix(0,2) * averageThickness;                            (*matrix)(1,2) = fileInfo.matrix(1,2) * averageThickness;                            (*matrix)(2,2) = fileInfo.matrix(2,2) * averageThickness;                                                        image = new osg::Image;                            image->setUserData(matrix.get());                            image->setFileName(fileName.c_str());                            image->allocateImage(dcmImage->getWidth(), dcmImage->getHeight(), totalNumSlices,                                                  pixelFormat, dataType);                                                                                                                              notice()<<"Image dimensions = "<<image->s()<<", "<<image->t()<<", "<<image->r()<<" pixelFormat=0x"<<std::hex<<pixelFormat<<" dataType=0x"<<std::hex<<dataType<<std::endl;                        }                        else if (pixelData->getPlanes()>numPlanes || pixelData->getRepresentation()>pixelRep)                        {                            notice()<<"Need to reallocated "<<image->s()<<", "<<image->t()<<", "<<image->r()<<std::endl;                                                        // record the previous image settings to use when we copy back the content.                            osg::ref_ptr<osg::Image> previous_image = image;                            // create the new image                            convertPixelTypes(pixelData,                                              pixelRep, numPlanes,                                               dataType, pixelFormat, pixelSize);                                                                          image = new osg::Image;                            image->setUserData(previous_image->getUserData());                            image->setFileName(fileName.c_str());                            image->allocateImage(dcmImage->getWidth(), dcmImage->getHeight(), totalNumSlices,                                                  pixelFormat, dataType);                                                                             osgVolume::copyImage(previous_image.get(), 0,0,0, previous_image->s(), previous_image->t(), imageNum,                                                 image.get(), 0, 0, 0,                                                                                                  false);                                                    }                                                osgVolume::copyImage(imageAdapter.get(), 0,0,0, imageAdapter->s(), imageAdapter->t(), imageAdapter->r(),                                              image.get(), 0, 0, imageNum,                                             false);                                                                     imageNum += dcmImage->getFrameCount();                    }                    else                    {                        warning()<<"Error in reading dicom file "<<fileName.c_str()<<", error = "<<DicomImage::getString(dcmImage->getStatus())<<std::endl;                    }                }            }                        if (!image)            {                return ReadResult::ERROR_IN_READING_FILE;            }            notice()<<"Spacing = "<<*matrix<<std::endl;                        return image.get();        }#endif        struct FileInfo        {            FileInfo():                numX(0),                numY(0),                numSlices(1),                sliceThickness(0.0),                distance(0.0) {}            FileInfo(const FileInfo& rhs):                filename(rhs.filename),                matrix(rhs.matrix),                numX(rhs.numX),                numY(rhs.numY),                numSlices(rhs.numSlices),                sliceThickness(rhs.sliceThickness),                distance(distance) {}            FileInfo& operator = (const FileInfo& rhs)            {                if (&rhs == this) return *this;                                filename = rhs.filename;                matrix = rhs.matrix;                numX = rhs.numX;                numY = rhs.numY;                sliceThickness = rhs.sliceThickness;                numSlices = rhs.numSlices;                distance = rhs.distance;            }            std::string     filename;            osg::Matrixd    matrix;            unsigned int    numX;            unsigned int    numY;            unsigned int    numSlices;            double          sliceThickness;            double          distance;        };};// now register with Registry to instantiate the above// reader/writer.REGISTER_OSGPLUGIN(dicom, ReaderWriterDICOM)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -