34 #include <vtkImageImport.h>
35 #include <vtkImageData.h>
36 #include <vtkImageExtractComponents.h>
37 #include <vtkImageAppendComponents.h>
39 #include "igtl_status.h"
50 void GetIdentityMatrix(igtl::Matrix4x4& matrix)
52 matrix[0][0] = 1.0; matrix[1][0] = 0.0; matrix[2][0] = 0.0; matrix[3][0] = 0.0;
53 matrix[0][1] = 0.0; matrix[1][1] = 1.0; matrix[2][1] = 0.0; matrix[3][1] = 0.0;
54 matrix[0][2] = 0.0; matrix[1][2] = 0.0; matrix[2][2] = 1.0; matrix[3][2] = 0.0;
55 matrix[0][3] = 0.0; matrix[1][3] = 0.0; matrix[2][3] = 0.0; matrix[3][3] = 1.0;
64 QString newUid = msg->getUid();
65 QString format = this->extractColorFormat(msg->getUid(), &newUid);
84 scalarType = message->GetScalarType();
85 message->GetDimensions(size);
86 message->GetSpacing(spacing);
87 message->GetSubVolume(svsize, svoffset);
88 QString deviceName = message->GetDeviceName();
90 imageImport->SetNumberOfScalarComponents(1);
94 case igtl::ImageMessage::TYPE_INT8:
95 CX_LOG_WARNING() <<
"signed char is not supported. Falling back to unsigned char.";
96 imageImport->SetDataScalarTypeToUnsignedChar();
98 case igtl::ImageMessage::TYPE_UINT8:
99 imageImport->SetDataScalarTypeToUnsignedChar();
101 case igtl::ImageMessage::TYPE_INT16:
102 imageImport->SetDataScalarTypeToShort();
104 case igtl::ImageMessage::TYPE_UINT16:
105 imageImport->SetNumberOfScalarComponents(2);
106 imageImport->SetDataScalarTypeToUnsignedChar();
108 case igtl::ImageMessage::TYPE_INT32:
109 case igtl::ImageMessage::TYPE_UINT32:
110 imageImport->SetNumberOfScalarComponents(4);
111 imageImport->SetDataScalarTypeToUnsignedChar();
113 case igtl::ImageMessage::TYPE_FLOAT32:
114 imageImport->SetDataScalarTypeToFloat();
116 case igtl::ImageMessage::TYPE_FLOAT64:
117 imageImport->SetDataScalarTypeToDouble();
120 CX_LOG_WARNING() <<
"Unknown image type. Falling back to unsigned char.";
121 imageImport->SetDataScalarTypeToUnsignedChar();
124 imageImport->SetDataOrigin(0, 0, 0);
125 imageImport->SetDataSpacing(spacing[0], spacing[1], spacing[2]);
126 imageImport->SetWholeExtent(0, size[0] - 1, 0, size[1] - 1, 0, size[2] - 1);
127 imageImport->SetDataExtentToWholeExtent();
128 imageImport->SetImportVoidPointer(message->GetScalarPointer());
130 imageImport->Modified();
131 imageImport->Update();
133 ImagePtr retval(
new Image(deviceName, imageImport->GetOutput()));
136 retval = this->
decode(retval);
145 int size[] = {256, 256, 1};
146 rawImage->GetDimensions(size);
150 rawImage->GetSpacing(spacingD);
151 spacingF[0] = spacingD[0];
152 spacingF[1] = spacingD[1];
153 spacingF[2] = spacingD[2];
155 int svoffset[] = {0, 0, 0};
158 if (rawImage->GetNumberOfScalarComponents()==4)
160 if (rawImage->GetScalarType()==VTK_UNSIGNED_CHAR)
162 scalarType = igtl::ImageMessage::TYPE_UINT32;
166 if (rawImage->GetNumberOfScalarComponents()==1)
168 if (rawImage->GetScalarType()==VTK_UNSIGNED_SHORT)
170 scalarType = igtl::ImageMessage::TYPE_UINT16;
172 else if (rawImage->GetScalarType()==VTK_UNSIGNED_CHAR)
174 scalarType = igtl::ImageMessage::TYPE_UINT8;
180 std::cerr <<
"Unsupported file type based on vtk " << rawImage->GetScalarTypeAsString() << std::endl;
181 return igtl::ImageMessage::Pointer();
186 igtl::ImageMessage::Pointer imgMsg = igtl::ImageMessage::New();
187 imgMsg->SetDimensions(size);
188 imgMsg->SetSpacing(spacingF);
189 imgMsg->SetScalarType(scalarType);
191 imgMsg->SetSubVolume(svsize, svoffset);
192 imgMsg->AllocateScalars();
197 int fsize = imgMsg->GetImageSize();
198 memcpy(imgMsg->GetScalarPointer(), rawImage->GetScalarPointer(0,0,0), fsize);
200 igtl::Matrix4x4 matrix;
201 GetIdentityMatrix(matrix);
202 imgMsg->SetMatrix(matrix);
210 QString newUid = msg->getUid();
211 QString format = this->extractColorFormat(msg->getUid(), &newUid);
212 vtkImageDataPtr imageRGB = this->createFilterFormat2RGB(format, msg->getBaseVtkImageData());
216 copy->DeepCopy(imageRGB);
219 retval->setAcquisitionTime(msg->getAcquisitionTime());
226 QString format = this->extractColorFormat(deviceName, &dummy);
227 return !format.isEmpty();
230 QString IGTLinkConversionSonixCXLegacy::extractColorFormat(QString deviceName, QString* cleanedDeviceName)
233 QRegExp colorFormat(
"\\[[A-Za-z]{1,4}\\]");
234 if (colorFormat.indexIn(deviceName) > 0)
236 format = colorFormat.cap(0).remove(
"[").remove(
"]");
239 if (cleanedDeviceName)
241 *cleanedDeviceName = deviceName.remove(colorFormat).trimmed();
249 int R = format.indexOf(
'R', 0, Qt::CaseInsensitive);
250 int G = format.indexOf(
'G', 0, Qt::CaseInsensitive);
251 int B = format.indexOf(
'B', 0, Qt::CaseInsensitive);
252 if (R<0 || G<0 || B<0 || format.size()>4)
259 return this->createFilterAny2RGB(R, G, B, input);
264 if (input->GetNumberOfScalarComponents() == 1)
266 if (( input->GetNumberOfScalarComponents()==3 )&&( R==0 )&&( G==1 )&&( B==2 ))
271 splitterRGB->SetInputData(input);
272 splitterRGB->SetComponents(R, G, B);
273 merger->AddInputConnection(splitterRGB->GetOutputPort());
275 return merger->GetOutput();
QDateTime decode_timestamp(igtl::MessageBase *msg)
boost::shared_ptr< class Image > ImagePtr
igtl::ImageMessage::Pointer encode(ImagePtr image)
cstring_cast_Placeholder cstring_cast(const T &val)
vtkSmartPointer< class vtkImageAppendComponents > vtkImageAppendComponentsPtr
bool guessIsSonixLegacyFormat(QString deviceName)
vtkSmartPointer< class vtkImageExtractComponents > vtkImageExtractComponentsPtr
vtkSmartPointer< class vtkImageImport > vtkImageImportPtr
void encode_timestamp(QDateTime ts, igtl::MessageBase *msg)
boost::shared_ptr< class ProbeDefinition > ProbeDefinitionPtr
ImagePtr decode(igtl::ImageMessage::Pointer msg)
vtkSmartPointer< vtkImageImport > vtkImageImportPtr