Medical Imaging Interaction Toolkit  2018.4.99-389bf124
Medical Imaging Interaction Toolkit
mitkSpectroCamController.cpp
Go to the documentation of this file.
1 /*============================================================================
2 
3 The Medical Imaging Interaction Toolkit (MITK)
4 
5 Copyright (c) German Cancer Research Center (DKFZ)
6 All rights reserved.
7 
8 Use of this source code is governed by a 3-clause BSD license that can be
9 found in the LICENSE file.
10 
11 ============================================================================*/
13 #include "mitkLogMacros.h"
15 #include <mitkImageCast.h>
16 
17 
18 #include <fstream>
19 #include <string>
20 #include <iostream>
21 #include <functional>
22 
23 //OpenCv includes
24 #include <opencv\cv.h>
25 #include <opencv\cxcore.h>
26 #include <opencv\highgui.h>
27 #include <opencv2/contrib/contrib.hpp>
28 
29 // itk includes
30 #include <itkImage.h>
31 #include <itkComposeImageFilter.h>
32 
33 //Spectrocam includes
34 #include <ISpectroCam.h>
35 #include <Jai_Factory.h>
36 
37 
38 
39 using namespace std;
40 using namespace cv;
41 
42 
43 namespace mitk {
44 
45 
46  typedef itk::VectorImage<unsigned short, 2> CompositeCameraImageType;
47 
55  class SpectroCamController_pimpl
56  {
57  public:
58  SpectroCamController_pimpl();
59  ~SpectroCamController_pimpl();
60 
61  bool Ini();
62  int OpenCameraConnection();
63  int CloseCameraConnection();
64  bool isCameraRunning();
65 
66 
67  void SetCurrentImageAsWhiteBalance();
68 
69  mitk::Image::Pointer GetCurrentImage();
70 
71  CompositeCameraImageType::Pointer m_CompositeItkImage_1;
72  CompositeCameraImageType::Pointer m_CompositeItkImage_2;
73  mitk::Image::Pointer m_CompositeMitkImage;
74 
75  cv::Mat m_CurrentStackSmall;
76  cv::Mat m_CurrentTransformedStack;
77  cv::Mat m_FlatfieldSmall;
78  cv::Mat m_LLSQSolutionSmall;
79 
80  const int m_FullWidth;
81  const int m_FullHeight;
82 
83  const int m_SmallWidth;
84  const int m_SmallHeight;
85 
86  bool m_ShowOxygenation;
87 
88  // for image double buffer swap
89  bool m_Image1Selected;
90 
91  std::string mode;
92  std::string model;
93 
94  private:
95 
96  void InitializeItkImage(mitk::CompositeCameraImageType::Pointer& compositeImage);
97 
98  bool m_IsCameraRunning;
99 
100  unsigned m_NumRecordedImages;
101 
102  ISpectroCam* spectroCam; //SpectroCam var
103 
104  STREAM_HANDLE m_hDS; // Handle to the data stream
105 
106  uint32_t m_iValidBuffers; // Number of buffers allocated to image acquisition
107  BUF_HANDLE m_pAquBufferID; // Handles for all the image buffers
108  HANDLE m_hEventKill; // Event used for speeding up the termination of image capture
109 
110 
111  //Vars for Ini from file
112  FastModeSettings fastSettings;
113  SequenceModeSettings seqSettings;
114  IndexModeSettings indexSettings;
115 
116  void SaveCameraStreamToDisk();
117  };
118 
119 }
120 
121 
122 // Implementation
123 
124 static mitk::SpectroCamController_pimpl* my_SpectroCamController;
125 
126 mitk::Image::Pointer mitk::SpectroCamController_pimpl::GetCurrentImage()
127 {
128  mitk::CompositeCameraImageType::Pointer selectedImage;
129 
130  // TODO SW: semaphore here so it cannot interfere with callback readout of m_Image1Selected
131  if (this->m_Image1Selected)
132  {
133  this->m_Image1Selected = !this->m_Image1Selected;
134  selectedImage = this->m_CompositeItkImage_1;
135  }
136  else
137  {
138  this->m_Image1Selected = !this->m_Image1Selected;
139  selectedImage = this->m_CompositeItkImage_2;
140  }
141 
142  this->m_CompositeMitkImage = mitk::Image::New();
143  MITK_INFO << "Image created";
144  this->m_CompositeMitkImage->InitializeByItk<mitk::CompositeCameraImageType>(selectedImage);
145  MITK_INFO << "Initialized image by ITK";
146  this->m_CompositeMitkImage->SetVolume(selectedImage->GetBufferPointer());
147  MITK_INFO << "Copied data";
148 
149 
150  return m_CompositeMitkImage;
151 }
152 
154 {
155  //Create the H-Matrix
156  // Ox DOx //Lookup values at http://omlc.org/spectra/hemoglobin/summary.html
157  float H[8][4]= {{50104 , 37020. , 405, 1.}, //Filter0 = 580nm +- 10
158  {33209.2 , 16156.4 , 785., 1.}, //Filter1 = 470nm +- 10
159  {319.6 , 3226.56 , 280., 1.}, //Filter2 = 660nm +- 10
160  {32613.2 , 53788 , 495., 1.}, //Filter3 = 560nm +- 10
161  {26629.2 , 14550 , 760., 1.}, //Filter4 = 480nm +- 12,5
162  {20035.2 , 25773.6 , 665., 1.}, //Filter5 = 511nm +- 10 ->took 510nm
163  {3200 , 14677.2 , 380., 1.}, //Filter6 = 600nm +- 10
164  {290 , 1794.28 , 220., 1.}}; //Filter7 = 700nm
165 
166  //Create the hMatrix
167  cv::Mat hMatrix = cv::Mat(8, 4, CV_32F, &H ); //cv::Mat(rows, cols, type, fill with)
168 
169  cv::Mat transH;
170  transpose(hMatrix,transH);
171  cv::Mat mulImage = transH * hMatrix;
172  cv::Mat invImage = mulImage.inv();
173  cv::Mat HCompononentsForLLSQ = invImage * transH;
174 
175  return HCompononentsForLLSQ;
176 }
177 
178 mitk::SpectroCamController_pimpl::SpectroCamController_pimpl()
179  :m_hDS(nullptr),
180  m_NumRecordedImages(1),
181  m_IsCameraRunning(false),
182  m_SmallWidth(614),
183  m_SmallHeight(514),
184  m_FullWidth(2456),
185  m_FullHeight(2058),
186  m_Image1Selected(true),
187  m_ShowOxygenation(false)
188 {
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));
193 
194 
195  m_LLSQSolutionSmall = createLLSQSolutionFromHMatrix();
196 
197 
198 }
199 
200 void mitk::SpectroCamController_pimpl::SetCurrentImageAsWhiteBalance()
201 {
202  // deep copy of current image stack
203  m_FlatfieldSmall = m_CurrentStackSmall.clone();
204 
205  cv::namedWindow("Oxygenation Estimate", WINDOW_AUTOSIZE);
206  m_ShowOxygenation = true;
207 }
208 
209 
210 
211 mitk::SpectroCamController_pimpl::~SpectroCamController_pimpl()
212 {
213 }
214 
215 
216 
217 
218 
219 void mitk::SpectroCamController_pimpl::SaveCameraStreamToDisk()
220 {
221  /*
222  //=================================Save Images to HDD=================================
223  imagesRecoreded=0;
224 
225  //If Rec is pressed -> Save Images to Harddrive
226  if (rec == true) //On pressing the Rec-Button we wan to save x Stacks with 8 images each
227  {
228  //Save Image
229  saveImage(in); //std::cout<< "save no."<< imagesRecoreded<< std::endl;
230  //Icrement counter
231  imagesRecoreded++;
232 
233  if (imagesRecoreded >= (NumberOfStacksToBeRecorded*8) ) //If number of images is bigger or equal to the the Image Stack we want to tecord, untoggle the rec button and reset the counter!
234  {
235  imagesRecoreded=0;
236  rec=false;
237  ReCButtonControl_Pointer->EnableWindow(TRUE);
238  }
239  }
240  */
241 }
242 
243 
244 
245 //Initialize Camera Controller
246 bool mitk::SpectroCamController_pimpl::Ini()
247 {
248  //===============Get Ini from File===============
249  //Get model from file std::string CChildWindowSampleDlg::getModelNameFromIni()
250  std::ifstream fin("C:\\ModeSettings.txt"); //Set File to read
251  std::ofstream fout("C:\\ModeSettingsCheck.txt"); //Set output
252  const int bufferSize = 1000;
253  char buffer[bufferSize];
254 
255  if (fin.fail())
256  {
257  MITK_INFO << "Failed opening file ModeSettings.txt!" << endl ;
258  }
259 
260  fin.getline(buffer, bufferSize);
261  fin.getline(buffer, bufferSize);
262  model = buffer;
263 
264 
265  //Get mode from file
266  //Skipping model, getting mode
267  for (int i = 0; i < 3; ++i)
268  {
269  fin.getline(buffer, bufferSize);
270  fout << buffer << endl;
271  }
272 
273  mode = buffer;
274 
275  // [FastModeExposure]
276  for (int i = 0; i < 2; ++i)
277  {
278  fin.getline(buffer, bufferSize);
279  fout << buffer << endl;
280  }
281 
282  fin >> fastSettings.exposure;
283  fout << fastSettings.exposure << endl;;
284 
285  // [FastModeGain]
286  for (int i = 0; i < 3; ++i)
287  {
288  fin.getline(buffer, bufferSize);
289  fout << buffer << endl;
290  }
291 
292  fin >> fastSettings.gain;
293  fout << fastSettings.gain << endl;
294 
295  // [SequenceModeExposures]
296  for (int i = 0; i < 3; ++i)
297  {
298  fin.getline(buffer, bufferSize);
299  fout << buffer << endl;
300  }
301 
302  for (int i = 0; i < NUMBER_FILTERS; ++i)
303  {
304  fin >> seqSettings.exposures[i];
305  fout << seqSettings.exposures[i] << endl;
306  }
307 
308  // [SequenceModeGains]
309  for (int i = 0; i < 3; ++i)
310  {
311  fin.getline(buffer, bufferSize);
312  fout << buffer << endl;
313  }
314 
315  for (int i = 0; i < NUMBER_FILTERS; ++i)
316  {
317  fin >> seqSettings.gains[i];
318  fout << seqSettings.gains[i] << endl;
319  }
320 
321  // [IndexModeExposures]
322  for (int i = 0; i < 3; ++i)
323  {
324  fin.getline(buffer, bufferSize);
325  fout << buffer << endl;
326  }
327 
328  for (int i = 0; i < NUMBER_FILTERS; ++i)
329  {
330  fin >> indexSettings.exposures[i];
331  fout << indexSettings.exposures[i] << endl;
332  }
333 
334  // [IndexModeGains]
335  for (int i = 0; i < 3; ++i)
336  {
337  fin.getline(buffer, bufferSize);
338  fout << buffer << endl;
339  }
340  for (int i = 0; i < NUMBER_FILTERS; ++i)
341  {
342  fin >> indexSettings.gains[i];
343  fout << indexSettings.gains[i] << endl;
344  }
345 
346  // [IndexModeNumberFilterIterations]
347  for (int i = 0; i < 3; ++i)
348  {
349  fin.getline(buffer, bufferSize);
350  fout << buffer << endl;
351  }
352 
353  for (int i = 0; i < NUMBER_FILTERS; ++i)
354  {
355  fin >> indexSettings.numFilterIterations[i];
356  fout << indexSettings.numFilterIterations[i] << endl;
357  }
358 
359  //After reading files -> close stream
360  fin.close();
361  fout.close();
362 
363  return 0;
364 
365 }
366 
367 void mitk::SpectroCamController_pimpl::InitializeItkImage(mitk::CompositeCameraImageType::Pointer& compositeImage)
368 {
369  if (compositeImage.IsNull())
370  {
371 
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;
377  size.Fill( 1 );
378  size[0] = this->m_FullWidth;
379  size[1] = this->m_FullHeight;
380  index.Fill(0);
381  spacing.Fill(1);
382  region.SetSize(size);
383  region.SetIndex(index);
384 
385  compositeImage = mitk::CompositeCameraImageType::New();
386  compositeImage->SetRegions(region);
387  compositeImage->SetSpacing(spacing);
388  compositeImage->SetNumberOfComponentsPerPixel(NUMBER_FILTERS);
389  compositeImage->Allocate();
390  }
391 }
392 
397 static void DisplayCameraStream(SpectroCamImage image)
398 {
399 
400  MITK_INFO << "image callback call";
401  try
402  {
403  if (image.m_FilterNum < 0 || image.m_FilterNum >= NUMBER_FILTERS)
404  {
405  std::cout << "Filter number out of range.\n"<< std::endl;
406  }
407  else
408  {
409  // Allocate the buffer to hold converted the image. (We only want to do this once for performance reasons)
410  if (image.m_pAcqImage->pImageBuffer == nullptr)
411  {
412  if (J_Image_Malloc(image.m_pAcqImage, image.m_pAcqImage) != J_ST_SUCCESS)
413  {
414  return;
415  }
416  }
417 
418 
419  //============= Get data from spectrocam to opencv
420 
421  // TODO SW: probably we can get around this memcopy by simply setting data pointer? Not sure.
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); //Copy Image from JAI-Format to OCV´s IplImage
424 
425 
426  //============= From opencv to mitk::Image (VectorImage)
427 
428  mitk::CompositeCameraImageType::Pointer selectedImage;
429 
430  if (my_SpectroCamController->m_Image1Selected)
431  {
432  selectedImage = my_SpectroCamController->m_CompositeItkImage_1;
433  }
434  else
435  {
436  selectedImage = my_SpectroCamController->m_CompositeItkImage_2;
437  }
438 
439  itk::ImageRegionIterator<mitk::CompositeCameraImageType> imageIterator(selectedImage, selectedImage->GetLargestPossibleRegion());
440 
441  MatConstIterator_<unsigned short> it, end;
442  it = data.begin<unsigned short>();
443  end = data.end<unsigned short>();
444 
445 
446  while(!imageIterator.IsAtEnd())
447  {
448  mitk::CompositeCameraImageType::PixelType compositePixel = imageIterator.Get();
449 
450  compositePixel[image.m_FilterNum] = *it;
451 
452  ++it;
453  ++imageIterator;
454  }
455 
456  //both matrix and itk image shall reach end at the same time.
457  assert(it == end);
458 
459 
460  //============= Display image as opencv window ==
461 
462  cv::Mat display;
463  cv::resize(data, display, cvSize(my_SpectroCamController->m_SmallWidth, my_SpectroCamController->m_SmallHeight) ); //do some resizeing for faster display
464 
465  display *= 16; // image is only 12 bit large, but datatype is 16 bit. Expand to full range for displaying by multiplying by 2^4.
466 
467 
468 
469  //Display Image
470  cv::imshow("Display window", display); //Display image
471  //MITK_INFO << "pixel 100,100" << display.at<unsigned short>(0,100);
472 
473 
474  //============= TODO: live oxygenation estimation
475 
476  if (my_SpectroCamController->m_ShowOxygenation)
477  {
478  cv::Range slice[2];
479  slice[0] = cv::Range( image.m_FilterNum, image.m_FilterNum+1 );
480  slice[1] = cv::Range::all();
481 
482  cv::Mat currentSlice = my_SpectroCamController->m_CurrentStackSmall(slice);
483 
484  cv::Mat currentImageF32;
485  display.convertTo(currentImageF32, CV_32F);
486 
487  currentImageF32 = currentImageF32.reshape(0, 1);
488  currentImageF32.copyTo(currentSlice);
489 
490  cv::Mat currentWorkingSlice = currentSlice.clone();
491 
492  cv::Mat currentFlatfieldSlice = my_SpectroCamController->m_FlatfieldSmall(slice);
493  MITK_INFO << "flat current: " << currentFlatfieldSlice.at<float>(0,100);
494 
495 
496  MITK_INFO << "raw measured pixel value: " << currentWorkingSlice.at<float>(0,100);
497 
498  cv::divide(currentWorkingSlice, currentFlatfieldSlice, currentWorkingSlice);
499  MITK_INFO << "corrected by flatfield pixel: " << currentWorkingSlice.at<float>(0,100);
500 
501  cv::log(currentWorkingSlice, currentWorkingSlice);
502  currentWorkingSlice = -0.43429 * currentWorkingSlice;
503  MITK_INFO << "to absorption: " << currentWorkingSlice.at<float>(0,100);
504 
505  currentWorkingSlice.copyTo(my_SpectroCamController->m_CurrentTransformedStack(slice) );
506 
507  //MITK_INFO << "slice 0: " << my_SpectroCamController->m_CurrentTransformedStack.at<float>(0,100);;
508 
509  cv::Mat currentEstimate = my_SpectroCamController->m_LLSQSolutionSmall * my_SpectroCamController->m_CurrentTransformedStack;
510  cv::Range oxyHemo[2];
511  oxyHemo[0] = cv::Range(0,1);
512  oxyHemo[1] = cv::Range::all();
513 
514  cv::Range deOxyHemo[2];
515  deOxyHemo[0] = cv::Range(1,2);
516  deOxyHemo[1] = cv::Range::all();
517 
518  cv::Mat saO2 = currentEstimate(oxyHemo) / (currentEstimate(oxyHemo) + currentEstimate(deOxyHemo));
519 
520  cv::Mat saO2Image = saO2.reshape(0, my_SpectroCamController->m_SmallHeight);
521  MITK_INFO << "saO2, 200 200: " << saO2Image.at<float>(200,200);
522 
523  cv::threshold(saO2Image, saO2Image, 1., 1., cv::THRESH_TRUNC);
524  cv::threshold(saO2Image, saO2Image, 0., 0., cv::THRESH_TOZERO);
525 
526  saO2Image = saO2Image * 637.;// 255.;
527 
528  cv::Mat SaO2IntImage;
529  saO2Image.convertTo(SaO2IntImage, CV_8U);
530  // MITK_INFO << saO2Image.at<float>(0,100);
531 
532  cv::Mat colorImage;
533  cv::applyColorMap(SaO2IntImage, colorImage, COLORMAP_JET);
534  cv::imshow("Oxygenation Estimate", colorImage); //Display image
535  }
536 
537 
538  cv::waitKey(1);
539  }
540 
541  }//try
542 
543  catch (std::exception &e) {
544  MITK_INFO << e.what();
545  }
546 }
547 
548 
549 
550 int mitk::SpectroCamController_pimpl::OpenCameraConnection()
551 {
552  //=====================OpenFactoryAndCamera=====================
553  //Create Factory and cam based on //BOOL OpenFactoryAndCamera(); // Open factory and search for cameras. Open first camera
554  spectroCam = CreateSpectroCam(&DisplayCameraStream, nullptr, 0);
555  MITK_INFO << "Camera " << model << " is running in: " << mode << "-mode" << endl;
556 
557 
558 
559  //=====================Open Streams=====================
560  J_STATUS_TYPE status = spectroCam->initialize(model.c_str(), (std::string("C:\\") + model + "\\").c_str());
561 
562  if (status != J_ST_SUCCESS)
563  {
564  MITK_INFO << "Could not initialize camera!" << endl;
565  }
566 
567  // initialize VectorImage
568  this->InitializeItkImage(this->m_CompositeItkImage_1);
569  this->InitializeItkImage(this->m_CompositeItkImage_2);
570 
571 
572 
573  //=====================Open Streams=====================
574  if (mode == "Fast")
575  {
576  status = status | spectroCam->start(fastSettings);
577  }
578 
579  else if (mode == "Sequence")
580  {
581  status = status | spectroCam->start(seqSettings);
582  }
583 
584  else if (mode == "IndexFast")
585  {
586  indexSettings.filterModeSpeed = IndexModeSettings::INDEX_FAST;
587  status = status | spectroCam->start(indexSettings);
588  }
589 
590  else if (mode == "IndexSlow")
591  {
592  indexSettings.filterModeSpeed = IndexModeSettings::INDEX_SLOW;
593  status = status | spectroCam->start(indexSettings);
594  }
595 
596  else if (mode == "IndexTriggered")
597  {
598  indexSettings.filterModeSpeed = IndexModeSettings::INDEX_TRIGGERED;
599  status = status | spectroCam->start(indexSettings);
600  }
601 
602  else
603  {
604  status = status | spectroCam->start(fastSettings);
605  }
606 
607  MITK_INFO << "status flag: " << status;
608 
609  if (status == J_ST_SUCCESS)
610  {
611  m_IsCameraRunning = true;
612  }
613 
614 
615  cv::namedWindow( "Display window", WINDOW_AUTOSIZE );// Create a window for display.
616 
617  return status;
618 }
619 
620 bool mitk::SpectroCamController_pimpl::isCameraRunning()
621 {
622  return m_IsCameraRunning;
623 }
624 
625 
626 
627 //Method to close down connections
628 int mitk::SpectroCamController_pimpl::CloseCameraConnection()
629 {
630 
631  // On click -> Stop acquisition
632  J_STATUS_TYPE retval = 0;
633  CAM_HANDLE hCam = spectroCam->GetCameraHandle();
634 
635  // Stop Acquision
636  if (hCam)
637  {
638  retval = retval | J_Camera_ExecuteCommand(hCam, (int8_t*) NODE_NAME_ACQSTOP);
639  }
640 
641 
642  MITK_INFO << "execute acqstop command";
643 
644 
645  // Close stream (this frees all allocated buffers)
646  // Stop the image acquisition engine
647  J_DataStream_StopAcquisition(m_hDS, ACQ_STOP_FLAG_KILL);
648 
649 
650  MITK_INFO << "execute stop aqui";
651 
652  // UnPrepare Buffers (this removed the buffers from the acquisition engine and frees buffers)
653  {
654  void *pPrivate;
655  void *pBuffer;
656 
657  // Flush Queues
658  J_DataStream_FlushQueue(m_hDS, ACQ_QUEUE_INPUT_TO_OUTPUT);
659  J_DataStream_FlushQueue(m_hDS, ACQ_QUEUE_OUTPUT_DISCARD);
660 
661  // Remove the frame buffer from the Acquisition engine.
662  J_DataStream_RevokeBuffer(m_hDS, m_pAquBufferID, &pBuffer , &pPrivate);
663 
664  m_pAquBufferID = 0;
665 
666  m_iValidBuffers = 0;
667  }
668 
669  MITK_INFO << "unprepared buffers";
670 
671 
672  // Close Stream
673  if(m_hDS)
674  {
675  J_DataStream_Close(m_hDS);
676  m_hDS = nullptr;
677  }
678 
679 
680  MITK_INFO << "closed stream";
681 
682  //===================Close Factory and destroy Cam=====================
683  //void CloseFactoryAndCamera(); // Close camera and factory to clean up
684  retval = retval | spectroCam->stop();
685 
686 
687  MITK_INFO << "stopped camera";
688 
689  //BOOL TerminateStreamThread(void); // Terminate the image acquisition thread
690  if (spectroCam)
691  {
692  //DestroySpectroCam(spectroCam); //Destroy SpectroCam-Objekt
693  }
694 
695  MITK_INFO << "destroyed spectrocam";
696 
697  if (J_ST_SUCCESS == retval)
698  {
699  m_IsCameraRunning = false;
700  }
701 
702  return retval;
703 }
704 
705 
707 {
708  m_SpectroCamController_pimpl = new SpectroCamController_pimpl();
709 }
710 
712 {
713  delete m_SpectroCamController_pimpl;
714 }
715 
717 {
718  return m_SpectroCamController_pimpl->OpenCameraConnection();
719 }
720 
722 {
723  return m_SpectroCamController_pimpl->CloseCameraConnection();
724 }
725 
727 {
728  return m_SpectroCamController_pimpl->Ini();
729 }
730 
732 {
733  return m_SpectroCamController_pimpl->isCameraRunning();
734 }
735 
736 
738 {
739  return m_SpectroCamController_pimpl->GetCurrentImage();
740 }
741 
743 {
744  m_SpectroCamController_pimpl->SetCurrentImageAsWhiteBalance();
745 }
#define MITK_INFO
Definition: mitkLogMacros.h:18
itk::VectorImage< unsigned short, 2 > CompositeCameraImageType
STL namespace.
DataCollection - Class to facilitate loading/accessing structured data.
static mitk::SpectroCamController_pimpl * my_SpectroCamController
static cv::Mat createLLSQSolutionFromHMatrix()
mitk::Image::Pointer GetCurrentImage()
static void DisplayCameraStream(SpectroCamImage image)
mitk::Image::Pointer image
static Pointer New()
berry::Display * display
[MinimalApplicationClass_StartMethod]