UsTK : Ultrasound ToolKit  version 2.0.1 under development (2023-12-07)
usMHDSequenceWriter.cpp
1 #include <visp3/ustk_core/usMHDSequenceWriter.h>
2 
6 usMHDSequenceWriter::usMHDSequenceWriter() : m_sequenceDirectory(), m_sequenceImageType(us::NOT_SET), m_imageCounter(0)
7 {
8 }
9 
14 
19 void usMHDSequenceWriter::setSequenceDirectory(const std::string sequenceDirectory)
20 {
21 
22  if (!vpIoTools::checkDirectory(sequenceDirectory))
23  throw(vpException(vpException::badValue, "usMHDSequenceWriter : directory name incorrect !"));
24 
25  m_sequenceDirectory = sequenceDirectory;
26  m_sequenceImageType = us::NOT_SET;
27  m_imageCounter = 0;
28 }
29 
35 void usMHDSequenceWriter::write(const usImageRF2D<short int> &image, const uint64_t timestamp)
36 {
37 
38  if (m_sequenceImageType == us::NOT_SET) // first image written
39  m_sequenceImageType = us::RF_2D;
40 
41  if (m_sequenceImageType != us::RF_2D)
42  throw(vpException(vpException::badValue,
43  "usMHDSequenceWriter : trying to write a 2D RF image in a sequence of another type of image !"));
44 
45  std::string mhdImageFileName = m_sequenceDirectory + vpIoTools::path("/") + std::string("image%05d.mhd");
46  std::string rawImageFileName = m_sequenceDirectory + vpIoTools::path("/") + std::string("image%05d.raw");
47 
48  char mhdFileNamebuffer[FILENAME_MAX];
49  sprintf(mhdFileNamebuffer, mhdImageFileName.c_str(), m_imageCounter);
50 
51  char rawFileNamebuffer[FILENAME_MAX];
52  sprintf(rawFileNamebuffer, rawImageFileName.c_str(), m_imageCounter);
53 
54  char rawFileNamebufferMin[FILENAME_MAX]; // filename without path
55  sprintf(rawFileNamebufferMin, "image%05d.raw", m_imageCounter);
56 
57  usMetaHeaderParser::MHDHeader header;
58  header.dim[0] = image.getWidth();
59  header.dim[1] = image.getHeight();
60  header.elementSpacing[0] = 1.0;
61  header.elementSpacing[1] = 1.0;
62  header.elementType = usMetaHeaderParser::MET_SHORT;
63  header.imageType = us::RF_2D;
64  header.isTransducerConvex = image.isTransducerConvex();
65  header.MHDFileName = std::string(mhdFileNamebuffer);
66  header.numberOfDimensions = 2;
67  header.rawFileName = std::string(rawFileNamebufferMin);
68  header.samplingFrequency = image.getSamplingFrequency();
69  header.scanLineNumber = image.getScanLineNumber();
70  header.scanLinePitch = image.getScanLinePitch();
71  header.timestamp.push_back(timestamp);
72  header.transducerRadius = image.getTransducerRadius();
73  header.transmitFrequency = image.getTransmitFrequency();
74 
75  usMetaHeaderParser mhdParser;
76  mhdParser.setMHDHeader(header);
77  mhdParser.setAxialResolution(image.getAxialResolution());
78  mhdParser.parse();
79 
80  usRawFileParser rawParser;
81  rawParser.write(image, std::string(rawFileNamebuffer));
82 
83  m_imageCounter++;
84 }
85 
91 void usMHDSequenceWriter::write(const usImagePreScan2D<unsigned char> &image, const uint64_t timestamp)
92 {
93 
94  if (m_sequenceImageType == us::NOT_SET) // first image written
95  m_sequenceImageType = us::PRESCAN_2D;
96 
97  if (m_sequenceImageType != us::PRESCAN_2D)
98  throw(vpException(
99  vpException::badValue,
100  "usMHDSequenceWriter : trying to write a 2D pre-scan image in a sequence of another type of image !"));
101 
102  std::string mhdImageFileName = m_sequenceDirectory + vpIoTools::path("/") + std::string("image%05d.mhd");
103  std::string rawImageFileName = m_sequenceDirectory + vpIoTools::path("/") + std::string("image%05d.raw");
104 
105  char mhdFileNamebuffer[FILENAME_MAX];
106  sprintf(mhdFileNamebuffer, mhdImageFileName.c_str(), m_imageCounter);
107 
108  char rawFileNamebuffer[FILENAME_MAX];
109  sprintf(rawFileNamebuffer, rawImageFileName.c_str(), m_imageCounter);
110 
111  char rawFileNamebufferMin[FILENAME_MAX]; // filename without path
112  sprintf(rawFileNamebufferMin, "image%05d.raw", m_imageCounter);
113 
114  usMetaHeaderParser::MHDHeader header;
115  header.dim[0] = image.getWidth();
116  header.dim[1] = image.getHeight();
117  header.elementSpacing[0] = 1.0;
118  header.elementSpacing[1] = 1.0;
119  header.elementType = usMetaHeaderParser::MET_UCHAR;
120  header.imageType = us::PRESCAN_2D;
121  header.isTransducerConvex = image.isTransducerConvex();
122  header.MHDFileName = std::string(mhdFileNamebuffer);
123  header.numberOfDimensions = 2;
124  header.rawFileName = std::string(rawFileNamebufferMin);
125  header.samplingFrequency = image.getSamplingFrequency();
126  header.scanLineNumber = image.getScanLineNumber();
127  header.scanLinePitch = image.getScanLinePitch();
128  header.timestamp.push_back(timestamp);
129  header.transducerRadius = image.getTransducerRadius();
130  header.transmitFrequency = image.getTransmitFrequency();
131 
132  usMetaHeaderParser mhdParser;
133  mhdParser.setMHDHeader(header);
134  mhdParser.setAxialResolution(image.getAxialResolution());
135  mhdParser.parse();
136 
137  usRawFileParser rawParser;
138  rawParser.write(image, std::string(rawFileNamebuffer));
139 
140  m_imageCounter++;
141 }
142 
148 void usMHDSequenceWriter::write(const usImagePostScan2D<unsigned char> &image, const uint64_t timestamp)
149 {
150 
151  if (m_sequenceImageType == us::NOT_SET) // first image written
152  m_sequenceImageType = us::POSTSCAN_2D;
153 
154  if (m_sequenceImageType != us::POSTSCAN_2D)
155  throw(vpException(vpException::badValue,
156  "usMHDSequenceWriter : trying to write a 2D RF image in a sequence of another type of image !"));
157 
158  std::string mhdImageFileName = m_sequenceDirectory + vpIoTools::path("/") + std::string("image%05d.mhd");
159  std::string rawImageFileName = m_sequenceDirectory + vpIoTools::path("/") + std::string("image%05d.raw");
160 
161  char mhdFileNamebuffer[FILENAME_MAX];
162  sprintf(mhdFileNamebuffer, mhdImageFileName.c_str(), m_imageCounter);
163 
164  char rawFileNamebuffer[FILENAME_MAX];
165  sprintf(rawFileNamebuffer, rawImageFileName.c_str(), m_imageCounter);
166 
167  char rawFileNamebufferMin[FILENAME_MAX]; // filename without path
168  sprintf(rawFileNamebufferMin, "image%05d.raw", m_imageCounter);
169 
170  usMetaHeaderParser::MHDHeader header;
171  header.dim[0] = image.getWidth();
172  header.dim[1] = image.getHeight();
173  header.elementSpacing[0] = image.getWidthResolution();
174  header.elementSpacing[1] = image.getHeightResolution();
175  ;
176  header.elementType = usMetaHeaderParser::MET_UCHAR;
177  header.imageType = us::POSTSCAN_2D;
178  header.isTransducerConvex = image.isTransducerConvex();
179  header.MHDFileName = std::string(mhdFileNamebuffer);
180  header.numberOfDimensions = 2;
181  header.rawFileName = std::string(rawFileNamebufferMin);
182  header.samplingFrequency = image.getSamplingFrequency();
183  header.scanLineNumber = image.getScanLineNumber();
184  header.scanLinePitch = image.getScanLinePitch();
185  header.timestamp.push_back(timestamp);
186  header.transducerRadius = image.getTransducerRadius();
187  header.transmitFrequency = image.getTransmitFrequency();
188 
189  usMetaHeaderParser mhdParser;
190  mhdParser.setMHDHeader(header);
191  mhdParser.setHeightResolution(image.getHeightResolution());
192  mhdParser.setWidthResolution(image.getWidthResolution());
193  mhdParser.parse();
194 
195  usRawFileParser rawParser;
196  rawParser.write(image, std::string(rawFileNamebuffer));
197 
198  m_imageCounter++;
199 }
200 
206 void usMHDSequenceWriter::write(const usImageRF3D<short int> &image, const std::vector<uint64_t> timestamp)
207 {
208 
209  if (m_sequenceImageType == us::NOT_SET) // first image written
210  m_sequenceImageType = us::RF_3D;
211 
212  if (m_sequenceImageType != us::RF_3D)
213  throw(vpException(vpException::badValue,
214  "usMHDSequenceWriter : trying to write a 3D RF image in a sequence of another type of image !"));
215 
216  std::string mhdImageFileName = m_sequenceDirectory + vpIoTools::path("/") + std::string("image%05d.mhd");
217  std::string rawImageFileName = m_sequenceDirectory + vpIoTools::path("/") + std::string("image%05d.raw");
218 
219  char mhdFileNamebuffer[FILENAME_MAX];
220  sprintf(mhdFileNamebuffer, mhdImageFileName.c_str(), m_imageCounter);
221 
222  char rawFileNamebuffer[FILENAME_MAX];
223  sprintf(rawFileNamebuffer, rawImageFileName.c_str(), m_imageCounter);
224 
225  char rawFileNamebufferMin[FILENAME_MAX]; // filename without path
226  sprintf(rawFileNamebufferMin, "image%05d.raw", m_imageCounter);
227 
228  usMetaHeaderParser::MHDHeader header;
229  header.dim[0] = image.getWidth();
230  header.dim[1] = image.getHeight();
231  header.dim[2] = image.getNumberOfFrames();
232  header.elementSpacing[0] = 1.0;
233  header.elementSpacing[1] = 1.0;
234  header.elementSpacing[2] = 1.0;
235  header.elementType = usMetaHeaderParser::MET_SHORT;
236  header.frameNumber = image.getFrameNumber();
237  header.framePitch = image.getFramePitch();
238  header.imageType = us::RF_3D;
239  header.isTransducerConvex = image.isTransducerConvex();
240  header.MHDFileName = std::string(mhdFileNamebuffer);
241  header.motorRadius = image.getMotorRadius();
242  header.motorType = image.getMotorType();
243  header.numberOfDimensions = 3;
244  header.rawFileName = std::string(rawFileNamebufferMin);
245  header.samplingFrequency = image.getSamplingFrequency();
246  header.scanLineNumber = image.getScanLineNumber();
247  header.scanLinePitch = image.getScanLinePitch();
248  header.timestamp = timestamp;
249  header.transducerRadius = image.getTransducerRadius();
250  header.transmitFrequency = image.getTransmitFrequency();
251 
252  usMetaHeaderParser mhdParser;
253  mhdParser.setMHDHeader(header);
254  mhdParser.setAxialResolution(image.getAxialResolution());
255  mhdParser.parse();
256 
257  usRawFileParser rawParser;
258  rawParser.write(image, std::string(rawFileNamebuffer));
259 
260  m_imageCounter++;
261 }
262 
268 void usMHDSequenceWriter::write(const usImagePreScan3D<unsigned char> &image, const std::vector<uint64_t> timestamp)
269 {
270 
271  if (m_sequenceImageType == us::NOT_SET) // first image written
272  m_sequenceImageType = us::PRESCAN_3D;
273 
274  if (m_sequenceImageType != us::PRESCAN_3D)
275  throw(vpException(
276  vpException::badValue,
277  "usMHDSequenceWriter : trying to write a 3D pre-scan image in a sequence of another type of image !"));
278 
279  std::string mhdImageFileName = m_sequenceDirectory + vpIoTools::path("/") + std::string("image%05d.mhd");
280  std::string rawImageFileName = m_sequenceDirectory + vpIoTools::path("/") + std::string("image%05d.raw");
281 
282  char mhdFileNamebuffer[FILENAME_MAX];
283  sprintf(mhdFileNamebuffer, mhdImageFileName.c_str(), m_imageCounter);
284 
285  char rawFileNamebuffer[FILENAME_MAX];
286  sprintf(rawFileNamebuffer, rawImageFileName.c_str(), m_imageCounter);
287 
288  char rawFileNamebufferMin[FILENAME_MAX]; // filename without path
289  sprintf(rawFileNamebufferMin, "image%05d.raw", m_imageCounter);
290 
291  usMetaHeaderParser::MHDHeader header;
292  header.dim[0] = image.getWidth();
293  header.dim[1] = image.getHeight();
294  header.dim[2] = image.getNumberOfFrames();
295  header.elementSpacing[0] = 1.0;
296  header.elementSpacing[1] = 1.0;
297  header.elementSpacing[2] = 1.0;
298  header.elementType = usMetaHeaderParser::MET_UCHAR;
299  header.frameNumber = image.getFrameNumber();
300  header.framePitch = image.getFramePitch();
301  header.imageType = us::PRESCAN_3D;
302  header.isTransducerConvex = image.isTransducerConvex();
303  header.MHDFileName = std::string(mhdFileNamebuffer);
304  header.motorRadius = image.getMotorRadius();
305  header.motorType = image.getMotorType();
306  header.numberOfDimensions = 3;
307  header.rawFileName = std::string(rawFileNamebufferMin);
308  header.samplingFrequency = image.getSamplingFrequency();
309  header.scanLineNumber = image.getScanLineNumber();
310  header.scanLinePitch = image.getScanLinePitch();
311  header.timestamp = timestamp;
312  header.transducerRadius = image.getTransducerRadius();
313  header.transmitFrequency = image.getTransmitFrequency();
314 
315  usMetaHeaderParser mhdParser;
316  mhdParser.setMHDHeader(header);
317  mhdParser.setAxialResolution(image.getAxialResolution());
318  mhdParser.parse();
319 
320  usRawFileParser rawParser;
321  rawParser.write(image, std::string(rawFileNamebuffer));
322 
323  m_imageCounter++;
324 }
325 
331 void usMHDSequenceWriter::write(const usImagePostScan3D<unsigned char> &image, const uint64_t timestamp)
332 {
333 
334  if (m_sequenceImageType == us::NOT_SET) // first image written
335  m_sequenceImageType = us::POSTSCAN_3D;
336 
337  if (m_sequenceImageType != us::POSTSCAN_3D)
338  throw(vpException(
339  vpException::badValue,
340  "usMHDSequenceWriter : trying to write a 3D post-scan image in a sequence of another type of image !"));
341 
342  std::string mhdImageFileName = m_sequenceDirectory + vpIoTools::path("/") + std::string("image%05d.mhd");
343  std::string rawImageFileName = m_sequenceDirectory + vpIoTools::path("/") + std::string("image%05d.raw");
344 
345  char mhdFileNamebuffer[FILENAME_MAX];
346  sprintf(mhdFileNamebuffer, mhdImageFileName.c_str(), m_imageCounter);
347 
348  char rawFileNamebuffer[FILENAME_MAX];
349  sprintf(rawFileNamebuffer, rawImageFileName.c_str(), m_imageCounter);
350 
351  char rawFileNamebufferMin[FILENAME_MAX]; // filename without path
352  sprintf(rawFileNamebufferMin, "image%05d.raw", m_imageCounter);
353 
354  usMetaHeaderParser::MHDHeader header;
355  header.dim[0] = image.getWidth();
356  header.dim[1] = image.getHeight();
357  header.dim[2] = image.getNumberOfFrames();
358  header.elementSpacing[0] = 1.0;
359  header.elementSpacing[1] = 1.0;
360  header.elementSpacing[2] = 1.0;
361  header.elementType = usMetaHeaderParser::MET_UCHAR;
362  header.frameNumber = image.getFrameNumber();
363  header.framePitch = image.getFramePitch();
364  header.imageType = us::POSTSCAN_3D;
365  header.isTransducerConvex = image.isTransducerConvex();
366  header.MHDFileName = std::string(mhdFileNamebuffer);
367  header.motorRadius = image.getMotorRadius();
368  header.motorType = image.getMotorType();
369  header.numberOfDimensions = 3;
370  header.rawFileName = std::string(rawFileNamebufferMin);
371  header.samplingFrequency = image.getSamplingFrequency();
372  header.scanLineNumber = image.getScanLineNumber();
373  header.scanLinePitch = image.getScanLinePitch();
374  header.timestamp.push_back(timestamp);
375  header.transducerRadius = image.getTransducerRadius();
376  header.transmitFrequency = image.getTransmitFrequency();
377 
378  usMetaHeaderParser mhdParser;
379  mhdParser.setMHDHeader(header);
380  mhdParser.parse();
381 
382  usRawFileParser rawParser;
383  rawParser.write(image, std::string(rawFileNamebuffer));
384 
385  m_imageCounter++;
386 }
unsigned int getNumberOfFrames() const
Definition: usImage3D.h:137
unsigned int getHeight() const
Definition: usImage3D.h:131
unsigned int getWidth() const
Definition: usImage3D.h:125
double getHeightResolution() const
double getWidthResolution() const
unsigned int getHeight() const
Definition: usImageRF2D.h:412
unsigned int getWidth() const
Definition: usImageRF2D.h:424
unsigned int getWidth() const
Definition: usImageRF3D.h:471
unsigned int getHeight() const
Definition: usImageRF3D.h:477
unsigned int getNumberOfFrames() const
Definition: usImageRF3D.h:483
void setSequenceDirectory(const std::string sequenceDirectory)
void write(const usImageRF2D< short int > &image, const uint64_t timestamp)
unsigned int getFrameNumber() const
double getMotorRadius() const
double getFramePitch() const
usMotorType getMotorType() const
double getTransducerRadius() const
unsigned int getScanLineNumber() const
General tools.
@ PRESCAN_2D
Definition: us.h:70
@ POSTSCAN_2D
Definition: us.h:72
@ RF_2D
Definition: us.h:68
@ PRESCAN_3D
Definition: us.h:71
@ NOT_SET
Definition: us.h:67
@ POSTSCAN_3D
Definition: us.h:73
@ RF_3D
Definition: us.h:69