Medical Imaging Interaction Toolkit  2018.4.99-389bf124
Medical Imaging Interaction Toolkit
QmitkToFRecorderWidget.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 ============================================================================*/
12 
13 #define _USE_MATH_DEFINES
14 #include "QmitkToFRecorderWidget.h"
15 
16 //QT headers
17 #include <QMessageBox>
18 #include <QComboBox>
19 #include <QLabel>
20 #include <QLayout>
21 #include <QGridLayout>
22 #include <QCheckBox>
23 #include <QFileDialog>
24 
25 //mitk headers
26 #include <mitkToFImageWriter.h>
27 
28 //itk headers
29 #pragma GCC visibility push(default)
30 #include <itkEventObject.h>
31 #pragma GCC visibility pop
32 #include <itksys/SystemTools.hxx>
33 
34 struct QFileDialogArgs;
35 class QFileDialogPrivate;
36 
37 const std::string QmitkToFRecorderWidget::VIEW_ID = "org.mitk.views.qmitktofrecorderwidget";
38 
39 QmitkToFRecorderWidget::QmitkToFRecorderWidget(QWidget* parent, Qt::WindowFlags f): QWidget(parent, f)
40 {
41  this->m_ToFImageRecorder = nullptr;
42  this->m_ToFImageGrabber = nullptr;
44 
45  this-> m_Controls = nullptr;
46  CreateQtPartControl(this);
47 }
48 
50 {
51 }
52 
54 {
55  if (!m_Controls)
56  {
57  // create GUI widgets
58  this->m_Controls = new Ui::QmitkToFRecorderWidgetControls;
59  this->m_Controls->setupUi(parent);
60  this->CreateConnections();
61  }
62 }
63 
65 {
66  if ( m_Controls )
67  {
68  connect( (QObject*)(m_Controls->m_PlayButton), SIGNAL(clicked()),(QObject*) this, SLOT(OnPlay()) );
69  connect( (QObject*)(m_Controls->m_StopButton), SIGNAL(clicked()),(QObject*) this, SLOT(OnStop()) );
70  connect( (QObject*)(m_Controls->m_StartRecordingButton), SIGNAL(clicked()),(QObject*) this, SLOT(OnStartRecorder()) );
71  connect( (QObject*)(m_Controls->m_RecordModeComboBox), SIGNAL(currentIndexChanged(int)),(QObject*) this, SLOT(OnChangeRecordModeComboBox(int)) );
72 
73  connect(this, SIGNAL(RecordingStopped()), this, SLOT(OnRecordingStopped()), Qt::BlockingQueuedConnection);
74  }
75 }
76 
78 {
79  this->m_ToFImageGrabber = toFImageGrabber;
80 
81  this->m_ToFImageRecorder = toFImageRecorder;
82 
83  this->m_StopRecordingCommand = CommandType::New();
85  this->m_ToFImageRecorder->RemoveAllObservers();
86  this->m_ToFImageRecorder->AddObserver(itk::AbortEvent(), this->m_StopRecordingCommand);
87 
88  m_Controls->m_PlayButton->setChecked(false);
89  m_Controls->m_PlayButton->setEnabled(true);
90  m_Controls->m_StartRecordingButton->setChecked(false);
91  m_Controls->m_RecorderGroupBox->setEnabled(true);
92 }
93 
95 {
96  emit RecordingStopped();
97 }
98 
100 {
101  m_Controls->m_PlayButton->setChecked(false);
102  m_Controls->m_PlayButton->setEnabled(true);
103  m_Controls->m_RecorderGroupBox->setEnabled(false);
104 }
105 
107 {
108  m_Controls->m_StartRecordingButton->setChecked(false);
109  m_Controls->m_RecorderGroupBox->setEnabled(true);
110 }
111 
113 {
114  StopCamera();
115  StopRecorder();
116 
118 
119  emit ToFCameraStopped();
120 }
121 
123 {
124  m_Controls->m_PlayButton->setChecked(true);
125  m_Controls->m_PlayButton->setEnabled(false);
126  m_Controls->m_RecorderGroupBox->setEnabled(true);
127  this->repaint();
128 
129  StartCamera();
130 
131  emit ToFCameraStarted();
132 }
133 
135 {
136  if (!m_ToFImageGrabber->IsCameraActive())
137  {
138  m_ToFImageGrabber->StartCamera();
139  }
140 }
141 
143 {
144  if( m_ToFImageGrabber.IsNotNull() )
145  m_ToFImageGrabber->StopCamera();
146 }
147 
149 {
150  if( m_ToFImageRecorder.IsNotNull() )
151  {
152  this->m_ToFImageRecorder->StopRecording();
153  }
154 }
155 
157 {
158  m_Controls->m_StartRecordingButton->setChecked(true);
159  m_Controls->m_RecorderGroupBox->setEnabled(false);
160  this->repaint();
161 
162  int numOfFrames = m_Controls->m_NumOfFramesSpinBox->value();
163  try
164  {
165  bool fileOK = true;
166  bool distanceImageSelected = true;
167  bool amplitudeImageSelected = false;
168  bool intensityImageSelected = false;
169  bool rgbImageSelected = false;
170  bool rawDataSelected = false;
171 
172  //Set check boxes in dialog according to device properties
173  m_ToFImageGrabber->GetCameraDevice()->GetBoolProperty("HasAmplitudeImage",amplitudeImageSelected);
174  m_ToFImageGrabber->GetCameraDevice()->GetBoolProperty("HasIntensityImage",intensityImageSelected);
175  m_ToFImageGrabber->GetCameraDevice()->GetBoolProperty("HasRGBImage",rgbImageSelected);
176 
177  QString tmpFileName("");
178  QString selectedFilter("");
179  QString imageFileName("");
181  tmpFileName = QmitkToFRecorderWidget::getSaveFileName(tofImageType,
182  distanceImageSelected, amplitudeImageSelected, intensityImageSelected, rgbImageSelected, rawDataSelected,
183  nullptr, "Save Image To...", imageFileName, "NRRD Images (*.nrrd);;PIC Images - deprecated (*.pic);;Text (*.csv)", &selectedFilter);
184 
185  if (tmpFileName.isEmpty())
186  {
187  fileOK = false;
188  }
189  else
190  {
191  imageFileName = tmpFileName;
192  }
193 
194  if (fileOK)
195  {
196  std::string dir = itksys::SystemTools::GetFilenamePath( imageFileName.toStdString() );
197  std::string baseFilename = itksys::SystemTools::GetFilenameWithoutLastExtension( imageFileName.toStdString() );
198  std::string extension = itksys::SystemTools::GetFilenameLastExtension( imageFileName.toStdString() );
199 
200  int integrationTime = this->m_ToFImageGrabber->GetIntegrationTime();
201  int modulationFreq = this->m_ToFImageGrabber->GetModulationFrequency();
202 
203  QString integrationTimeStr;
204  integrationTimeStr.setNum(integrationTime);
205  QString modulationFreqStr;
206  modulationFreqStr.setNum(modulationFreq);
207  QString numOfFramesStr("");
209  {
210  numOfFramesStr.setNum(numOfFrames);
211  }
212 
213  std::string distImageFileName = prepareFilename(dir, baseFilename, modulationFreqStr.toStdString(),
214  integrationTimeStr.toStdString(), numOfFramesStr.toStdString(), extension, "_DistanceImage");
215  MITK_INFO << "Save distance data to: " << distImageFileName;
216 
217  std::string amplImageFileName = prepareFilename(dir, baseFilename, modulationFreqStr.toStdString(),
218  integrationTimeStr.toStdString(), numOfFramesStr.toStdString(), extension, "_AmplitudeImage");
219  MITK_INFO << "Save amplitude data to: " << amplImageFileName;
220 
221  std::string intenImageFileName = prepareFilename(dir, baseFilename, modulationFreqStr.toStdString(),
222  integrationTimeStr.toStdString(), numOfFramesStr.toStdString(), extension, "_IntensityImage");
223  MITK_INFO << "Save intensity data to: " << intenImageFileName;
224 
225  std::string rgbImageFileName = prepareFilename(dir, baseFilename, modulationFreqStr.toStdString(),
226  integrationTimeStr.toStdString(), numOfFramesStr.toStdString(), extension, "_RGBImage");
227  MITK_INFO << "Save intensity data to: " << rgbImageFileName;
228 
229  if (selectedFilter.compare("Text (*.csv)") == 0)
230  {
231  this->m_ToFImageRecorder->SetFileFormat(".csv");
232  }
233  else if (selectedFilter.compare("PIC Images - deprecated (*.pic)") == 0)
234  {
235  //default
236  this->m_ToFImageRecorder->SetFileFormat(".pic");
237 
238  QMessageBox::warning(nullptr, "Deprecated File Format!",
239  "Please note that *.pic file format is deprecated and not longer supported! The suggested file format for images is *.nrrd!");
240  }
241  else if (selectedFilter.compare("NRRD Images (*.nrrd)") == 0)
242  {
243  this->m_ToFImageRecorder->SetFileFormat(".nrrd");
244  }
245  else
246  {
247  QMessageBox::warning(nullptr, "Unsupported file format!", "Please specify one of the supported file formats *.nrrd, *.csv!");
248  return;
249  }
250 
251  numOfFrames = m_Controls->m_NumOfFramesSpinBox->value();
252  this->m_ToFImageRecorder->SetDistanceImageFileName(distImageFileName);
253  this->m_ToFImageRecorder->SetAmplitudeImageFileName(amplImageFileName);
254  this->m_ToFImageRecorder->SetIntensityImageFileName(intenImageFileName);
255  this->m_ToFImageRecorder->SetRGBImageFileName(rgbImageFileName);
256  this->m_ToFImageRecorder->SetToFImageType(tofImageType);
257  this->m_ToFImageRecorder->SetDistanceImageSelected(distanceImageSelected);
258  this->m_ToFImageRecorder->SetAmplitudeImageSelected(amplitudeImageSelected);
259  this->m_ToFImageRecorder->SetIntensityImageSelected(intensityImageSelected);
260  this->m_ToFImageRecorder->SetRGBImageSelected(rgbImageSelected);
261  this->m_ToFImageRecorder->SetRecordMode(this->m_RecordMode);
262  this->m_ToFImageRecorder->SetNumOfFrames(numOfFrames);
263 
264  emit RecordingStarted();
265  this->m_ToFImageRecorder->StartRecording();
266  }
267  else
268  {
269  this->OnRecordingStopped();
270  }
271  }
272  catch(std::exception& e)
273  {
274  QMessageBox::critical(nullptr, "Error", QString(e.what()));
275  this->OnRecordingStopped();
276  }
277 }
278 
280  bool& distanceImageSelected,
281  bool& amplitudeImageSelected,
282  bool& intensityImageSelected,
283  bool& rgbImageSelected,
284  bool& rawDataSelected,
285  QWidget *parent,
286  const QString &caption,
287  const QString &dir,
288  const QString &filter,
289  QString *selectedFilter,
290  QFileDialog::Options
291  )
292 {
293  QString selectedFileName = "";
294  QComboBox* combo = new QComboBox;
295  combo->addItem("3D");
296  combo->addItem("2D + t");
297 
298  QHBoxLayout* checkBoxGroup = new QHBoxLayout();
299 
300  QCheckBox* distanceImageCheckBox = new QCheckBox;
301  distanceImageCheckBox->setText("Distance image");
302  distanceImageCheckBox->setChecked(distanceImageSelected);
303 
304  QCheckBox* amplitudeImageCheckBox = new QCheckBox;
305  amplitudeImageCheckBox->setText("Amplitude image");
306  amplitudeImageCheckBox->setChecked(amplitudeImageSelected);
307  amplitudeImageCheckBox->setEnabled(amplitudeImageSelected);
308  if(!amplitudeImageSelected)
309  amplitudeImageCheckBox->setToolTip(QString("This device does not provide amplitude data."));
310 
311  QCheckBox* intensityImageCheckBox = new QCheckBox;
312  intensityImageCheckBox->setText("Intensity image");
313  intensityImageCheckBox->setChecked(intensityImageSelected);
314  intensityImageCheckBox->setEnabled(intensityImageSelected);
315  if(!intensityImageSelected)
316  intensityImageCheckBox->setToolTip(QString("This device does not provide intensity data."));
317 
318  QCheckBox* rgbImageCheckBox = new QCheckBox;
319  rgbImageCheckBox->setText("RGB image");
320  rgbImageCheckBox->setChecked(rgbImageSelected);
321  rgbImageCheckBox->setEnabled(rgbImageSelected);
322  if(!rgbImageSelected)
323  rgbImageCheckBox->setToolTip(QString("This device does not provide RGB data."));
324 
325  QCheckBox* rawDataCheckBox = new QCheckBox;
326  rawDataCheckBox->setText("Raw data");
327  rawDataCheckBox->setChecked(false);
328  rawDataCheckBox->setEnabled(false);
329 
330  checkBoxGroup->addWidget(distanceImageCheckBox);
331  checkBoxGroup->addWidget(amplitudeImageCheckBox);
332  checkBoxGroup->addWidget(intensityImageCheckBox);
333  checkBoxGroup->addWidget(rgbImageCheckBox);
334  checkBoxGroup->addWidget(rawDataCheckBox);
335 
336  QFileDialog* fileDialog = new QFileDialog(parent, caption, dir, filter);
337 
338  QLayout* layout = fileDialog->layout();
339  QGridLayout* gridbox = qobject_cast<QGridLayout*>(layout);
340 
341  if (gridbox)
342  {
343  gridbox->addWidget(new QLabel("ToF-Image type:"));
344  gridbox->addWidget(combo);
345  int lastRow = gridbox->rowCount();
346  gridbox->addLayout(checkBoxGroup, lastRow, 0, 1, -1);
347  }
348 
349  fileDialog->setLayout(gridbox);
350  fileDialog->setAcceptMode(QFileDialog::AcceptSave);
351 
352  if (selectedFilter)
353  {
354  fileDialog->selectNameFilter(*selectedFilter);
355  }
356 
357  if (fileDialog->exec() == QDialog::Accepted)
358  {
359  if (selectedFilter)
360  {
361  *selectedFilter = fileDialog->selectedNameFilter();
362  }
363 
364  if (combo->currentIndex() == 0)
365  {
367  }
368 
369  else
370  {
372  }
373 
374  distanceImageSelected = distanceImageCheckBox->isChecked();
375  amplitudeImageSelected = amplitudeImageCheckBox->isChecked();
376  intensityImageSelected = intensityImageCheckBox->isChecked();
377  rgbImageSelected = rgbImageCheckBox->isChecked();
378  rawDataSelected = rawDataCheckBox->isChecked();
379 
380  selectedFileName = fileDialog->selectedFiles().value(0);
381  }
382 
383  delete fileDialog;
384  return selectedFileName;
385 }
386 
387 std::string QmitkToFRecorderWidget::prepareFilename(std::string dir,
388  std::string baseFilename,
389  std::string modulationFreq,
390  std::string integrationTime,
391  std::string numOfFrames,
392  std::string extension,
393  std::string imageType)
394 {
395  std::string filenName("");
396  filenName.append(dir);
397  filenName.append("/");
398  filenName.append(baseFilename);
399  filenName.append("_MF");
400  filenName.append(modulationFreq);
401  filenName.append("_IT");
402  filenName.append(integrationTime);
403  filenName.append("_");
404  filenName.append(numOfFrames);
405  filenName.append("Images");
406  filenName.append(imageType);
407  filenName.append(extension);
408  return filenName;
409 }
410 
412 {
413  if (index == 0)
414  {
416  m_Controls->m_NumOfFramesSpinBox->setEnabled(true);
417  }
418  else
419  {
421  m_Controls->m_NumOfFramesSpinBox->setEnabled(false);
422  }
423 }
#define MITK_INFO
Definition: mitkLogMacros.h:18
void ToFCameraStarted()
signal emitted when "Play" button is pressed
void ToFCameraStopped()
signal emitted when "Stop" button is pressed
void OnStartRecorder()
slot invoking to start the recording After letting the user chose a file location for the record...
void StopRecorder()
stops the recording by calling ToFImageRecorder::StopRecording()
mitk::ToFImageRecorder::RecordMode m_RecordMode
member holding the RecordMode of the recorder (PerFrame / Infinite)
void OnRecordingStopped()
slot resetting the GUI elements of the recording box
void StopCamera()
stops the camera by calling ToFImageGrabber::StopCamera()
CommandType::Pointer m_StopRecordingCommand
itkCommand for abort of recording
Recorder class for ToF images.
virtual void CreateQtPartControl(QWidget *parent)
void SetParameter(mitk::ToFImageGrabber *ToFImageGrabber, mitk::ToFImageRecorder *toFImageRecorder)
Set the parameters used for this widget.
void OnStop()
slot invoking to stop the camera and the recorder. Calls StopCamera() and StopRecorder and emits ToFC...
Ui::QmitkToFRecorderWidgetControls * m_Controls
member holding the UI elements of this widget
void StopRecordingCallback()
emits RecordingStopped signal.
void StartCamera()
starts the camera by calling ToFImageGrabber::StartCamera()
void RecordingStopped()
signal emitted AbortEvent() in ToFImageRecorder is observed
void OnPlay()
slot invoking to start the camera. Calls StartCamera() and emits ToFCameraStarted signal ...
Image source providing ToF images. Interface for filters provided in ToFProcessing module...
QmitkToFRecorderWidget(QWidget *p=nullptr, Qt::WindowFlags f1=nullptr)
std::string prepareFilename(std::string dir, std::string baseFilename, std::string modulationFreq, std::string integrationTime, std::string numOfFrames, std::string extension, std::string imageType)
method creating a filename from the given information
static const std::string VIEW_ID
void RecordingStarted()
signal emitted when recording is started
void OnChangeRecordModeComboBox(int index)
slot activating/deactivating "number of frames" spin box dependent on recording mode (PerFrame / Infi...
mitk::ToFImageRecorder::Pointer m_ToFImageRecorder
member holding the recorder for ToF images
mitk::ToFImageGrabber::Pointer m_ToFImageGrabber
member holding the ToFImageGrabber for acquiring ToF images
void ResetGUIToInitial()
resets the GUI elements to the initial state. Play button: enabled, Stop button: disabled, Recording box: disabled
static QString getSaveFileName(mitk::ToFImageWriter::ToFImageType &tofImageType, bool &distanceImageSelected, bool &amplitudeImageSelected, bool &intensityImageSelected, bool &rgbImageSelected, bool &rawDataSelected, QWidget *parent=nullptr, const QString &caption=QString(), const QString &dir=QString(), const QString &filter=QString(), QString *selectedFilter=nullptr, QFileDialog::Options options=nullptr)
adapted version of QFileDialog::getSaveFileName() The user is now asked to choose which images he wan...