diff --git a/Modules/ToFHardware/Testing/mitkToFCameraMITKPlayerControllerTest.cpp b/Modules/ToFHardware/Testing/mitkToFCameraMITKPlayerControllerTest.cpp index e5f8e03bf0..acc5782f33 100644 --- a/Modules/ToFHardware/Testing/mitkToFCameraMITKPlayerControllerTest.cpp +++ b/Modules/ToFHardware/Testing/mitkToFCameraMITKPlayerControllerTest.cpp @@ -1,176 +1,184 @@ /*========================================================================= Program: Medical Imaging & Interaction Toolkit Language: C++ Date: $Date: 2010-03-12 14:05:50 +0100 (Fr, 12 Mrz 2010) $ Version: $Revision: 16010 $ 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 #include namespace mitk { class ToFCameraMITKPlayerDeviceImpl : public ToFCameraMITKPlayerDevice { public: inline ToFCameraMITKPlayerController::Pointer GetController(){return m_Controller;}; inline ToFCameraMITKPlayerDeviceImpl(){}; inline ~ToFCameraMITKPlayerDeviceImpl(){}; private: }; } // end namespace mitk /**Documentation * test for the class "ToFCameraMITKPlayerController". */ -int mitkToFCameraMITKPlayerControllerTest(int /* argc */, char* /*argv*/[]) +void ReadFileFormatTestCase(std::string extension, mitk::ToFImageGrabber::Pointer grabber) { - MITK_TEST_BEGIN("ToFCameraMITKPlayerController"); - - mitk::ToFCameraMITKPlayerController::Pointer testObject = mitk::ToFCameraMITKPlayerController::New(); - mitk::ToFCameraMITKPlayerDeviceImpl* deviceImpl = new mitk::ToFCameraMITKPlayerDeviceImpl; - mitk::ToFImageGrabber::Pointer imageGrabber = mitk::ToFImageGrabber::New(); - imageGrabber->SetCameraDevice(deviceImpl); - - MITK_TEST_CONDITION_REQUIRED(!(testObject.GetPointer() == NULL) ,"Testing initialization class"); - MITK_TEST_CONDITION_REQUIRED(testObject->GetCaptureHeight()== 0 ,"Testing initialization of CaptureHeight"); - MITK_TEST_CONDITION_REQUIRED(testObject->GetCaptureWidth()== 0 ,"Testing initialization of CaptureWidth"); - - //test correct order of file name member - testObject->SetDistanceImageFileName("distTest"); - testObject->SetAmplitudeImageFileName("amplTest"); - testObject->SetIntensityImageFileName("intenTest"); - MITK_TEST_CONDITION_REQUIRED(testObject->GetDistanceImageFileName()== "distTest" ,"Testing correct filename passing - Dist"); - MITK_TEST_CONDITION_REQUIRED(testObject->GetAmplitudeImageFileName()== "amplTest" ,"Testing correct filename passing - Ampl"); - MITK_TEST_CONDITION_REQUIRED(testObject->GetIntensityImageFileName()== "intenTest" ,"Testing correct filename passing - Inten"); - - //test passing of file name from image grabber - imageGrabber->SetStringProperty("DistanceImageFileName", "distPropertyTestName"); - imageGrabber->SetStringProperty("AmplitudeImageFileName", "amplPropertyTestName"); - imageGrabber->SetStringProperty("IntensityImageFileName", "intenPropertyTestName"); - testObject = deviceImpl->GetController(); - MITK_TEST_CONDITION_REQUIRED(testObject->GetDistanceImageFileName()== "distPropertyTestName" ,"Testing correct filename passing from Image Grabber- Dist"); - MITK_TEST_CONDITION_REQUIRED(testObject->GetAmplitudeImageFileName()== "amplPropertyTestName" ,"Testing correct filename passing from Image Grabber- Ampl"); - MITK_TEST_CONDITION_REQUIRED(testObject->GetIntensityImageFileName()== "intenPropertyTestName" ,"Testing correct filename passing from Image Grabber- Inten"); - + MITK_INFO<<"Checking image processing with file format " << extension.c_str(); //create some test image unsigned int* dim = new unsigned int[3]; dim[0] = 100; dim[1] = 100; dim[2] = 1; int end = dim[0]*dim[1]*dim[2]; float* data = new float[end]; int index = 0; while(index != end) { data[index] = (float) index; index++; } mitk::Image::Pointer testImage = mitk::Image::New(); testImage->Initialize(mitk::PixelType(typeid(float)), 3, dim); testImage->SetVolume(data); // save image as dist, ampl and inten image to file. - std::string distanceImageFileName("distTestImage.pic"); - std::string amplitudeImageFileName("amplTestImage.pic"); - std::string intensityImageFileName("intenTestImage.pic"); - + std::string distanceImageFileName("distTestImage"); + std::string amplitudeImageFileName("amplTestImage"); + std::string intensityImageFileName("intenTestImage"); + mitk::ImageWriter::Pointer writer = mitk::ImageWriter::New(); writer->SetInput(testImage); - writer->SetExtension(".pic"); + writer->SetExtension(extension); writer->SetFileName(distanceImageFileName); writer->Update(); writer->SetFileName(amplitudeImageFileName); writer->Update(); writer->SetFileName(intensityImageFileName); writer->Update(); - + // load the files from directory - - imageGrabber->SetStringProperty("DistanceImageFileName", distanceImageFileName.c_str()); - imageGrabber->SetStringProperty("AmplitudeImageFileName", amplitudeImageFileName.c_str()); - imageGrabber->SetStringProperty("IntensityImageFileName", intensityImageFileName.c_str()); - MITK_TEST_CONDITION_REQUIRED(imageGrabber->ConnectCamera() ,"Are the image files loaded correctly?"); + grabber->SetStringProperty("DistanceImageFileName", (distanceImageFileName.append(extension)).c_str()); + grabber->SetStringProperty("AmplitudeImageFileName", (amplitudeImageFileName.append(extension)).c_str()); + grabber->SetStringProperty("IntensityImageFileName", (intensityImageFileName.append(extension)).c_str()); + + MITK_TEST_CONDITION_REQUIRED(grabber->ConnectCamera() ,"Are the image files loaded correctly?"); + mitk::ToFCameraMITKPlayerController::Pointer testObject = static_cast(grabber->GetCameraDevice())->GetController(); // test load image from image grabber testObject->UpdateCamera(); index = 0; bool distOK = true; bool amplOK = true; bool intenOK = true; float* dist = new float[end]; float* ampl = new float[end]; float* inten = new float[end]; testObject->GetDistances( dist ); testObject->GetAmplitudes( ampl ); testObject->GetIntensities( inten ); while( index != end ) { if( dist[index] != data[index]) { distOK = false; } if( ampl[index] != data[index]) { amplOK = false; } if( inten[index] != data[index]) { intenOK = false; } index++; } MITK_TEST_CONDITION_REQUIRED(distOK ,"Testing correct loading and passing of distance image information!"); MITK_TEST_CONDITION_REQUIRED(amplOK ,"Testing correct loading and passing of amplitude image information!"); MITK_TEST_CONDITION_REQUIRED(intenOK ,"Testing correct loading and passing of intensity image information!"); MITK_TEST_CONDITION_REQUIRED(testObject->CloseCameraConnection(),"Testing disconnection of controller"); - + //clean up and delete saved image files if(remove(distanceImageFileName.c_str())!=0) { MITK_ERROR<<"File: "<Delete(); delete[] dist; delete[] ampl; delete[] inten; delete[] dim; +} + +int mitkToFCameraMITKPlayerControllerTest(int /* argc */, char* /*argv*/[]) +{ + MITK_TEST_BEGIN("ToFCameraMITKPlayerController"); + mitk::ToFCameraMITKPlayerController::Pointer testObject = mitk::ToFCameraMITKPlayerController::New(); + mitk::ToFCameraMITKPlayerDeviceImpl* deviceImpl = new mitk::ToFCameraMITKPlayerDeviceImpl; + mitk::ToFImageGrabber::Pointer imageGrabber = mitk::ToFImageGrabber::New(); + imageGrabber->SetCameraDevice(deviceImpl); + + MITK_TEST_CONDITION_REQUIRED(!(testObject.GetPointer() == NULL) ,"Testing initialization class"); + MITK_TEST_CONDITION_REQUIRED(testObject->GetCaptureHeight()== 0 ,"Testing initialization of CaptureHeight"); + MITK_TEST_CONDITION_REQUIRED(testObject->GetCaptureWidth()== 0 ,"Testing initialization of CaptureWidth"); + + //test correct order of file name member + testObject->SetDistanceImageFileName("distTest"); + testObject->SetAmplitudeImageFileName("amplTest"); + testObject->SetIntensityImageFileName("intenTest"); + MITK_TEST_CONDITION_REQUIRED(testObject->GetDistanceImageFileName()== "distTest" ,"Testing correct filename passing - Dist"); + MITK_TEST_CONDITION_REQUIRED(testObject->GetAmplitudeImageFileName()== "amplTest" ,"Testing correct filename passing - Ampl"); + MITK_TEST_CONDITION_REQUIRED(testObject->GetIntensityImageFileName()== "intenTest" ,"Testing correct filename passing - Inten"); + + //test passing of file name from image grabber + imageGrabber->SetStringProperty("DistanceImageFileName", "distPropertyTestName"); + imageGrabber->SetStringProperty("AmplitudeImageFileName", "amplPropertyTestName"); + imageGrabber->SetStringProperty("IntensityImageFileName", "intenPropertyTestName"); + testObject = deviceImpl->GetController(); + MITK_TEST_CONDITION_REQUIRED(testObject->GetDistanceImageFileName()== "distPropertyTestName" ,"Testing correct filename passing from Image Grabber- Dist"); + MITK_TEST_CONDITION_REQUIRED(testObject->GetAmplitudeImageFileName()== "amplPropertyTestName" ,"Testing correct filename passing from Image Grabber- Ampl"); + MITK_TEST_CONDITION_REQUIRED(testObject->GetIntensityImageFileName()== "intenPropertyTestName" ,"Testing correct filename passing from Image Grabber- Inten"); + + ReadFileFormatTestCase(".pic", imageGrabber); + ReadFileFormatTestCase(".nrrd", imageGrabber); + + deviceImpl->Delete(); // end of test MITK_TEST_END(); } diff --git a/Modules/ToFHardware/mitkToFCameraMITKPlayerController.cpp b/Modules/ToFHardware/mitkToFCameraMITKPlayerController.cpp index c5534681e4..ae0bf96a70 100644 --- a/Modules/ToFHardware/mitkToFCameraMITKPlayerController.cpp +++ b/Modules/ToFHardware/mitkToFCameraMITKPlayerController.cpp @@ -1,188 +1,373 @@ /*========================================================================= 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_DistanceInfile(NULL),m_AmplitudeInfile(NULL),m_IntensityInfile(NULL), - m_IntensityArray(NULL),m_DistanceArray(NULL),m_AmplitudeArray(NULL), - m_DistanceImageFileName(""),m_AmplitudeImageFileName(""),m_IntensityImageFileName(""), - m_PixelStartInFile(0),m_CurrentFrame(-1),m_NumOfFrames(0) + 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 { - mitkIpPicDescriptor* pic = NULL; - mitkIpPicDescriptor* info = NULL; - - pic = mitkIpPicGetHeader(const_cast(this->m_DistanceImageFileName.c_str()), pic); - if (pic==NULL) + // 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 { - MITK_ERROR << "Error opening ToF data file " << this->m_InputFileName; - return false; + throw std::exception("Please check image type, currently only .nrrd files are supported (.pic files are depracated!)"); } - info = mitkIpPicGetTags(const_cast(this->m_DistanceImageFileName.c_str()), pic); - this->m_PixelStartInFile = info->info->pixel_start_in_file; - if (pic->dim == 2) + // check if the opened files contained data + if(m_DistanceImage.IsNull()) { - this->m_ToFImageType = ToFImageType2DPlusT; + m_ImageStatus.at(0) = false; } - else if (pic->dim == 3) + if(m_AmplitudeImage.IsNull()) { - this->m_ToFImageType = ToFImageType3D; + m_ImageStatus.at(1) = false; } - else if (pic->dim == 4) + if(m_IntensityImage.IsNull()) { - this->m_ToFImageType = ToFImageType2DPlusT; + m_ImageStatus.at(2) = false; } - else + + // 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)) { - MITK_ERROR << "Error opening ToF data file: Invalid dimension."; - return false; + infoImage = m_IntensityImage; } - this->m_CaptureWidth = pic->n[0]; - this->m_CaptureHeight = pic->n[1]; + 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::exception("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 = pic->n[3]; + this->m_NumOfFrames = infoImage->GetDimension(3); } else { - this->m_NumOfFrames = pic->n[2]; + 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;} - 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()); + // 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::OpenPicFileToData(FILE** outfile, const char *outfileName) + void ToFCameraMITKPlayerController::OpenNrrdImageFile( const std::string outfileName, Image::Pointer &image) { - (*outfile) = fopen( outfileName, "rb" ); - if( (*outfile) == NULL ) + 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: file is empty" << outfileName; - throw std::logic_error("Error opening ToF data file: file is empty"); - return; + MITK_ERROR << "Error opening ToF data file " << outfileName; } - fseek ( (*outfile), this->m_PixelStartInFile, SEEK_SET ); + } - bool ToFCameraMITKPlayerController::CloseCameraConnection() + void ToFCameraMITKPlayerController::OpenPicImageFile( const std::string outfileName, Image::Pointer &image) { - bool returnValue = false; - if (this->m_ConnectionCheck) + if(!outfileName.empty()) { - if(!fclose(this->m_DistanceInfile) && !fclose(this->m_AmplitudeInfile) && - !fclose(this->m_IntensityInfile)) + if(image.IsNotNull()) { - this->m_ConnectionCheck = false; - returnValue = true; - } - else - { - this->m_ConnectionCheck = true; - returnValue = false; + image->ReleaseData(); + image = NULL; } + PicFileReader::Pointer picReader = PicFileReader::New(); + picReader->SetFileName(outfileName); + picReader->Update(); + image = picReader->GetOutput()->Clone(); } - return returnValue; + 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() { - size_t distanceBytesReturn; - size_t amplitudeBytesReturn; - size_t intensityBytesReturn; - this->m_CurrentFrame++; - if (this->m_CurrentFrame >= this->m_NumOfFrames) + if(this->m_CurrentFrame >= this->m_NumOfFrames) { this->m_CurrentFrame = 0; - 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 ); + + 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/mitkToFCameraMITKPlayerController.h b/Modules/ToFHardware/mitkToFCameraMITKPlayerController.h index c1d662e972..013be7368e 100644 --- a/Modules/ToFHardware/mitkToFCameraMITKPlayerController.h +++ b/Modules/ToFHardware/mitkToFCameraMITKPlayerController.h @@ -1,123 +1,134 @@ /*========================================================================= 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. =========================================================================*/ #ifndef __mitkToFCameraMITKPlayerController_h #define __mitkToFCameraMITKPlayerController_h #include "mitkToFHardwareExports.h" #include "mitkCommon.h" #include "mitkFileReader.h" +#include "mitkImage.h" #include "itkObject.h" #include "itkObjectFactory.h" namespace mitk { /** * @brief Controller for playing ToF images saved in MITK (.pic) format * * @ingroup ToFHardware */ class MITK_TOFHARDWARE_EXPORT ToFCameraMITKPlayerController : public itk::Object { public: mitkClassMacro( ToFCameraMITKPlayerController , itk::Object ); itkNewMacro( Self ); /*! \brief opens a connection to the ToF camera \return Returns 'true' if connection could be established and 'false' otherwise */ virtual bool OpenCameraConnection(); /*! \brief closes the connection to the camera \return Returns 'true' if connection could be closed (i.e. only if a connection was established before) and 'false' otherwise */ virtual bool CloseCameraConnection(); /*! \brief gets the current amplitude frame from the input These values can be used to determine the quality of the distance values. The higher the amplitude value, the higher the accuracy of the according distance value */ virtual void GetAmplitudes(float* amplitudeArray); /*! \brief gets the current intensity frame from the input as a greyscale image */ virtual void GetIntensities(float* intensityArray); /*! \brief gets the current distance frame from the inpug measuring the distance between the camera and the different object points in millimeters */ virtual void GetDistances(float* distanceArray); /*! \brief updates the current image frames from input */ virtual void UpdateCamera(); virtual void SetInputFileName(std::string inputFileName); itkGetMacro(CaptureWidth, int); itkGetMacro(CaptureHeight, int); itkGetMacro( DistanceImageFileName, std::string ); itkGetMacro( AmplitudeImageFileName, std::string ); itkGetMacro( IntensityImageFileName, std::string ); itkSetMacro( DistanceImageFileName, std::string ); itkSetMacro( AmplitudeImageFileName, std::string ); itkSetMacro( IntensityImageFileName, std::string ); enum ToFImageType{ ToFImageType3D, ToFImageType2DPlusT }; protected: ToFCameraMITKPlayerController(); ~ToFCameraMITKPlayerController(); int m_PixelNumber; ///< holds the number of pixels contained in the image int m_NumberOfBytes; ///< holds the number of bytes contained in the image int m_CaptureWidth; ///< holds the width of the image int m_CaptureHeight; ///< holds the height of the image bool m_ConnectionCheck; ///< flag showing whether the camera is connected (true) or not (false) std::string m_InputFileName; + std::string m_Extension; ToFImageType m_ToFImageType; ///< type of the ToF image to be played: 3D Volume (ToFImageType3D), temporal 2D image stack (ToFImageType2DPlusT) + Image::Pointer m_DistanceImage; + Image::Pointer m_AmplitudeImage; + Image::Pointer m_IntensityImage; + std::vector m_ImageStatus; + FILE* m_DistanceInfile; ///< file holding the distance data FILE* m_AmplitudeInfile; ///< file holding the amplitude data FILE* m_IntensityInfile; ///< file holding the intensity data float* m_IntensityArray; ///< member holding the current intensity frame float* m_DistanceArray; ///< member holding the current distance frame float* m_AmplitudeArray; ///< member holding the current amplitude frame std::string m_DistanceImageFileName; ///< file name of the distance image to be played std::string m_AmplitudeImageFileName; ///< file name of the amplitude image to be played std::string m_IntensityImageFileName; ///< file name of the intensity image to be played long m_PixelStartInFile; int m_CurrentFrame; int m_NumOfFrames; private: - void OpenPicFileToData(FILE** outfile, const char *outfileName); - + //void OpenPicFileToData(FILE** outfile, const char *outfileName); + void AccessData(int frame, Image::Pointer image, float* &data); + bool CheckCurrentFileType(); + void OpenNrrdImageFile( const std::string outfileName, Image::Pointer &image); + void OpenPicImageFile( const std::string outfileName, Image::Pointer &image); + void CleanUp(); }; } //END mitk namespace #endif diff --git a/Modules/ToFUI/Qmitk/QmitkToFConnectionWidget.cpp b/Modules/ToFUI/Qmitk/QmitkToFConnectionWidget.cpp index 5a3cb61fbf..d37a866403 100644 --- a/Modules/ToFUI/Qmitk/QmitkToFConnectionWidget.cpp +++ b/Modules/ToFUI/Qmitk/QmitkToFConnectionWidget.cpp @@ -1,424 +1,426 @@ /*========================================================================= Program: Medical Imaging & Interaction Toolkit Module: $RCSfile$ Language: C++ Date: $Date: 2009-05-20 13:35:09 +0200 (Mi, 20 Mai 2009) $ Version: $Revision: 17332 $ 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. =========================================================================*/ //#define _USE_MATH_DEFINES #include //QT headers #include #include #include //mitk headers #include //itk headers #include const std::string QmitkToFConnectionWidget::VIEW_ID = "org.mitk.views.qmitktofconnectionwidget"; QmitkToFConnectionWidget::QmitkToFConnectionWidget(QWidget* parent, Qt::WindowFlags f): QWidget(parent, f) { this->m_IntegrationTime = 0; this->m_ModulationFrequency = 0; this->m_ToFImageGrabber = NULL; m_Controls = NULL; CreateQtPartControl(this); } QmitkToFConnectionWidget::~QmitkToFConnectionWidget() { } void QmitkToFConnectionWidget::CreateQtPartControl(QWidget *parent) { if (!m_Controls) { // create GUI widgets m_Controls = new Ui::QmitkToFConnectionWidgetControls; m_Controls->setupUi(parent); this->CreateConnections(); ShowParameterWidget(); } } void QmitkToFConnectionWidget::CreateConnections() { if ( m_Controls ) { connect( (QObject*)(m_Controls->m_ConnectCameraButton), SIGNAL(clicked()),(QObject*) this, SLOT(OnConnectCamera()) ); connect( m_Controls->m_SelectCameraCombobox, SIGNAL(currentIndexChanged(int)), this, SLOT(OnSelectCamera(int)) ); connect( m_Controls->m_SelectCameraCombobox, SIGNAL(activated(int)), this, SLOT(OnSelectCamera(int)) ); connect( m_Controls->m_SelectCameraCombobox, SIGNAL(activated(int)), this, SIGNAL(ToFCameraSelected(int)) ); //connect( m_Controls->m_IntegrationTimeSpinBox, SIGNAL(valueChanged(int)), this, SLOT(OnChangeIntegrationTimeSpinBox(int)) ); //connect( m_Controls->m_ModulationFrequencySpinBox, SIGNAL(valueChanged(int)), this, SLOT(OnChangeModulationFrequencySpinBox(int)) ); } } void QmitkToFConnectionWidget::ShowParameterWidget() { int selectedCamera = m_Controls->m_SelectCameraCombobox->currentIndex(); switch (selectedCamera) { case 0: case 1: case 2: ShowPMDParameterWidget(); break; case 3: ShowMESAParameterWidget(); break; default: this->m_Controls->m_PMDParameterWidget->hide(); this->m_Controls->m_MESAParameterWidget->hide(); } } void QmitkToFConnectionWidget::ShowPMDParameterWidget() { this->m_Controls->m_PMDParameterWidget->show(); this->m_Controls->m_MESAParameterWidget->hide(); } void QmitkToFConnectionWidget::ShowMESAParameterWidget() { this->m_Controls->m_PMDParameterWidget->hide(); this->m_Controls->m_MESAParameterWidget->show(); } void QmitkToFConnectionWidget::ShowPlayerParameterWidget() { this->m_Controls->m_PMDParameterWidget->hide(); this->m_Controls->m_MESAParameterWidget->hide(); } mitk::ToFImageGrabber* QmitkToFConnectionWidget::GetToFImageGrabber() { return m_ToFImageGrabber; } void QmitkToFConnectionWidget::OnSelectCamera(int index) { if (index == 0) // PMD camcube 2 { //m_Controls->m_IntegrationTimeSpinBox->setEnabled(true); //m_Controls->m_ModulationFrequencySpinBox->setEnabled(true); //m_Controls->m_CalibrationParameterGroupBox->setEnabled(true); ShowPMDParameterWidget(); } else if (index == 1) // pmd camboard { //m_Controls->m_IntegrationTimeSpinBox->setEnabled(true); //m_Controls->m_ModulationFrequencySpinBox->setEnabled(true); //m_Controls->m_CalibrationParameterGroupBox->setEnabled(false); ShowPMDParameterWidget(); } else if (index == 2) // pmd O3d { //m_Controls->m_IntegrationTimeSpinBox->setEnabled(true); //m_Controls->m_ModulationFrequencySpinBox->setEnabled(true); //m_Controls->m_CalibrationParameterGroupBox->setEnabled(false); ShowPMDParameterWidget(); } else if (index == 3) // MESA 4000 { ShowMESAParameterWidget(); } else if (index == 4) // pmd file player { //m_Controls->m_IntegrationTimeSpinBox->setEnabled(false); //m_Controls->m_ModulationFrequencySpinBox->setEnabled(false); //m_Controls->m_CalibrationParameterGroupBox->setEnabled(false); ShowPlayerParameterWidget(); } else if (index == 5) // pmd raw data player { //m_Controls->m_IntegrationTimeSpinBox->setEnabled(false); //m_Controls->m_ModulationFrequencySpinBox->setEnabled(false); //m_Controls->m_CalibrationParameterGroupBox->setEnabled(false); ShowPlayerParameterWidget(); } else if (index == 6) // mitk player { //m_Controls->m_IntegrationTimeSpinBox->setEnabled(false); //m_Controls->m_ModulationFrequencySpinBox->setEnabled(false); //m_Controls->m_CalibrationParameterGroupBox->setEnabled(false); ShowPlayerParameterWidget(); } } void QmitkToFConnectionWidget::OnConnectCamera() { bool playerMode = false; if (m_Controls->m_ConnectCameraButton->text()=="Connect") { //reset the status of the GUI buttons m_Controls->m_ConnectCameraButton->setEnabled(false); m_Controls->m_SelectCameraCombobox->setEnabled(false); // m_Controls->m_CalibrationParameterGroupBox->setEnabled(false); //repaint the widget this->repaint(); QString tmpFileName(""); QString fileFilter(""); //select the camera to connect with int selectedCamera = m_Controls->m_SelectCameraCombobox->currentIndex(); if (selectedCamera == 0) { //PMD CamCube this->m_ToFImageGrabber = mitk::ToFImageGrabberCreator::GetInstance()->GetPMDCamCubeImageGrabber(); } else if (selectedCamera == 1) { //PMD CamBoard this->m_ToFImageGrabber = mitk::ToFImageGrabberCreator::GetInstance()->GetPMDCamBoardImageGrabber(); } else if (selectedCamera == 2) {//PMD O3 this->m_ToFImageGrabber = mitk::ToFImageGrabberCreator::GetInstance()->GetPMDO3ImageGrabber(); } else if (selectedCamera == 3) {//MESA SR4000 this->m_ToFImageGrabber = mitk::ToFImageGrabberCreator::GetInstance()->GetMESASR4000ImageGrabber(); } else if (selectedCamera == 4) {//PMD player playerMode = true; fileFilter.append("PMD Files (*.pmd)"); this->m_ToFImageGrabber = mitk::ToFImageGrabberCreator::GetInstance()->GetPMDPlayerImageGrabber(); } else if (selectedCamera == 5) {//PMD MITK player playerMode = true; fileFilter.append("MITK Images (*.pic)"); this->m_ToFImageGrabber = mitk::ToFImageGrabberCreator::GetInstance()->GetPMDMITKPlayerImageGrabber(); } else if (selectedCamera == 6) {//MITK player playerMode = true; - fileFilter.append("MITK Images (*.pic)"); + fileFilter.append("MITK Images (*.nrrd)"); + //fileFilter.append("MITK Images (*.pic) (deprecated)"); + this->m_ToFImageGrabber = mitk::ToFImageGrabberCreator::GetInstance()->GetMITKPlayerImageGrabber(); } // if a player was selected ... if (playerMode) { //... open a QFileDialog to chose the corresponding file from the disc tmpFileName = QFileDialog::getOpenFileName(NULL, "Play Image From...", "", fileFilter); if (tmpFileName.isEmpty()) { m_Controls->m_ConnectCameraButton->setChecked(false); m_Controls->m_ConnectCameraButton->setEnabled(true); m_Controls->m_SelectCameraCombobox->setEnabled(true); // m_Controls->m_CalibrationParameterGroupBox->setEnabled(true); OnSelectCamera(m_Controls->m_SelectCameraCombobox->currentIndex()); QMessageBox::information( this, "Template functionality", "Please select a valid image before starting some action."); return; } if(selectedCamera == 4) { //set the PMD file name this->m_ToFImageGrabber->SetStringProperty("PMDFileName", tmpFileName.toStdString().c_str() ); } if (selectedCamera == 5 || selectedCamera == 6) { std::string msg = ""; try { //get 3 corresponding file names std::string dir = itksys::SystemTools::GetFilenamePath( tmpFileName.toStdString() ); std::string baseFilename = itksys::SystemTools::GetFilenameWithoutLastExtension( tmpFileName.toStdString() ); std::string extension = itksys::SystemTools::GetFilenameLastExtension( tmpFileName.toStdString() ); - if (extension != ".pic") + if (extension != ".pic" && extension != ".nrrd") { - msg = msg + "Invalid file format, please select a \".pic\"-file"; + msg = msg + "Invalid file format, please select a \".pic\" or \".nrrd\"-file"; throw std::logic_error(msg.c_str()); } int found = baseFilename.rfind("_DistanceImage"); if (found == std::string::npos) { found = baseFilename.rfind("_AmplitudeImage"); } if (found == std::string::npos) { found = baseFilename.rfind("_IntensityImage"); } if (found == std::string::npos) { msg = msg + "Input file name must end with \"_DistanceImage.pic\", \"_AmplitudeImage.pic\" or \"_IntensityImage.pic\"!"; throw std::logic_error(msg.c_str()); } std::string baseFilenamePrefix = baseFilename.substr(0,found); std::string distanceImageFileName = dir + "/" + baseFilenamePrefix + "_DistanceImage" + extension; std::string amplitudeImageFileName = dir + "/" + baseFilenamePrefix + "_AmplitudeImage" + extension; std::string intensityImageFileName = dir + "/" + baseFilenamePrefix + "_IntensityImage" + extension; if (!itksys::SystemTools::FileExists(distanceImageFileName.c_str(), true)) { msg = msg + "Inputfile not exist! " + distanceImageFileName; throw std::logic_error(msg.c_str()); } if (!itksys::SystemTools::FileExists(amplitudeImageFileName.c_str(), true)) { msg = msg + "Inputfile not exist! " + amplitudeImageFileName; throw std::logic_error(msg.c_str()); } if (!itksys::SystemTools::FileExists(intensityImageFileName.c_str(), true)) { msg = msg + "Inputfile not exist! " + intensityImageFileName; throw std::logic_error(msg.c_str()); } //set the file names this->m_ToFImageGrabber->SetStringProperty("DistanceImageFileName", distanceImageFileName.c_str()); this->m_ToFImageGrabber->SetStringProperty("AmplitudeImageFileName", amplitudeImageFileName.c_str()); this->m_ToFImageGrabber->SetStringProperty("IntensityImageFileName", intensityImageFileName.c_str()); } catch (std::exception &e) { MITK_ERROR << e.what(); QMessageBox::critical( this, "Error", e.what() ); m_Controls->m_ConnectCameraButton->setChecked(false); m_Controls->m_ConnectCameraButton->setEnabled(true); m_Controls->m_SelectCameraCombobox->setEnabled(true); // m_Controls->m_CalibrationParameterGroupBox->setEnabled(true); OnSelectCamera(m_Controls->m_SelectCameraCombobox->currentIndex()); return; } } } //if a connection could be established if (this->m_ToFImageGrabber->ConnectCamera()) { this->m_Controls->m_PMDParameterWidget->SetToFImageGrabber(this->m_ToFImageGrabber); this->m_Controls->m_MESAParameterWidget->SetToFImageGrabber(this->m_ToFImageGrabber); switch (selectedCamera) { case 0: case 1: case 2: this->m_Controls->m_PMDParameterWidget->ActivateAllParameters(); break; case 3: this->m_Controls->m_MESAParameterWidget->ActivateAllParameters(); break; } /* //get the integration time and modulation frequency this->m_IntegrationTime = m_Controls->m_IntegrationTimeSpinBox->value(); this->m_ModulationFrequency = m_Controls->m_ModulationFrequencySpinBox->value(); //set the integration time and modulation frequency in the grabber this->m_IntegrationTime = this->m_ToFImageGrabber->SetIntegrationTime(this->m_IntegrationTime); this->m_ModulationFrequency = this->m_ToFImageGrabber->SetModulationFrequency(this->m_ModulationFrequency); //set the PMD calibration according to the check boxes bool boolValue = false; boolValue = m_Controls->m_FPNCalibCB->isChecked(); this->m_ToFImageGrabber->SetBoolProperty("SetFPNCalibration", boolValue); boolValue = m_Controls->m_FPPNCalibCB->isChecked(); this->m_ToFImageGrabber->SetBoolProperty("SetFPPNCalibration", boolValue); boolValue = m_Controls->m_LinearityCalibCB->isChecked(); this->m_ToFImageGrabber->SetBoolProperty("SetLinearityCalibration", boolValue); boolValue = m_Controls->m_LensCorrection->isChecked(); this->m_ToFImageGrabber->SetBoolProperty("SetLensCalibration", boolValue); boolValue = m_Controls->m_ExposureModeCB->isChecked(); this->m_ToFImageGrabber->SetBoolProperty("SetExposureMode", boolValue); //reset the GUI elements m_Controls->m_IntegrationTimeSpinBox->setValue(this->m_IntegrationTime); m_Controls->m_ModulationFrequencySpinBox->setValue(this->m_ModulationFrequency); */ m_Controls->m_ConnectCameraButton->setText("Disconnect"); // send connect signal to the caller functionality emit ToFCameraConnected(); } else { QMessageBox::critical( this, "Error", "Connection failed. Check if you have installed the latest driver for your system." ); m_Controls->m_ConnectCameraButton->setChecked(false); m_Controls->m_ConnectCameraButton->setEnabled(true); m_Controls->m_SelectCameraCombobox->setEnabled(true); // m_Controls->m_CalibrationParameterGroupBox->setEnabled(true); OnSelectCamera(m_Controls->m_SelectCameraCombobox->currentIndex()); return; } m_Controls->m_ConnectCameraButton->setEnabled(true); } else if (m_Controls->m_ConnectCameraButton->text()=="Disconnect") { //send camera stop to the caller functionality emit ToFCameraStop(); this->m_ToFImageGrabber->StopCamera(); this->m_ToFImageGrabber->DisconnectCamera(); m_Controls->m_ConnectCameraButton->setText("Connect"); m_Controls->m_SelectCameraCombobox->setEnabled(true); // m_Controls->m_CalibrationParameterGroupBox->setEnabled(true); OnSelectCamera(m_Controls->m_SelectCameraCombobox->currentIndex()); this->m_ToFImageGrabber = NULL; // send disconnect signal to the caller functionality emit ToFCameraDisconnected(); } } /* void QmitkToFConnectionWidget::OnChangeIntegrationTimeSpinBox(int value) { if (this->m_ToFImageGrabber != NULL) { // stop camera if active bool active = m_ToFImageGrabber->IsCameraActive(); if (active) { m_ToFImageGrabber->StopCamera(); } this->m_IntegrationTime = m_Controls->m_IntegrationTimeSpinBox->value(); this->m_IntegrationTime = this->m_ToFImageGrabber->SetIntegrationTime(this->m_IntegrationTime); if (active) { m_ToFImageGrabber->StartCamera(); } } } void QmitkToFConnectionWidget::OnChangeModulationFrequencySpinBox(int value) { if (this->m_ToFImageGrabber != NULL) { // stop camera if active bool active = m_ToFImageGrabber->IsCameraActive(); if (active) { m_ToFImageGrabber->StopCamera(); } this->m_ModulationFrequency = m_Controls->m_ModulationFrequencySpinBox->value(); this->m_ModulationFrequency = this->m_ToFImageGrabber->SetModulationFrequency(this->m_ModulationFrequency); if (active) { m_ToFImageGrabber->StartCamera(); } } } */