Medical Imaging Interaction Toolkit  2018.4.99-389bf124
Medical Imaging Interaction Toolkit
mitkUSTelemedImageSource.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 
14 #include "mitkUSTelemedSDKHeader.h"
15 #include "MITKUSTelemedScanConverterPlugin.h"
16 #include "mitkImageReadAccessor.h"
17 
19  : m_Image(mitk::Image::New()),
20  m_ImageMutex(itk::FastMutexLock::New()),
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 {
39 }
40 
41 void mitk::USTelemedImageSource::GetNextRawImage(std::vector<mitk::Image::Pointer>& imageVector)
42 {
43  if (imageVector.empty() ) { imageVector.push_back( mitk::Image::New()); }
44 
45  //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
46  Usgfw2Lib::tagImageResolution resolutionInMetersActual;
47  m_ImageProperties->GetResolution(&resolutionInMetersActual, 0);
48  if (m_OldnXPelsPerUnit != resolutionInMetersActual.nXPelsPerUnit || m_OldnYPelsPerUnit != resolutionInMetersActual.nYPelsPerUnit)
49  {
50  //we can only update if the image exists and has a geometry
51  if (m_Image.IsNotNull() && m_Image->GetGeometry() != nullptr)
52  {
53  m_OldnXPelsPerUnit = resolutionInMetersActual.nXPelsPerUnit;
54  m_OldnYPelsPerUnit = resolutionInMetersActual.nYPelsPerUnit;
56  }
57 
58  }
59  //now update image
60  if ( m_Image->IsInitialized() )
61  {
62  m_ImageMutex->Lock();
63 
64  // copy contents of the given image into the member variable
65  imageVector.at(0)->Initialize(m_Image->GetPixelType(), m_Image->GetDimension(), m_Image->GetDimensions());
66  mitk::ImageReadAccessor inputReadAccessor(m_Image, m_Image->GetSliceData(0,0,0));
67  imageVector.at(0)->SetSlice(inputReadAccessor.GetData());
68  imageVector.at(0)->SetGeometry(m_Image->GetGeometry());
69 
70  m_ImageMutex->Unlock();
71  }
72 
73 }
74 
76 {
77  Usgfw2Lib::tagPixelsOrigin origin = Usgfw2Lib::tagPixelsOrigin();
78  Usgfw2Lib::tagImageResolution resolutionInMeters;
79  m_ImageProperties->GetResolution(&resolutionInMeters,0);
80 
81  mitk::Vector3D spacing;
82  spacing[0] = ((double)1 / resolutionInMeters.nXPelsPerUnit) * 1000; //conversion: meters to millimeters
83  spacing[1] = ((double)1 / resolutionInMeters.nXPelsPerUnit) * 1000; //conversion: meters to millimeters
84  spacing[2] = 1;
85 
86  m_ImageMutex->Lock();
87  if(m_Image.IsNotNull() && (m_Image->GetGeometry()!=nullptr))
88  {
89  m_Image->GetGeometry()->SetSpacing(spacing);
90  m_Image->GetGeometry()->Modified();
91  }
92  else
93  {MITK_WARN << "image or geometry was nullptr, can't adapt geometry";}
94  m_ImageMutex->Unlock();
95 
96  MITK_DEBUG << "UpdateImageGeometry called!";
97  MITK_DEBUG << "depth: " << m_DepthProperties->GetCurrent();
98  MITK_DEBUG << "new spacing: " << spacing;
99 }
100 
101 bool mitk::USTelemedImageSource::CreateAndConnectConverterPlugin(Usgfw2Lib::IUsgDataView* usgDataView, Usgfw2Lib::tagScanMode scanMode)
102 {
103  IUnknown* tmp_obj = nullptr;
104 
105  // create control object from Telemed API
106  mitk::telemed::CreateUsgControl( usgDataView, Usgfw2Lib::IID_IUsgScanConverterPlugin, scanMode, 0, (void**)&tmp_obj );
107  if ( ! tmp_obj )
108  {
109  MITK_ERROR("USImageSource")("USTelemedImageSource") << "Could not create scan converter plugin.";
110  return false;
111  }
112 
113  // create the callback object for the scan conversion
114  if ( ! m_PluginCallback )
115  {
117 
118  // current image buffer should be copied to m_Image at every callback
120  }
121  else
122  {
123  // make sure that the scan converter plugin is not set
124  // to the plugin callback any longer
126  }
127 
128  // now the ScanConverterPlugin can be created and set as plugin
130  m_Plugin = (Usgfw2Lib::IUsgScanConverterPlugin*)tmp_obj;
132 
133  //last: create some connections which are needed inside this class for communication with the telemed device
134  m_UsgDataView = usgDataView;
135 
136  // create telemed controls
137  if (!m_DepthProperties) {CREATE_TelemedControl(m_DepthProperties, m_UsgDataView, Usgfw2Lib::IID_IUsgDepth, Usgfw2Lib::IUsgDepth, Usgfw2Lib::SCAN_MODE_B);}
138  if (!m_ImageProperties) {CREATE_TelemedControl(m_ImageProperties, m_UsgDataView, Usgfw2Lib::IID_IUsgImageProperties, Usgfw2Lib::IUsgImageProperties, Usgfw2Lib::SCAN_MODE_B);}
139 
140  return true;
141 }
itk::FastMutexLock::Pointer m_ImageMutex
Usgfw2Lib::IUsgScanConverterPlugin * m_Plugin
STDMETHOD() SetScanConverterPlugin(IDispatch *plugin)
Usgfw2Lib::IUsgImageProperties * m_ImageProperties
#define CREATE_TelemedControl(control, dataView, iidType, type, scanMode)
#define MITK_ERROR
Definition: mitkLogMacros.h:20
#define MITK_DEBUG
Definition: mitkLogMacros.h:22
DataCollection - Class to facilitate loading/accessing structured data.
USTelemedScanConverterPlugin * m_PluginCallback
Usgfw2Lib::IUsgDepth * m_DepthProperties
#define MITK_WARN
Definition: mitkLogMacros.h:19
Image class for storing images.
Definition: mitkImage.h:72
bool CreateUsgControl(Usgfw2Lib::IUsgDataView *dataView, const IID &typeId, ULONG scanMode, ULONG streamId, void **ctrl)
static Pointer New()
#define SAFE_RELEASE(x)
void SetOutputImage(mitk::Image::Pointer outputImage, itk::FastMutexLock::Pointer outputImageMutex=0)
Telemed API plugin for getting images from scan lines. Implements a COM interface whereat only the fu...
Usgfw2Lib::IUsgDataView * m_UsgDataView
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.
ImageReadAccessor class to get locked read access for a particular image part.