MITK-IGT
IGT Extension of MITK
Loading...
Searching...
No Matches
mitkUSTelemedImageSource.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
15#include "MITKUSTelemedScanConverterPlugin.h"
16#include "mitkImageReadAccessor.h"
17
19 : m_Image(mitk::Image::New()),
20 m_ImageMutex(new std::mutex()),
21 m_Plugin(0),
22 m_PluginCallback(0),
23 m_UsgDataView(0),
24 m_ImageProperties(0),
25 m_DepthProperties(0),
26 m_OldnXPelsPerUnit(0),
27 m_OldnYPelsPerUnit(0)
28
29{
30
31}
32
34{
35 SAFE_RELEASE(m_PluginCallback);
36 SAFE_RELEASE(m_Plugin);
37 SAFE_RELEASE(m_ImageProperties);
38 SAFE_RELEASE(m_DepthProperties);
39 delete m_ImageMutex;
40}
41
42void mitk::USTelemedImageSource::GetNextRawImage(std::vector<mitk::Image::Pointer>& imageVector)
43{
44 if (imageVector.empty() ) { imageVector.push_back( mitk::Image::New()); }
45
46 //get the actual resolution to check if it changed. We have to do this every time because the geometry takes a few frames to adapt
47 Usgfw2Lib::tagImageResolution resolutionInMetersActual;
48 m_ImageProperties->GetResolution(&resolutionInMetersActual, 0);
49 if (m_OldnXPelsPerUnit != resolutionInMetersActual.nXPelsPerUnit || m_OldnYPelsPerUnit != resolutionInMetersActual.nYPelsPerUnit)
50 {
51 //we can only update if the image exists and has a geometry
52 if (m_Image.IsNotNull() && m_Image->GetGeometry() != nullptr)
53 {
54 m_OldnXPelsPerUnit = resolutionInMetersActual.nXPelsPerUnit;
55 m_OldnYPelsPerUnit = resolutionInMetersActual.nYPelsPerUnit;
56 UpdateImageGeometry();
57 }
58
59 }
60 //now update image
61 if ( m_Image->IsInitialized() )
62 {
63 m_ImageMutex->lock();
64
65 // copy contents of the given image into the member variable
66 imageVector.at(0)->Initialize(m_Image->GetPixelType(), m_Image->GetDimension(), m_Image->GetDimensions());
67 mitk::ImageReadAccessor inputReadAccessor(m_Image, m_Image->GetSliceData(0,0,0));
68 imageVector.at(0)->SetSlice(inputReadAccessor.GetData());
69 imageVector.at(0)->SetGeometry(m_Image->GetGeometry());
70 m_ImageMutex->unlock();
71 }
72}
73
75{
76 Usgfw2Lib::tagPixelsOrigin origin = Usgfw2Lib::tagPixelsOrigin();
77 Usgfw2Lib::tagImageResolution resolutionInMeters;
78 m_ImageProperties->GetResolution(&resolutionInMeters,0);
79
80 mitk::Vector3D spacing;
81 spacing[0] = ((double)1 / resolutionInMeters.nXPelsPerUnit) * 1000; //conversion: meters to millimeters
82 spacing[1] = ((double)1 / resolutionInMeters.nXPelsPerUnit) * 1000; //conversion: meters to millimeters
83 spacing[2] = 1;
84
85 m_ImageMutex->lock();
86 if(m_Image.IsNotNull() && (m_Image->GetGeometry()!=nullptr))
87 {
88 m_Image->GetGeometry()->SetSpacing(spacing);
89 m_Image->GetGeometry()->Modified();
90 }
91 else
92 {MITK_WARN << "image or geometry was nullptr, can't adapt geometry";}
93 m_ImageMutex->unlock();
94
95 MITK_DEBUG << "UpdateImageGeometry called!";
96 MITK_DEBUG << "depth: " << m_DepthProperties->GetCurrent();
97 MITK_DEBUG << "new spacing: " << spacing;
98}
99
100bool mitk::USTelemedImageSource::CreateAndConnectConverterPlugin(Usgfw2Lib::IUsgDataView* usgDataView, Usgfw2Lib::tagScanMode scanMode)
101{
102 IUnknown* tmp_obj = nullptr;
103 // create control object from Telemed API
104 mitk::telemed::CreateUsgControl( usgDataView, Usgfw2Lib::IID_IUsgScanConverterPlugin, scanMode, 0, (void**)&tmp_obj );
105 if ( ! tmp_obj )
106 {
107 MITK_ERROR("USImageSource")("USTelemedImageSource") << "Could not create scan converter plugin.";
108 return false;
109 }
110
111 // create the callback object for the scan conversion
112 if ( ! m_PluginCallback )
113 {
114 m_PluginCallback = new USTelemedScanConverterPlugin();
115
116 // current image buffer should be copied to m_Image at every callback
117 m_PluginCallback->SetOutputImage(m_Image.GetPointer(), m_ImageMutex);
118 }
119 else
120 {
121 // make sure that the scan converter plugin is not set
122 // to the plugin callback any longer
123 m_PluginCallback->SetScanConverterPlugin(0);
124 }
125
126 // now the ScanConverterPlugin can be created and set as plugin
127 SAFE_RELEASE(m_Plugin);
128 m_Plugin = (Usgfw2Lib::IUsgScanConverterPlugin*)tmp_obj;
129 m_PluginCallback->SetScanConverterPlugin(m_Plugin);
130
131 //last: create some connections which are needed inside this class for communication with the telemed device
132 m_UsgDataView = usgDataView;
133
134 // create telemed controls
135 if (!m_DepthProperties) {CREATE_TelemedControl(m_DepthProperties, m_UsgDataView, Usgfw2Lib::IID_IUsgDepth, Usgfw2Lib::IUsgDepth, Usgfw2Lib::SCAN_MODE_B);}
136 if (!m_ImageProperties) {CREATE_TelemedControl(m_ImageProperties, m_UsgDataView, Usgfw2Lib::IID_IUsgImageProperties, Usgfw2Lib::IUsgImageProperties, Usgfw2Lib::SCAN_MODE_B);}
137
138 return true;
139}
Telemed API plugin for getting images from scan lines. Implements a COM interface whereat only the fu...
virtual void GetNextRawImage(std::vector< mitk::Image::Pointer > &)
bool CreateAndConnectConverterPlugin(Usgfw2Lib::IUsgDataView *, Usgfw2Lib::tagScanMode)
Connect this object to the Telemed API. This method is for being used by mitk::USTelemedDevice.
#define SAFE_RELEASE(x)
#define CREATE_TelemedControl(control, dataView, iidType, type, scanMode)
bool CreateUsgControl(Usgfw2Lib::IUsgDataView *dataView, const IID &typeId, ULONG scanMode, ULONG streamId, void **ctrl)
IGT Exceptions.