diff --git a/Modules/ToFHardware/mitkToFCameraMITKPlayerController.cpp b/Modules/ToFHardware/mitkToFCameraMITKPlayerController.cpp index d474c669de..55c574ecc7 100644 --- a/Modules/ToFHardware/mitkToFCameraMITKPlayerController.cpp +++ b/Modules/ToFHardware/mitkToFCameraMITKPlayerController.cpp @@ -1,373 +1,329 @@ /*========================================================================= Program: Medical Imaging & Interaction Toolkit Module: $RCSfile$ Language: C++ Date: $Date: 2010-05-27 16:06:53 +0200 (Do, 27 Mai 2010) $ Version: $Revision: $ Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. See MITKCopyright.txt or http://www.mitk.org/copyright.html for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notices for more information. =========================================================================*/ #include #include // mitk includes #include "mitkItkImageFileReader.h" #include "mitkPicFileReader.h" #include namespace mitk { ToFCameraMITKPlayerController::ToFCameraMITKPlayerController():m_PixelNumber(0),m_NumberOfBytes(0), m_CaptureWidth(0),m_CaptureHeight(0),m_ConnectionCheck(false),m_InputFileName(""), m_ToFImageType(ToFImageType3D), m_IntensityArray(NULL),m_DistanceArray(NULL),m_AmplitudeArray(NULL), m_DistanceImageFileName(""),m_AmplitudeImageFileName(""),m_IntensityImageFileName(""), m_Extension(""), m_CurrentFrame(-1),m_NumOfFrames(0), m_DistanceImage(0), m_AmplitudeImage(0),m_IntensityImage(0), m_PixelStartInFile(0), m_DistanceInfile(NULL),m_AmplitudeInfile(NULL),m_IntensityInfile(NULL) { m_ImageStatus = std::vector(3,true); } ToFCameraMITKPlayerController::~ToFCameraMITKPlayerController() { this->CleanUp(); } void ToFCameraMITKPlayerController::CleanUp() { if(m_DistanceImage.IsNotNull()) { m_DistanceImage->ReleaseData(); m_DistanceImage = NULL; } if(m_AmplitudeImage.IsNotNull()) { m_AmplitudeImage->ReleaseData(); m_AmplitudeImage = NULL; } if(m_IntensityImage.IsNotNull()) { m_IntensityImage->ReleaseData(); m_IntensityImage = NULL; } delete[] this->m_DistanceArray; this->m_DistanceArray = NULL; delete[] this->m_AmplitudeArray; this->m_AmplitudeArray = NULL; delete[] this->m_IntensityArray; this->m_IntensityArray = NULL; } bool ToFCameraMITKPlayerController::CheckCurrentFileType() { if(!this->m_DistanceImageFileName.empty()) { if(ItkImageFileReader::CanReadFile(m_DistanceImageFileName,"",".nrrd")) { m_Extension = ".nrrd"; return true; } else if (PicFileReader::CanReadFile(m_DistanceImageFileName,"",".pic")) { m_Extension = ".pic"; return true; } } if(!this->m_AmplitudeImageFileName.empty()) { if(ItkImageFileReader::CanReadFile(m_AmplitudeImageFileName,"",".nrrd")) { m_Extension = ".nrrd"; return true; } else if (PicFileReader::CanReadFile(m_AmplitudeImageFileName,"",".pic")) { m_Extension = ".pic"; return true; } } if(!this->m_IntensityImageFileName.empty()) { if(ItkImageFileReader::CanReadFile(m_IntensityImageFileName,"",".nrrd")) { m_Extension = ".nrrd"; return true; } else if (PicFileReader::CanReadFile(m_IntensityImageFileName,"",".pic")) { m_Extension = ".pic"; return true; } } return false; } bool ToFCameraMITKPlayerController::OpenCameraConnection() { if(!this->m_ConnectionCheck) { try { // Check for file type, only .nrrd and .pic files are supported! if( this->CheckCurrentFileType()) { if(m_Extension == ".nrrd") { this->OpenNrrdImageFile(this->m_DistanceImageFileName, m_DistanceImage); this->OpenNrrdImageFile(this->m_AmplitudeImageFileName, m_AmplitudeImage); this->OpenNrrdImageFile(this->m_IntensityImageFileName, m_IntensityImage); } else if(m_Extension == ".pic") { this->OpenPicImageFile(this->m_DistanceImageFileName, m_DistanceImage); this->OpenPicImageFile(this->m_AmplitudeImageFileName, m_AmplitudeImage); this->OpenPicImageFile(this->m_IntensityImageFileName, m_IntensityImage); } } else { throw std::logic_error("Please check image type, currently only .nrrd files are supported (.pic files are deprecated!)"); } // check if the opened files contained data if(m_DistanceImage.IsNull()) { m_ImageStatus.at(0) = false; } if(m_AmplitudeImage.IsNull()) { m_ImageStatus.at(1) = false; } if(m_IntensityImage.IsNull()) { m_ImageStatus.at(2) = false; } // Check for dimension type mitk::Image::Pointer infoImage = NULL; if(m_ImageStatus.at(0)) { infoImage = m_DistanceImage; } else if (m_ImageStatus.at(1)) { infoImage = m_AmplitudeImage; } else if(m_ImageStatus.at(2)) { infoImage = m_IntensityImage; } if (infoImage->GetDimension() == 2) this->m_ToFImageType = ToFImageType2DPlusT; else if (infoImage->GetDimension() == 3) this->m_ToFImageType = ToFImageType3D; else if (infoImage->GetDimension() == 4) this->m_ToFImageType = ToFImageType2DPlusT; else throw std::logic_error("Error opening ToF data file: Invalid dimension."); this->m_CaptureWidth = infoImage->GetDimension(0); this->m_CaptureHeight = infoImage->GetDimension(1); this->m_PixelNumber = this->m_CaptureWidth*this->m_CaptureHeight; this->m_NumberOfBytes = this->m_PixelNumber * sizeof(float); if (this->m_ToFImageType == ToFImageType2DPlusT) { this->m_NumOfFrames = infoImage->GetDimension(3); } else { this->m_NumOfFrames = infoImage->GetDimension(2); } // allocate buffer this->m_DistanceArray = new float[this->m_PixelNumber]; for(int i=0; im_PixelNumber; i++) {this->m_DistanceArray[i]=0.0;} this->m_AmplitudeArray = new float[this->m_PixelNumber]; for(int i=0; im_PixelNumber; i++) {this->m_AmplitudeArray[i]=0.0;} this->m_IntensityArray = new float[this->m_PixelNumber]; for(int i=0; im_PixelNumber; i++) {this->m_IntensityArray[i]=0.0;} - // mitkIpPicDescriptor* pic = NULL; - // mitkIpPicDescriptor* info = NULL; - - // pic = mitkIpPicGetHeader(const_cast(this->m_DistanceImageFileName.c_str()), pic); - // if (pic==NULL) - // { - // MITK_ERROR << "Error opening ToF data file " << this->m_InputFileName; - // return false; - // } - // info = mitkIpPicGetTags(const_cast(this->m_DistanceImageFileName.c_str()), pic); - // this->m_PixelStartInFile = info->info->pixel_start_in_file; - - // OpenPicFileToData(&(this->m_DistanceInfile), this->m_DistanceImageFileName.c_str()); - // OpenPicFileToData(&(this->m_AmplitudeInfile), this->m_AmplitudeImageFileName.c_str()); - // OpenPicFileToData(&(this->m_IntensityInfile), this->m_IntensityImageFileName.c_str()); - MITK_INFO << "NumOfFrames: " << this->m_NumOfFrames; this->m_ConnectionCheck = true; return this->m_ConnectionCheck; } catch(std::exception& e) { MITK_ERROR << "Error opening ToF data file " << this->m_InputFileName << " " << e.what(); throw std::logic_error("Error opening ToF data file"); return false; } } else return this->m_ConnectionCheck; } void ToFCameraMITKPlayerController::OpenNrrdImageFile( const std::string outfileName, Image::Pointer &image) { if(!outfileName.empty()) { if(image.IsNotNull()) { image->ReleaseData(); image = NULL; } ItkImageFileReader::Pointer nrrdReader = ItkImageFileReader::New(); nrrdReader->SetFileName(outfileName); nrrdReader->Update(); image = nrrdReader->GetOutput()->Clone(); } else { MITK_ERROR << "Error opening ToF data file " << outfileName; } } void ToFCameraMITKPlayerController::OpenPicImageFile( const std::string outfileName, Image::Pointer &image) { if(!outfileName.empty()) { if(image.IsNotNull()) { image->ReleaseData(); image = NULL; } PicFileReader::Pointer picReader = PicFileReader::New(); picReader->SetFileName(outfileName); picReader->Update(); image = picReader->GetOutput()->Clone(); } else { MITK_ERROR << "Error opening ToF data file " << outfileName; } } - //void ToFCameraMITKPlayerController::OpenPicFileToData(FILE** outfile, const char *outfileName) - //{ - // (*outfile) = fopen( outfileName, "rb" ); - // if( (*outfile) == NULL ) - // { - // MITK_ERROR << "Error opening ToF data file: file is empty" << outfileName; - // throw std::logic_error("Error opening ToF data file: file is empty"); - // return; - // } - // fseek ( (*outfile), this->m_PixelStartInFile, SEEK_SET ); - //} - bool ToFCameraMITKPlayerController::CloseCameraConnection() { if (this->m_ConnectionCheck) { this->CleanUp(); this->m_ConnectionCheck = false; return true; } return false; } void ToFCameraMITKPlayerController::UpdateCamera() { this->m_CurrentFrame++; if(this->m_CurrentFrame >= this->m_NumOfFrames) { this->m_CurrentFrame = 0; } if(this->m_ImageStatus.at(0)) { this->AccessData(this->m_CurrentFrame, this->m_DistanceImage, this->m_DistanceArray); } if(this->m_ImageStatus.at(1)) { this->AccessData(this->m_CurrentFrame, this->m_AmplitudeImage, this->m_AmplitudeArray); } if(this->m_ImageStatus.at(2)) { this->AccessData(this->m_CurrentFrame, this->m_IntensityImage, this->m_IntensityArray); } itksys::SystemTools::Delay(50); - - //size_t distanceBytesReturn; - //size_t amplitudeBytesReturn; - //size_t intensityBytesReturn; - - //this->m_CurrentFrame++; - //if (this->m_CurrentFrame >= this->m_NumOfFrames) - //{ - // - // fseek ( this->m_DistanceInfile, this->m_PixelStartInFile, SEEK_SET ); - // fseek ( this->m_AmplitudeInfile, this->m_PixelStartInFile, SEEK_SET ); - // fseek ( this->m_IntensityInfile, this->m_PixelStartInFile, SEEK_SET ); - //} - //distanceBytesReturn = fread( this->m_DistanceArray, this->m_NumberOfBytes, 1, this->m_DistanceInfile ); - //amplitudeBytesReturn = fread( this->m_AmplitudeArray, this->m_NumberOfBytes, 1, this->m_AmplitudeInfile ); - //intensityBytesReturn = fread( this->m_IntensityArray, this->m_NumberOfBytes, 1, this->m_IntensityInfile ); } void ToFCameraMITKPlayerController::AccessData(int frame, Image::Pointer image, float* &data) { if(!this->m_ToFImageType) { memcpy(data, image->GetSliceData(frame)->GetData(),this->m_NumberOfBytes ); } else if(this->m_ToFImageType) { memcpy(data, image->GetVolumeData(frame)->GetData(), this->m_NumberOfBytes); } } void ToFCameraMITKPlayerController::GetAmplitudes(float* amplitudeArray) { memcpy(amplitudeArray, this->m_AmplitudeArray, this->m_NumberOfBytes); } void ToFCameraMITKPlayerController::GetIntensities(float* intensityArray) { memcpy(intensityArray, this->m_IntensityArray, this->m_NumberOfBytes); } void ToFCameraMITKPlayerController::GetDistances(float* distanceArray) { memcpy(distanceArray, this->m_DistanceArray, this->m_NumberOfBytes); } void ToFCameraMITKPlayerController::SetInputFileName(std::string inputFileName) { this->m_InputFileName = inputFileName; } } diff --git a/Modules/ToFHardware/mitkToFImageWriter.cpp b/Modules/ToFHardware/mitkToFImageWriter.cpp index ddde151160..4e29815588 100644 --- a/Modules/ToFHardware/mitkToFImageWriter.cpp +++ b/Modules/ToFHardware/mitkToFImageWriter.cpp @@ -1,257 +1,67 @@ /*========================================================================= Program: Medical Imaging & Interaction Toolkit Module: $RCSfile$ Language: C++ Date: $Date: 2010-05-27 16:06:53 +0200 (Do, 27 Mai 2010) $ Version: $Revision: $ Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. See MITKCopyright.txt or http://www.mitk.org/copyright.html for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notices for more information. =========================================================================*/ #include -//#include #include -//#include // itk includes #include "itksys/SystemTools.hxx" -//extern "C" -//{ -//size_t _mitkIpPicFWrite( const void *ptr, size_t size, size_t nitems, mitkIpPicFile_t stream); -//} - namespace mitk { ToFImageWriter::ToFImageWriter():m_Extension(".nrrd"), m_DistanceImageFileName(), m_AmplitudeImageFileName(), m_IntensityImageFileName(), m_NumOfFrames(0), m_DistanceImageSelected(true), m_AmplitudeImageSelected(true), m_IntensityImageSelected(true),m_CaptureWidth(200),m_CaptureHeight(200), m_PixelNumber(0), m_ImageSizeInBytes(0), m_ToFImageType(ToFImageWriter::ToFImageType3D) { } ToFImageWriter::~ToFImageWriter() { } - //void ToFImageWriter::Open() - //{ - // this->CheckForFileExtension(this->m_DistanceImageFileName); - // this->CheckForFileExtension(this->m_AmplitudeImageFileName); - // this->CheckForFileExtension(this->m_IntensityImageFileName); - - // this->m_PixelNumber = this->m_CaptureWidth * this->m_CaptureHeight; - // this->m_ImageSizeInBytes = this->m_PixelNumber * sizeof(float); - // float* floatData = new float[this->m_PixelNumber]; - // for(int i=0; im_PixelNumber; i++) - // { - // floatData[i] = i + 0.0; - // } - - // this->m_MitkImage = Image::New(); - // unsigned int dimensions[4]; - // dimensions[0] = this->m_CaptureWidth; - // dimensions[1] = this->m_CaptureHeight; - // if (this->m_ToFImageType == ToFImageWriter::ToFImageType2DPlusT) - // { - // dimensions[2] = 1; - // dimensions[3] = 2; - // this->m_MitkImage->Initialize( PixelType(typeid(float)), 4, dimensions, 1); - // } - // else - // { - // dimensions[2] = 2; - // dimensions[3] = 1; - // this->m_MitkImage->Initialize( PixelType(typeid(float)), 3, dimensions, 1); - // } - // this->m_MitkImage->SetSlice(floatData, 0, 0, 0); - - - // //ImageWriter::Pointer imageWriter = ImageWriter::New(); - // // if (this->m_DistanceImageSelected) - // // { - // // imageWriter->SetFileName(this->m_DistanceImageFileName); - // // imageWriter->SetInputImage(); - // // imageWriter->SetExtension(this->m_Extension); - // // imageWriter->Modified(); - // // imageWriter->Update(); - // // } - // // if (this->m_AmplitudeImageSelected) - // // { - // // imageWriter->SetFileName(this->m_AmplitudeImageFileName); - // // imageWriter->SetInputImage(); - // // imageWriter->SetExtension(this->m_Extension); - // // imageWriter->Modified(); - // // imageWriter->Update(); - // // } - // // if (this->m_IntensityImageSelected) - // // { - // // imageWriter->SetFileName(this->m_IntensityImageFileName); - // // imageWriter->SetInputImage(); - // // imageWriter->SetExtension(this->m_Extension); - // // imageWriter->Modified(); - // // imageWriter->Update(); - // // } - - // mitkIpPicDescriptor* pic = this->m_MitkImage->GetPic(); - - // if (this->m_DistanceImageSelected) - // { - // this->OpenPicFile(&(this->m_DistanceOutfile), this->m_DistanceImageFileName); - // this->WritePicFileHeader(this->m_DistanceOutfile, pic); - // } - // if (this->m_AmplitudeImageSelected) - // { - // this->OpenPicFile(&(this->m_AmplitudeOutfile), this->m_AmplitudeImageFileName); - // this->WritePicFileHeader(this->m_AmplitudeOutfile, pic); - // } - // if (this->m_IntensityImageSelected) - // { - // this->OpenPicFile(&(this->m_IntensityOutfile), this->m_IntensityImageFileName); - // this->WritePicFileHeader(this->m_IntensityOutfile, pic); - // } - // this->m_NumOfFrames = 0; - // delete[] floatData; - //} - - //void ToFImageWriter::Close() - //{ - // //if (this->m_DistanceImageSelected) - // //{ - // // this->ClosePicFile(this->m_DistanceOutfile); - // //} - // //if (this->m_AmplitudeImageSelected) - // //{ - // // this->ClosePicFile(this->m_AmplitudeOutfile); - // //} - // //if (this->m_IntensityImageSelected) - // //{ - // // this->ClosePicFile(this->m_IntensityOutfile); - // //} - //} - - //void ToFImageWriter::Add(float* distanceFloatData, float* amplitudeFloatData, float* intensityFloatData) - //{ - // //if (this->m_DistanceImageSelected) - // //{ - // // fwrite( distanceFloatData, this->m_ImageSizeInBytes, 1, this->m_DistanceOutfile ); - // //} - // //if (this->m_AmplitudeImageSelected) - // //{ - // // fwrite( amplitudeFloatData, this->m_ImageSizeInBytes, 1, this->m_AmplitudeOutfile ); - // //} - // //if (this->m_IntensityImageSelected) - // //{ - // // fwrite( intensityFloatData, this->m_ImageSizeInBytes, 1, this->m_IntensityOutfile ); - // //} - // //this->m_NumOfFrames++; - //} - - //void ToFImageWriter::OpenPicFile(FILE** outfile,std::string outfileName) - //{ - // (*outfile) = fopen( outfileName.c_str(), "w+b" ); - // if( !outfile ) // if fopen_s was not successful! - // { - // MITK_ERROR << "Error opening outfile: " << outfileName; - // throw std::logic_error("Error opening outfile."); - // return; - // } - //} - - //void ToFImageWriter::ClosePicFile(FILE* outfile) - //{ - // if (this->m_NumOfFrames == 0) - // { - // fclose(outfile); - // throw std::logic_error("File is empty."); - // return; - // } - // this->ReplacePicFileHeader(outfile); - // fclose(outfile); - //} - - //void ToFImageWriter::ReplacePicFileHeader(FILE* outfile) - //{ - // mitkIpPicDescriptor* pic = this->m_MitkImage->GetPic(); - - // if (this->m_ToFImageType == ToFImageWriter::ToFImageType2DPlusT) - // { - // pic->dim = 4; - // pic->n[2] = 1; - // pic->n[3] = this->m_NumOfFrames; - // } - // else - // { - // pic->dim = 3; - // pic->n[2] = this->m_NumOfFrames; - // pic->n[3] = 1; - // } - - // fseek ( outfile, 0, SEEK_SET ); - - // this->WritePicFileHeader( outfile, pic ); - //} - - //void ToFImageWriter::WritePicFileHeader(FILE* outfile, mitkIpPicDescriptor* pic) - //{ - // mitkIpUInt4_t len; - // mitkIpUInt4_t tagsLen; - - // tagsLen = _mitkIpPicTagsSize( pic->info->tags_head ); - // len = tagsLen + 3 * sizeof(mitkIpUInt4_t) + pic->dim * sizeof(mitkIpUInt4_t); - // /* write oufile */ - // if( mitkIpPicEncryptionType(pic) == ' ' ) - // mitkIpPicFWrite( mitkIpPicVERSION, 1, sizeof(mitkIpPicTag_t), outfile ); - // else - // mitkIpPicFWrite( pic->info->version, 1, sizeof(mitkIpPicTag_t), outfile ); - - // mitkIpPicFWriteLE( &len, sizeof(mitkIpUInt4_t), 1, outfile ); - - // mitkIpPicFWriteLE( &(pic->type), sizeof(mitkIpUInt4_t), 1, outfile ); - // mitkIpPicFWriteLE( &(pic->bpe), sizeof(mitkIpUInt4_t), 1, outfile ); - // mitkIpPicFWriteLE( &(pic->dim), sizeof(mitkIpUInt4_t), 1, outfile ); - - // mitkIpPicFWriteLE( pic->n, sizeof(mitkIpUInt4_t), pic->dim, outfile ); - - // _mitkIpPicWriteTags( pic->info->tags_head, outfile, mitkIpPicEncryptionType(pic) ); - // pic->info->pixel_start_in_file = ftell( outfile ); - //} - void ToFImageWriter::CheckForFileExtension(std::string& fileName) { std::string baseFilename = itksys::SystemTools::GetFilenameWithoutLastExtension( fileName ); std::string extension = itksys::SystemTools::GetFilenameLastExtension( fileName ); if( extension.length() != 0 && extension != this->m_Extension) { MITK_ERROR << "Wrong file extension! The default extension is " << this->m_Extension.c_str() << ", currently the requested file extension is " << extension.c_str() <<"!"; this->m_Extension = extension; } size_t found = fileName.find( this->m_Extension ); // !!! HAS to be at the very end of the filename (not somewhere in the middle) if( found == std::string::npos) { fileName.append(this->m_Extension); } } ToFImageWriter::ToFImageType ToFImageWriter::GetToFImageType() { return this->m_ToFImageType; } void ToFImageWriter::SetToFImageType(ToFImageWriter::ToFImageType toFImageType) { this->m_ToFImageType = toFImageType; } } // end namespace mitk