MITK-IGT
IGT Extension of MITK
Loading...
Searching...
No Matches
QmitkToFTutorialView.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// Blueberry
14#include <berryISelectionService.h>
15#include <berryIWorkbenchWindow.h>
16
17// Qmitk
19
20// Qt
21#include <QMessageBox>
22
23// mitk includes
24#include <mitkCameraIntrinsics.h> // class holding the intrinsic parameters of the according camera
25#include <mitkSurface.h>
26
27// MITK-ToF related includes
29#include <mitkToFConfig.h> // configuration file holding e.g. plugin paths or path to test file directory
30#include <mitkToFDistanceImageToSurfaceFilter.h> // filter from module ToFProcessing that calculates a surface from the given range image
31#include <mitkToFImageGrabber.h> // allows access to images provided by the ToF camera
32
33const std::string QmitkToFTutorialView::VIEW_ID = "org.mitk.views.toftutorial";
34
36: QmitkAbstractView()
37, m_Controls( nullptr )
38{
39}
40
44
46{
47 // build up qt view, unless already done
48 if ( !m_Controls )
49 {
50 // create GUI widgets from the Qt Designer's .ui file
51 m_Controls = new Ui::QmitkToFTutorialViewControls;
52 m_Controls->setupUi( parent );
53
54 connect( m_Controls->step1Button, SIGNAL(clicked()), this, SLOT(OnStep1()) );
55 connect( m_Controls->step2Button, SIGNAL(clicked()), this, SLOT(OnStep2()) );
56 }
57}
58
60{
61 m_Controls->step1Button->setFocus();
62}
63
65{
66 // clean up data storage
68 // Create an instance of ToFImageGrabber that holds a ToFCameraMITKPlayerDevice for playing ToF data
69 mitk::ToFImageGrabber::Pointer tofImageGrabber = mitk::ToFImageGrabber::New();
70 tofImageGrabber->SetCameraDevice(mitk::ToFCameraMITKPlayerDevice::New());
71 // set paths to test data
72 std::string distanceFileName = MITK_TOF_DATA_DIR;
73 distanceFileName.append("/PMDCamCube2_MF0_IT0_20Images_DistanceImage.nrrd");
74 std::string amplitudeFileName = MITK_TOF_DATA_DIR;
75 amplitudeFileName.append("/PMDCamCube2_MF0_IT0_20Images_AmplitudeImage.nrrd");
76 std::string intensityFileName = MITK_TOF_DATA_DIR;
77 intensityFileName.append("/PMDCamCube2_MF0_IT0_20Images_IntensityImage.nrrd");
78 // set file name property in image grabber. This will be propagated to the corresponding device and controller class
79 tofImageGrabber->SetProperty("DistanceImageFileName",mitk::StringProperty::New(distanceFileName));
80 tofImageGrabber->SetProperty("AmplitudeImageFileName",mitk::StringProperty::New(amplitudeFileName));
81 tofImageGrabber->SetProperty("IntensityImageFileName",mitk::StringProperty::New(intensityFileName));
82 // connect to device
83 if (tofImageGrabber->ConnectCamera())
84 {
86 tofImageGrabber->StartCamera();
87 // update image grabber which itself represents the source of a MITK filter pipeline
88 tofImageGrabber->Update();
89 // grab distance image
90 mitk::Image::Pointer distanceImage = tofImageGrabber->GetOutput();
91 // grab amplitude image
92 mitk::Image::Pointer amplitudeImage = tofImageGrabber->GetOutput(1);
93 // grab intensity image
94 mitk::Image::Pointer intensityImage = tofImageGrabber->GetOutput(2);
95 //add distance image to data storage
96 mitk::DataNode::Pointer distanceNode = mitk::DataNode::New();
97 distanceNode->SetName("Distance Image");
98 distanceNode->SetData(distanceImage);
99 this->GetDataStorage()->Add(distanceNode);
100 //add amplitude image to data storage
101 mitk::DataNode::Pointer amplitudeNode = mitk::DataNode::New();
102 amplitudeNode->SetName("Amplitude Image");
103 amplitudeNode->SetData(amplitudeImage);
104 this->GetDataStorage()->Add(amplitudeNode);
105 //add intensity image to data storage
106 mitk::DataNode::Pointer intensityNode = mitk::DataNode::New();
107 intensityNode->SetName("Intensity Image");
108 intensityNode->SetData(intensityImage);
109 this->GetDataStorage()->Add(intensityNode);
110 // stop camera (terminate internally used thread)
111 tofImageGrabber->StopCamera();
113 tofImageGrabber->DisconnectCamera();
114 // adjust views to new data in DataStorage
115 mitk::RenderingManager::GetInstance()->InitializeViews(distanceImage->GetGeometry());
116 }
117 else
118 {
119 MITK_ERROR<<"Connection to ToF camera could not be established";
120 }
121}
122
124{
125 // Check if distance image is available
126 mitk::DataNode::Pointer distanceNode = this->GetDataStorage()->GetNamedNode("Distance Image");
127 if (distanceNode.IsNotNull())
128 {
129 // get distance image from node and check if node contains image
130 mitk::Image::Pointer distanceImage = dynamic_cast<mitk::Image*>(distanceNode->GetData());
131 if (distanceImage.IsNotNull())
132 {
133 // create object of CameraIntrinsics that holds intrinsic parameters of the ToF camera
134 mitk::CameraIntrinsics::Pointer cameraIntrinsics = mitk::CameraIntrinsics::New();
135 // set focal length in pixel
136 cameraIntrinsics->SetFocalLength(295.8,296.1);
137 // set principal point in pixel
138 cameraIntrinsics->SetPrincipalPoint(113.2,97.1);
139 // set up filter for surface calculation
140 mitk::ToFDistanceImageToSurfaceFilter::Pointer surfaceFilter = mitk::ToFDistanceImageToSurfaceFilter::New();
141 // apply intrinsic parameters to filter
142 surfaceFilter->SetCameraIntrinsics(cameraIntrinsics);
143 // set distance between pixels on chip in mm (in this example squared pixel)
144 mitk::ToFProcessingCommon::ToFPoint2D interPixelDistance;
145 interPixelDistance[0] = 0.045;
146 interPixelDistance[1] = 0.045;
147 surfaceFilter->SetInterPixelDistance(interPixelDistance);
148 // set distance image as input
149 surfaceFilter->SetInput(distanceImage);
150 // update the filter
151 surfaceFilter->Update();
152 // get surface from filter
153 mitk::Surface::Pointer surface = surfaceFilter->GetOutput();
154 // add surface to data storage
155 mitk::DataNode::Pointer surfaceNode = mitk::DataNode::New();
156 surfaceNode->SetName("ToF surface");
157 surfaceNode->SetData(surface);
158 this->GetDataStorage()->Add(surfaceNode);
159 // adjust views to new data in DataStorage
160 mitk::RenderingManager::GetInstance()->InitializeViews(surface->GetGeometry());
161 }
162 else
163 {
164 QMessageBox::warning(nullptr,"ToF Tutorial","Node 'Distance Image' contains no image");
165 }
166 }
167 else
168 {
169 QMessageBox::warning(nullptr,"ToF Tutorial","Perform Step 1 first to acquire a distance image");
170 }
171}
172
174{
175 mitk::DataStorage::SetOfObjects::ConstPointer allNodes = this->GetDataStorage()->GetAll();
176 this->GetDataStorage()->Remove(allNodes);
177}
178
179
180
181
182
void OnStep2()
Called when the user clicks the Step 2 button.
void OnStep1()
Called when the user clicks the Step 1 button.
Ui::QmitkToFTutorialViewControls * m_Controls
static const std::string VIEW_ID
void CreateQtPartControl(QWidget *parent) override
itk::Point< ToFScalarType, 2 > ToFPoint2D