MITK-IGT
IGT Extension of MITK
Loading...
Searching...
No Matches
QmitkToFRecorderWidget.cpp
Go to the documentation of this file.
1/*============================================================================
2
3The Medical Imaging Interaction Toolkit (MITK)
4
5Copyright (c) German Cancer Research Center (DKFZ)
6All rights reserved.
7
8Use of this source code is governed by a 3-clause BSD license that can be
9found in the LICENSE file.
10
11============================================================================*/
12
13#define _USE_MATH_DEFINES
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
34struct QFileDialogArgs;
35class QFileDialogPrivate;
36
37const std::string QmitkToFRecorderWidget::VIEW_ID = "org.mitk.views.qmitktofrecorderwidget";
38
39QmitkToFRecorderWidget::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;
47}
48
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
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);;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("NRRD Images (*.nrrd)") == 0)
234 {
235 this->m_ToFImageRecorder->SetFileFormat(".nrrd");
236 }
237 else
238 {
239 QMessageBox::warning(nullptr, "Unsupported file format!", "Please specify one of the supported file formats *.nrrd, *.csv!");
240 return;
241 }
242
243 numOfFrames = m_Controls->m_NumOfFramesSpinBox->value();
244 this->m_ToFImageRecorder->SetDistanceImageFileName(distImageFileName);
245 this->m_ToFImageRecorder->SetAmplitudeImageFileName(amplImageFileName);
246 this->m_ToFImageRecorder->SetIntensityImageFileName(intenImageFileName);
247 this->m_ToFImageRecorder->SetRGBImageFileName(rgbImageFileName);
248 this->m_ToFImageRecorder->SetToFImageType(tofImageType);
249 this->m_ToFImageRecorder->SetDistanceImageSelected(distanceImageSelected);
250 this->m_ToFImageRecorder->SetAmplitudeImageSelected(amplitudeImageSelected);
251 this->m_ToFImageRecorder->SetIntensityImageSelected(intensityImageSelected);
252 this->m_ToFImageRecorder->SetRGBImageSelected(rgbImageSelected);
253 this->m_ToFImageRecorder->SetRecordMode(this->m_RecordMode);
254 this->m_ToFImageRecorder->SetNumOfFrames(numOfFrames);
255
256 emit RecordingStarted();
257 this->m_ToFImageRecorder->StartRecording();
258 }
259 else
260 {
261 this->OnRecordingStopped();
262 }
263 }
264 catch(std::exception& e)
265 {
266 QMessageBox::critical(nullptr, "Error", QString(e.what()));
267 this->OnRecordingStopped();
268 }
269}
270
272 bool& distanceImageSelected,
273 bool& amplitudeImageSelected,
274 bool& intensityImageSelected,
275 bool& rgbImageSelected,
276 bool& rawDataSelected,
277 QWidget *parent,
278 const QString &caption,
279 const QString &dir,
280 const QString &filter,
281 QString *selectedFilter,
282 QFileDialog::Options
283 )
284{
285 QString selectedFileName = "";
286 QComboBox* combo = new QComboBox;
287 combo->addItem("3D");
288 combo->addItem("2D + t");
289
290 QHBoxLayout* checkBoxGroup = new QHBoxLayout();
291
292 QCheckBox* distanceImageCheckBox = new QCheckBox;
293 distanceImageCheckBox->setText("Distance image");
294 distanceImageCheckBox->setChecked(distanceImageSelected);
295
296 QCheckBox* amplitudeImageCheckBox = new QCheckBox;
297 amplitudeImageCheckBox->setText("Amplitude image");
298 amplitudeImageCheckBox->setChecked(amplitudeImageSelected);
299 amplitudeImageCheckBox->setEnabled(amplitudeImageSelected);
300 if(!amplitudeImageSelected)
301 amplitudeImageCheckBox->setToolTip(QString("This device does not provide amplitude data."));
302
303 QCheckBox* intensityImageCheckBox = new QCheckBox;
304 intensityImageCheckBox->setText("Intensity image");
305 intensityImageCheckBox->setChecked(intensityImageSelected);
306 intensityImageCheckBox->setEnabled(intensityImageSelected);
307 if(!intensityImageSelected)
308 intensityImageCheckBox->setToolTip(QString("This device does not provide intensity data."));
309
310 QCheckBox* rgbImageCheckBox = new QCheckBox;
311 rgbImageCheckBox->setText("RGB image");
312 rgbImageCheckBox->setChecked(rgbImageSelected);
313 rgbImageCheckBox->setEnabled(rgbImageSelected);
314 if(!rgbImageSelected)
315 rgbImageCheckBox->setToolTip(QString("This device does not provide RGB data."));
316
317 QCheckBox* rawDataCheckBox = new QCheckBox;
318 rawDataCheckBox->setText("Raw data");
319 rawDataCheckBox->setChecked(false);
320 rawDataCheckBox->setEnabled(false);
321
322 checkBoxGroup->addWidget(distanceImageCheckBox);
323 checkBoxGroup->addWidget(amplitudeImageCheckBox);
324 checkBoxGroup->addWidget(intensityImageCheckBox);
325 checkBoxGroup->addWidget(rgbImageCheckBox);
326 checkBoxGroup->addWidget(rawDataCheckBox);
327
328 QFileDialog* fileDialog = new QFileDialog(parent, caption, dir, filter);
329
330 QLayout* layout = fileDialog->layout();
331 QGridLayout* gridbox = qobject_cast<QGridLayout*>(layout);
332
333 if (gridbox)
334 {
335 gridbox->addWidget(new QLabel("ToF-Image type:"));
336 gridbox->addWidget(combo);
337 int lastRow = gridbox->rowCount();
338 gridbox->addLayout(checkBoxGroup, lastRow, 0, 1, -1);
339 }
340
341 fileDialog->setLayout(gridbox);
342 fileDialog->setAcceptMode(QFileDialog::AcceptSave);
343
344 if (selectedFilter)
345 {
346 fileDialog->selectNameFilter(*selectedFilter);
347 }
348
349 if (fileDialog->exec() == QDialog::Accepted)
350 {
351 if (selectedFilter)
352 {
353 *selectedFilter = fileDialog->selectedNameFilter();
354 }
355
356 if (combo->currentIndex() == 0)
357 {
359 }
360
361 else
362 {
364 }
365
366 distanceImageSelected = distanceImageCheckBox->isChecked();
367 amplitudeImageSelected = amplitudeImageCheckBox->isChecked();
368 intensityImageSelected = intensityImageCheckBox->isChecked();
369 rgbImageSelected = rgbImageCheckBox->isChecked();
370 rawDataSelected = rawDataCheckBox->isChecked();
371
372 selectedFileName = fileDialog->selectedFiles().value(0);
373 }
374
375 delete fileDialog;
376 return selectedFileName;
377}
378
379std::string QmitkToFRecorderWidget::prepareFilename(std::string dir,
380 std::string baseFilename,
381 std::string modulationFreq,
382 std::string integrationTime,
383 std::string numOfFrames,
384 std::string extension,
385 std::string imageType)
386{
387 std::string filenName("");
388 filenName.append(dir);
389 filenName.append("/");
390 filenName.append(baseFilename);
391 filenName.append("_MF");
392 filenName.append(modulationFreq);
393 filenName.append("_IT");
394 filenName.append(integrationTime);
395 filenName.append("_");
396 filenName.append(numOfFrames);
397 filenName.append("Images");
398 filenName.append(imageType);
399 filenName.append(extension);
400 return filenName;
401}
402
404{
405 if (index == 0)
406 {
408 m_Controls->m_NumOfFramesSpinBox->setEnabled(true);
409 }
410 else
411 {
413 m_Controls->m_NumOfFramesSpinBox->setEnabled(false);
414 }
415}
void StopRecordingCallback()
emits RecordingStopped signal.
void StopRecorder()
stops the recording by calling ToFImageRecorder::StopRecording()
CommandType::Pointer m_StopRecordingCommand
itkCommand for abort of recording
void ToFCameraStarted()
signal emitted when "Play" button is pressed
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,...
void OnRecordingStopped()
slot resetting the GUI elements of the recording box
virtual void CreateQtPartControl(QWidget *parent)
QmitkToFRecorderWidget(QWidget *p=nullptr, Qt::WindowFlags f1={})
mitk::ToFImageRecorder::Pointer m_ToFImageRecorder
member holding the recorder for ToF images
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
mitk::ToFImageRecorder::RecordMode m_RecordMode
member holding the RecordMode of the recorder (PerFrame / Infinite)
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
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={})
adapted version of QFileDialog::getSaveFileName() The user is now asked to choose which images he wan...
Ui::QmitkToFRecorderWidgetControls * m_Controls
member holding the UI elements of this widget
void StopCamera()
stops the camera by calling ToFImageGrabber::StopCamera()
void RecordingStarted()
signal emitted when recording is started
void OnStartRecorder()
slot invoking to start the recording After letting the user chose a file location for the record,...
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...
void ToFCameraStopped()
signal emitted when "Stop" button is pressed
void OnChangeRecordModeComboBox(int index)
slot activating/deactivating "number of frames" spin box dependent on recording mode (PerFrame / Infi...
Image source providing ToF images. Interface for filters provided in ToFProcessing module.
Recorder class for ToF images.