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