24 #include <opencv\cv.h> 25 #include <opencv\cxcore.h> 26 #include <opencv\highgui.h> 27 #include <opencv2/contrib/contrib.hpp> 31 #include <itkComposeImageFilter.h> 34 #include <ISpectroCam.h> 35 #include <Jai_Factory.h> 55 class SpectroCamController_pimpl
58 SpectroCamController_pimpl();
59 ~SpectroCamController_pimpl();
62 int OpenCameraConnection();
63 int CloseCameraConnection();
64 bool isCameraRunning();
67 void SetCurrentImageAsWhiteBalance();
71 CompositeCameraImageType::Pointer m_CompositeItkImage_1;
72 CompositeCameraImageType::Pointer m_CompositeItkImage_2;
75 cv::Mat m_CurrentStackSmall;
76 cv::Mat m_CurrentTransformedStack;
77 cv::Mat m_FlatfieldSmall;
78 cv::Mat m_LLSQSolutionSmall;
80 const int m_FullWidth;
81 const int m_FullHeight;
83 const int m_SmallWidth;
84 const int m_SmallHeight;
86 bool m_ShowOxygenation;
89 bool m_Image1Selected;
96 void InitializeItkImage(mitk::CompositeCameraImageType::Pointer& compositeImage);
98 bool m_IsCameraRunning;
100 unsigned m_NumRecordedImages;
102 ISpectroCam* spectroCam;
106 uint32_t m_iValidBuffers;
107 BUF_HANDLE m_pAquBufferID;
112 FastModeSettings fastSettings;
113 SequenceModeSettings seqSettings;
114 IndexModeSettings indexSettings;
116 void SaveCameraStreamToDisk();
128 mitk::CompositeCameraImageType::Pointer selectedImage;
131 if (this->m_Image1Selected)
133 this->m_Image1Selected = !this->m_Image1Selected;
134 selectedImage = this->m_CompositeItkImage_1;
138 this->m_Image1Selected = !this->m_Image1Selected;
139 selectedImage = this->m_CompositeItkImage_2;
146 this->m_CompositeMitkImage->SetVolume(selectedImage->GetBufferPointer());
147 MITK_INFO <<
"Copied data";
150 return m_CompositeMitkImage;
157 float H[8][4]= {{50104 , 37020. , 405, 1.},
158 {33209.2 , 16156.4 , 785., 1.},
159 {319.6 , 3226.56 , 280., 1.},
160 {32613.2 , 53788 , 495., 1.},
161 {26629.2 , 14550 , 760., 1.},
162 {20035.2 , 25773.6 , 665., 1.},
163 {3200 , 14677.2 , 380., 1.},
164 {290 , 1794.28 , 220., 1.}};
167 cv::Mat hMatrix = cv::Mat(8, 4, CV_32F, &H );
170 transpose(hMatrix,transH);
171 cv::Mat mulImage = transH * hMatrix;
172 cv::Mat invImage = mulImage.inv();
173 cv::Mat HCompononentsForLLSQ = invImage * transH;
175 return HCompononentsForLLSQ;
178 mitk::SpectroCamController_pimpl::SpectroCamController_pimpl()
180 m_NumRecordedImages(1),
181 m_IsCameraRunning(
false),
186 m_Image1Selected(
true),
187 m_ShowOxygenation(
false)
190 m_CurrentStackSmall = cv::Mat(8, m_SmallWidth * m_SmallHeight, CV_32F, cv::Scalar(0));
191 m_FlatfieldSmall = cv::Mat(8, m_SmallWidth * m_SmallHeight, CV_32F, cv::Scalar(1));
192 m_CurrentTransformedStack = cv::Mat(8, m_SmallWidth * m_SmallHeight, CV_32F, cv::Scalar(1));
200 void mitk::SpectroCamController_pimpl::SetCurrentImageAsWhiteBalance()
203 m_FlatfieldSmall = m_CurrentStackSmall.clone();
205 cv::namedWindow(
"Oxygenation Estimate", WINDOW_AUTOSIZE);
206 m_ShowOxygenation =
true;
211 mitk::SpectroCamController_pimpl::~SpectroCamController_pimpl()
219 void mitk::SpectroCamController_pimpl::SaveCameraStreamToDisk()
246 bool mitk::SpectroCamController_pimpl::Ini()
250 std::ifstream fin(
"C:\\ModeSettings.txt");
251 std::ofstream fout(
"C:\\ModeSettingsCheck.txt");
252 const int bufferSize = 1000;
253 char buffer[bufferSize];
257 MITK_INFO <<
"Failed opening file ModeSettings.txt!" << endl ;
260 fin.getline(buffer, bufferSize);
261 fin.getline(buffer, bufferSize);
267 for (
int i = 0; i < 3; ++i)
269 fin.getline(buffer, bufferSize);
270 fout << buffer << endl;
276 for (
int i = 0; i < 2; ++i)
278 fin.getline(buffer, bufferSize);
279 fout << buffer << endl;
282 fin >> fastSettings.exposure;
283 fout << fastSettings.exposure << endl;;
286 for (
int i = 0; i < 3; ++i)
288 fin.getline(buffer, bufferSize);
289 fout << buffer << endl;
292 fin >> fastSettings.gain;
293 fout << fastSettings.gain << endl;
296 for (
int i = 0; i < 3; ++i)
298 fin.getline(buffer, bufferSize);
299 fout << buffer << endl;
302 for (
int i = 0; i < NUMBER_FILTERS; ++i)
304 fin >> seqSettings.exposures[i];
305 fout << seqSettings.exposures[i] << endl;
309 for (
int i = 0; i < 3; ++i)
311 fin.getline(buffer, bufferSize);
312 fout << buffer << endl;
315 for (
int i = 0; i < NUMBER_FILTERS; ++i)
317 fin >> seqSettings.gains[i];
318 fout << seqSettings.gains[i] << endl;
322 for (
int i = 0; i < 3; ++i)
324 fin.getline(buffer, bufferSize);
325 fout << buffer << endl;
328 for (
int i = 0; i < NUMBER_FILTERS; ++i)
330 fin >> indexSettings.exposures[i];
331 fout << indexSettings.exposures[i] << endl;
335 for (
int i = 0; i < 3; ++i)
337 fin.getline(buffer, bufferSize);
338 fout << buffer << endl;
340 for (
int i = 0; i < NUMBER_FILTERS; ++i)
342 fin >> indexSettings.gains[i];
343 fout << indexSettings.gains[i] << endl;
347 for (
int i = 0; i < 3; ++i)
349 fin.getline(buffer, bufferSize);
350 fout << buffer << endl;
353 for (
int i = 0; i < NUMBER_FILTERS; ++i)
355 fin >> indexSettings.numFilterIterations[i];
356 fout << indexSettings.numFilterIterations[i] << endl;
367 void mitk::SpectroCamController_pimpl::InitializeItkImage(mitk::CompositeCameraImageType::Pointer& compositeImage)
369 if (compositeImage.IsNull())
372 MITK_INFO <<
"initializing itk::Composite Image";
373 mitk::CompositeCameraImageType::RegionType region;
374 mitk::CompositeCameraImageType::RegionType::SizeType size;
375 mitk::CompositeCameraImageType::RegionType::IndexType index;
376 mitk::CompositeCameraImageType::SpacingType spacing;
378 size[0] = this->m_FullWidth;
379 size[1] = this->m_FullHeight;
382 region.SetSize(size);
383 region.SetIndex(index);
385 compositeImage = mitk::CompositeCameraImageType::New();
386 compositeImage->SetRegions(region);
387 compositeImage->SetSpacing(spacing);
388 compositeImage->SetNumberOfComponentsPerPixel(NUMBER_FILTERS);
389 compositeImage->Allocate();
403 if (image.m_FilterNum < 0 || image.m_FilterNum >= NUMBER_FILTERS)
405 std::cout <<
"Filter number out of range.\n"<< std::endl;
410 if (image.m_pAcqImage->pImageBuffer ==
nullptr)
412 if (J_Image_Malloc(image.m_pAcqImage, image.m_pAcqImage) != J_ST_SUCCESS)
422 cv::Mat data = cv::Mat( image.m_pAcqImage->iSizeY, image.m_pAcqImage->iSizeX, CV_16U);
423 memcpy( data.datastart , image.m_pAcqImage->pImageBuffer , image.m_pAcqImage->iImageSize);
428 mitk::CompositeCameraImageType::Pointer selectedImage;
439 itk::ImageRegionIterator<mitk::CompositeCameraImageType> imageIterator(selectedImage, selectedImage->GetLargestPossibleRegion());
441 MatConstIterator_<unsigned short> it, end;
442 it = data.begin<
unsigned short>();
443 end = data.end<
unsigned short>();
446 while(!imageIterator.IsAtEnd())
448 mitk::CompositeCameraImageType::PixelType compositePixel = imageIterator.Get();
450 compositePixel[image.m_FilterNum] = *it;
470 cv::imshow(
"Display window", display);
479 slice[0] = cv::Range( image.m_FilterNum, image.m_FilterNum+1 );
480 slice[1] = cv::Range::all();
484 cv::Mat currentImageF32;
485 display.convertTo(currentImageF32, CV_32F);
487 currentImageF32 = currentImageF32.reshape(0, 1);
488 currentImageF32.copyTo(currentSlice);
490 cv::Mat currentWorkingSlice = currentSlice.clone();
493 MITK_INFO <<
"flat current: " << currentFlatfieldSlice.at<
float>(0,100);
496 MITK_INFO <<
"raw measured pixel value: " << currentWorkingSlice.at<
float>(0,100);
498 cv::divide(currentWorkingSlice, currentFlatfieldSlice, currentWorkingSlice);
499 MITK_INFO <<
"corrected by flatfield pixel: " << currentWorkingSlice.at<
float>(0,100);
501 cv::log(currentWorkingSlice, currentWorkingSlice);
502 currentWorkingSlice = -0.43429 * currentWorkingSlice;
503 MITK_INFO <<
"to absorption: " << currentWorkingSlice.at<
float>(0,100);
510 cv::Range oxyHemo[2];
511 oxyHemo[0] = cv::Range(0,1);
512 oxyHemo[1] = cv::Range::all();
514 cv::Range deOxyHemo[2];
515 deOxyHemo[0] = cv::Range(1,2);
516 deOxyHemo[1] = cv::Range::all();
518 cv::Mat saO2 = currentEstimate(oxyHemo) / (currentEstimate(oxyHemo) + currentEstimate(deOxyHemo));
521 MITK_INFO <<
"saO2, 200 200: " << saO2Image.at<
float>(200,200);
523 cv::threshold(saO2Image, saO2Image, 1., 1., cv::THRESH_TRUNC);
524 cv::threshold(saO2Image, saO2Image, 0., 0., cv::THRESH_TOZERO);
526 saO2Image = saO2Image * 637.;
528 cv::Mat SaO2IntImage;
529 saO2Image.convertTo(SaO2IntImage, CV_8U);
533 cv::applyColorMap(SaO2IntImage, colorImage, COLORMAP_JET);
534 cv::imshow(
"Oxygenation Estimate", colorImage);
543 catch (std::exception &e) {
550 int mitk::SpectroCamController_pimpl::OpenCameraConnection()
555 MITK_INFO <<
"Camera " << model <<
" is running in: " << mode <<
"-mode" << endl;
560 J_STATUS_TYPE status = spectroCam->initialize(model.c_str(), (std::string(
"C:\\") + model +
"\\").c_str());
562 if (status != J_ST_SUCCESS)
564 MITK_INFO <<
"Could not initialize camera!" << endl;
568 this->InitializeItkImage(this->m_CompositeItkImage_1);
569 this->InitializeItkImage(this->m_CompositeItkImage_2);
576 status = status | spectroCam->start(fastSettings);
579 else if (mode ==
"Sequence")
581 status = status | spectroCam->start(seqSettings);
584 else if (mode ==
"IndexFast")
586 indexSettings.filterModeSpeed = IndexModeSettings::INDEX_FAST;
587 status = status | spectroCam->start(indexSettings);
590 else if (mode ==
"IndexSlow")
592 indexSettings.filterModeSpeed = IndexModeSettings::INDEX_SLOW;
593 status = status | spectroCam->start(indexSettings);
596 else if (mode ==
"IndexTriggered")
598 indexSettings.filterModeSpeed = IndexModeSettings::INDEX_TRIGGERED;
599 status = status | spectroCam->start(indexSettings);
604 status = status | spectroCam->start(fastSettings);
609 if (status == J_ST_SUCCESS)
611 m_IsCameraRunning =
true;
615 cv::namedWindow(
"Display window", WINDOW_AUTOSIZE );
620 bool mitk::SpectroCamController_pimpl::isCameraRunning()
622 return m_IsCameraRunning;
628 int mitk::SpectroCamController_pimpl::CloseCameraConnection()
632 J_STATUS_TYPE retval = 0;
633 CAM_HANDLE hCam = spectroCam->GetCameraHandle();
638 retval = retval | J_Camera_ExecuteCommand(hCam, (int8_t*) NODE_NAME_ACQSTOP);
647 J_DataStream_StopAcquisition(m_hDS, ACQ_STOP_FLAG_KILL);
658 J_DataStream_FlushQueue(m_hDS, ACQ_QUEUE_INPUT_TO_OUTPUT);
659 J_DataStream_FlushQueue(m_hDS, ACQ_QUEUE_OUTPUT_DISCARD);
662 J_DataStream_RevokeBuffer(m_hDS, m_pAquBufferID, &pBuffer , &pPrivate);
675 J_DataStream_Close(m_hDS);
684 retval = retval | spectroCam->stop();
697 if (J_ST_SUCCESS == retval)
699 m_IsCameraRunning =
false;
708 m_SpectroCamController_pimpl =
new SpectroCamController_pimpl();
713 delete m_SpectroCamController_pimpl;
718 return m_SpectroCamController_pimpl->OpenCameraConnection();
723 return m_SpectroCamController_pimpl->CloseCameraConnection();
728 return m_SpectroCamController_pimpl->Ini();
733 return m_SpectroCamController_pimpl->isCameraRunning();
739 return m_SpectroCamController_pimpl->GetCurrentImage();
744 m_SpectroCamController_pimpl->SetCurrentImageAsWhiteBalance();
void SetCurrentImageAsWhiteBalance()
itk::VectorImage< unsigned short, 2 > CompositeCameraImageType
DataCollection - Class to facilitate loading/accessing structured data.
static mitk::SpectroCamController_pimpl * my_SpectroCamController
static cv::Mat createLLSQSolutionFromHMatrix()
int OpenCameraConnection()
mitk::Image::Pointer GetCurrentImage()
static void DisplayCameraStream(SpectroCamImage image)
int CloseCameraConnection()
mitk::Image::Pointer image
berry::Display * display
[MinimalApplicationClass_StartMethod]