14#include <igtlImageMessage.h>
15#include <itkByteSwapper.h>
17#include <vtkSmartPointer.h>
20 std::vector<mitk::Image::Pointer>& imgVector)
22 if (imgVector.size() != 1)
25 mitk::Image::Pointer& img = imgVector[0];
32 img = m_previousImage;
36 igtl::MessageBase::Pointer msgBase = msg->
GetMessage();
37 igtl::ImageMessage* imgMsg = (igtl::ImageMessage*)(msgBase.GetPointer());
39 bool big_endian = (imgMsg->GetEndian() == igtl::ImageMessage::ENDIAN_BIG);
41 if (imgMsg->GetCoordinateSystem() != igtl::ImageMessage::COORDINATE_RAS)
44 mitkThrow() <<
"Can not handle messages with LPS coordinate system";
47 switch (imgMsg->GetScalarType())
49 case igtl::ImageMessage::TYPE_UINT8:
50 Initiate<unsigned char>(img, imgMsg, big_endian);
52 case igtl::ImageMessage::TYPE_INT8:
53 Initiate<char>(img, imgMsg, big_endian);
55 case igtl::ImageMessage::TYPE_UINT16:
56 Initiate<unsigned short>(img, imgMsg, big_endian);
58 case igtl::ImageMessage::TYPE_INT16:
59 Initiate<short>(img, imgMsg, big_endian);
61 case igtl::ImageMessage::TYPE_UINT32:
62 Initiate<unsigned int>(img, imgMsg, big_endian);
64 case igtl::ImageMessage::TYPE_INT32:
65 Initiate<int>(img, imgMsg, big_endian);
67 case igtl::ImageMessage::TYPE_FLOAT32:
68 Initiate<float>(img, imgMsg, big_endian);
70 case igtl::ImageMessage::TYPE_FLOAT64:
71 Initiate<double>(img, imgMsg, big_endian);
74 mitkThrow() <<
"Incompatible PixelType " << imgMsg;
78template <
typename TPixel>
79void mitk::IGTLMessageToUSImageFilter::Initiate(mitk::Image::Pointer& img,
80 igtl::ImageMessage* msg,
85 typename ImageType::Pointer output = ImageType::New();
86 typename ImageType::RegionType region;
87 typename ImageType::RegionType::SizeType size;
88 typename ImageType::RegionType::IndexType index;
89 typename ImageType::SpacingType spacing;
90 typename ImageType::PointType origin;
94 msg->GetDimensions(dims);
96 for (
size_t i = 0; i < 3; i++)
104 int sdims[3], offs[3];
105 msg->GetSubVolume(sdims, offs);
106 for (
size_t i = 0; i < 3; i++)
108 if (offs[i] != 0 || sdims[i] != dims[i])
111 throw(
"Can not handle message with smaller subvolume than whole image");
118 msg->GetMatrix(matF);
121 for (
size_t i = 0; i < 4; ++i)
122 for (
size_t j = 0; j < 4; ++j)
123 vtkMatrix->SetElement(i, j, matF[i][j]);
127 msg->GetSpacing(spacingMsg);
129 for (
int i = 0; i < 3; ++i)
130 spacing[i] = spacingMsg[i];
132 region.SetSize(size);
133 region.SetIndex(index);
134 output->SetRegions(region);
135 output->SetSpacing(spacing);
138 TPixel* in = (TPixel*)msg->GetScalarPointer();
139 TPixel* out = (TPixel*)output->GetBufferPointer();
140 memcpy(out, in, num_pixel *
sizeof(TPixel));
146 itk::ByteSwapper<TPixel>::SwapRangeFromSystemToBigEndian(out, num_pixel);
150 itk::ByteSwapper<TPixel>::SwapRangeFromSystemToLittleEndian(out, num_pixel);
153 img = mitk::Image::New();
154 img->InitializeByItk(output.GetPointer());
155 img->SetVolume(output->GetBufferPointer());
157 m_previousImage = img;
160 msg->GetOrigin(iorigin);
161 for (
size_t i = 0; i < 3; i++)
163 origin[i] = iorigin[i];
165 output->SetOrigin(origin);
169 : m_upstream(nullptr)
171 MITK_DEBUG <<
"Instantiated this (" <<
this <<
") mitkIGTMessageToUSImageFilter\n";
175 unsigned int numOutputs)
179 throw(
"Can only have 1 output for IGTLMessageToUSImageFilter.");
186 MITK_DEBUG <<
"Connected this (" <<
this <<
") mitkIGTLMessageToUSImageFilter to MessageSource (" << UpstreamFilter <<
")\n";
187 m_upstream = UpstreamFilter;
itk::Image< int, 3 > ImageType
OpenIGTLink message source.
IGTLMessage * GetOutput(void)
return the output (output with id 0) of the filter
void GetNextRawImage(std::vector< mitk::Image::Pointer > &imgVector) override
Copies the data from the next OIGTL message to an mitk::Image.
IGTLMessageToUSImageFilter()
void ConnectTo(mitk::IGTLMessageSource *UpstreamFilter)
Connects the input of this filter to the outputs of the given IGTLMessageSource.
void SetNumberOfExpectedOutputs(unsigned int numOutputs)
Sets the number of expected outputs.
A wrapper for the OpenIGTLink message type.
virtual bool IsDataValid() const
returns true if the object contains valid data
const char * GetIGTLMessageType() const
IGTLMessageType * GetMessage() const