MITK-IGT
IGT Extension of MITK
Loading...
Searching...
No Matches
mitkToFOpenCVImageGrabber.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============================================================================*/
13
14// mitk includes
15#include "mitkImageDataItem.h"
16#include <mitkImageStatisticsHolder.h>
17#include "mitkImageReadAccessor.h"
18
19#include "vtkSmartPointer.h"
20#include "vtkColorTransferFunction.h"
21#include "vtkFloatArray.h"
22
23#include <opencv2/core/core_c.h>
24
25
26namespace mitk
27{
37
41
43 {
44 m_ImageGrabber->Update();
45 unsigned int numOfPixel = m_ImageGrabber->GetCaptureWidth()*m_ImageGrabber->GetCaptureHeight();
46 // copy current mitk images
47 unsigned int dimensions[4];
48 dimensions[0] = this->m_ImageGrabber->GetCaptureWidth();
49 dimensions[1] = this->m_ImageGrabber->GetCaptureHeight();
50 dimensions[2] = 1;
51 dimensions[3] = 1;
52
53 // create single component float pixel type
54 mitk::PixelType FloatType = MakeScalarPixelType<float>();
55
56 ImageReadAccessor imgGrabAcc0(m_ImageGrabber->GetOutput(0), m_ImageGrabber->GetOutput(0)->GetSliceData());
57 ImageReadAccessor imgGrabAcc1(m_ImageGrabber->GetOutput(1), m_ImageGrabber->GetOutput(1)->GetSliceData());
58 ImageReadAccessor imgGrabAcc2(m_ImageGrabber->GetOutput(2), m_ImageGrabber->GetOutput(2)->GetSliceData());
59
60 mitk::Image::Pointer currentMITKIntensityImage = mitk::Image::New();
61 currentMITKIntensityImage->Initialize(FloatType, 2, dimensions);
62 currentMITKIntensityImage->SetSlice((float*) imgGrabAcc2.GetData(),0,0,0);
63
64 mitk::Image::Pointer currentMITKAmplitudeImage = mitk::Image::New();
65 currentMITKAmplitudeImage->Initialize(FloatType, 2, dimensions);
66 currentMITKAmplitudeImage->SetSlice((float*)imgGrabAcc1.GetData(),0,0,0);
67
68 mitk::Image::Pointer currentMITKDistanceImage = mitk::Image::New();
69 currentMITKDistanceImage->Initialize(FloatType, 2, dimensions);
70 currentMITKDistanceImage->SetSlice((float*)imgGrabAcc0.GetData(),0,0,0);
71 // copy mitk images to OpenCV images
72 if (m_ImageDepth==IPL_DEPTH_32F)
73 {
74 if (m_ImageType==1)
75 {
76 ImageReadAccessor currentAmplAcc(currentMITKAmplitudeImage, currentMITKAmplitudeImage->GetSliceData(0, 0, 0));
77 float* amplitudeFloatData = (float*) currentAmplAcc.GetData();
78 memcpy(m_CurrentOpenCVAmplitudeImage->imageData,(unsigned char*)amplitudeFloatData,numOfPixel*sizeof(float));
79 return cv::cvarrToMat(m_CurrentOpenCVAmplitudeImage, false);
80 }
81 else if (m_ImageType==2)
82 {
83 ImageReadAccessor currentIntenAcc(currentMITKIntensityImage, currentMITKIntensityImage->GetSliceData(0, 0, 0));
84 float* intensityFloatData = (float*) currentIntenAcc.GetData();
85 memcpy(m_CurrentOpenCVIntensityImage->imageData,(unsigned char*)intensityFloatData,numOfPixel*sizeof(float));
86 return cv::cvarrToMat(m_CurrentOpenCVIntensityImage, false);
87 }
88 else
89 {
90 ImageReadAccessor currentDistAcc(currentMITKDistanceImage, currentMITKDistanceImage->GetSliceData(0, 0, 0));
91 float* distanceFloatData = (float*) currentDistAcc.GetData();
92 memcpy(m_CurrentOpenCVDistanceImage->imageData,(unsigned char*)distanceFloatData,numOfPixel*sizeof(float));
93 return cv::cvarrToMat(m_CurrentOpenCVDistanceImage, false);
94 }
95 }
96 else
97 {
98 if (m_ImageType==1)
99 {
100 this->MapScalars(currentMITKAmplitudeImage, m_CurrentOpenCVAmplitudeImage);
101 return cv::cvarrToMat(m_CurrentOpenCVAmplitudeImage, false);
102 }
103 else if (m_ImageType==2)
104 {
105 this->MapScalars(currentMITKIntensityImage, m_CurrentOpenCVIntensityImage);
106 return cv::cvarrToMat(m_CurrentOpenCVIntensityImage, false);
107 }
108 else
109 {
110 this->MapScalars(currentMITKDistanceImage, m_CurrentOpenCVDistanceImage);
111 return cv::cvarrToMat(m_CurrentOpenCVDistanceImage, false);
112 }
113 }
114 }
115
116 void ToFOpenCVImageGrabber::SetImageType(unsigned int imageType)
117 {
118 m_ImageType = imageType;
119 }
120
121 void ToFOpenCVImageGrabber::SetImageDepth(unsigned int imageDepth)
122 {
123 m_ImageDepth = imageDepth;
124 }
125
126 void ToFOpenCVImageGrabber::SetToFImageGrabber(ToFImageGrabber::Pointer imageGrabber)
127 {
128 m_ImageGrabber = imageGrabber;
129 }
130
132 {
133 return m_ImageGrabber;
134 }
135
137 {
138 if (m_ImageGrabber.IsNotNull())
139 {
140 m_ImageGrabber->ConnectCamera();
141 //Initialize cv Images after the camera is conneceted and we know the resolution
142 m_CurrentOpenCVIntensityImage = cvCreateImage(cvSize(m_ImageGrabber->GetCaptureWidth(), m_ImageGrabber->GetCaptureHeight()), m_ImageDepth, 1);
143 m_CurrentOpenCVAmplitudeImage = cvCreateImage(cvSize(m_ImageGrabber->GetCaptureWidth(), m_ImageGrabber->GetCaptureHeight()), m_ImageDepth, 1);
144 m_CurrentOpenCVDistanceImage = cvCreateImage(cvSize(m_ImageGrabber->GetCaptureWidth(), m_ImageGrabber->GetCaptureHeight()), m_ImageDepth, 1);
145 m_ImageGrabber->StartCamera();
146 }
147 }
148
150 {
151 if (m_ImageGrabber.IsNotNull())
152 {
153 m_ImageGrabber->StopCamera();
154 m_ImageGrabber->DisconnectCamera();
155 }
156 }
157
158 void ToFOpenCVImageGrabber::MapScalars( mitk::Image::Pointer mitkImage, IplImage* openCVImage)
159 {
160 unsigned int numOfPixel = m_ImageGrabber->GetCaptureWidth()*m_ImageGrabber->GetCaptureHeight();
161 ImageReadAccessor imgAcc(mitkImage, mitkImage->GetSliceData(0, 0, 0));
162 float* floatData = (float*)imgAcc.GetData();
165 floatArrayInt->Initialize();
166 floatArrayInt->SetArray(floatData, numOfPixel, 0);
167 mitk::ScalarType min = mitkImage->GetStatistics()->GetScalarValueMin();
168 mitk::ScalarType max = mitkImage->GetStatistics()->GetScalarValueMaxNoRecompute();
169 MITK_INFO<<"Minimum: "<<min;
170 MITK_INFO<<"Maximum: "<<max;
171 colorTransferFunction->RemoveAllPoints();
172 colorTransferFunction->AddRGBPoint(min, 0, 0, 0);
173 colorTransferFunction->AddRGBPoint(max, 1, 1, 1);
174 colorTransferFunction->SetColorSpaceToHSV();
175 colorTransferFunction->MapScalarsThroughTable(floatArrayInt, (unsigned char*)openCVImage->imageData, VTK_LUMINANCE);
176 }
177
178} // end namespace mitk
void SetImageDepth(unsigned int imageDepth)
set the depth of the image. Some functions of OpenCV do not support IPL_DEPTH_32F....
unsigned int m_ImageType
type of image currently supplied by this image source
void MapScalars(mitk::Image::Pointer mitkImage, IplImage *openCVImage)
map scalars through lookup table
IplImage * m_CurrentOpenCVIntensityImage
OpenCV image holding the current intensity data.
cv::Mat GetImage() override
Get current ToF image. Specify image you want to grab with SetImageType()
void SetToFImageGrabber(mitk::ToFImageGrabber::Pointer imageGrabber)
set the ImageGrabber used for fetching image data from the camera
void SetImageType(unsigned int imageType)
set type of image you want to grab. 0: Distance image (Default) 1: Amplitude image 2: Intensity image
mitk::ToFImageGrabber::Pointer GetToFImageGrabber()
get the ImageGrabber used for fetching image data from the camera
IplImage * m_CurrentOpenCVAmplitudeImage
OpenCV image holding the current amplitude data.
IplImage * m_CurrentOpenCVDistanceImage
OpenCV image holding the current distance data.
unsigned int m_ImageDepth
image depth currently used by this image source. Warning: Changing from default (IPL_DEPTH_32F) resul...
mitk::ToFImageGrabber::Pointer m_ImageGrabber
ImageGrabber used for fetching ToF image data from the camera.
IGT Exceptions.