40 #include <visp3/core/vpXmlParser.h>
41 #include <visp3/io/vpImageIo.h>
43 #include <visp3/ustk_core/usImageIo.h>
44 #include <visp3/ustk_core/usImagePreScanSettings.h>
45 #include <visp3/ustk_core/usMotorSettings.h>
46 #include <visp3/ustk_core/usRawFileParser.h>
47 #include <visp3/ustk_core/usRfReader.h>
48 #include <visp3/ustk_core/usSequenceReader.h>
52 std::string ext = usImageIo::getExtension(headerFileName);
53 if (ext.compare(
".xml") == 0)
55 else if (ext.compare(
".XML") == 0)
57 else if (ext.compare(
".mhd") == 0)
59 else if (ext.compare(
".MHD") == 0)
61 else if (ext.compare(
".vol") == 0)
63 else if (ext.compare(
".VOL") == 0)
65 else if (ext.compare(
".rf") == 0)
67 else if (ext.compare(
".RF") == 0)
73 std::string usImageIo::getExtension(
const std::string &filename)
76 size_t dot = filename.find_last_of(
".");
77 std::string filenameCopy = filename;
78 std::string ext = filenameCopy.substr(dot, filenameCopy.size() - 1);
92 write(imageRf2D, headerFileName, std::string(
".png"));
94 write(imageRf2D, headerFileName, std::string(
".raw"));
105 const std::string &imageExtension2D)
110 if (imageExtension2D !=
".raw") {
111 throw(vpException(vpException::fatalError,
"mhd files goes with .raw image extension"));
114 std::string imageFileName = vpIoTools::splitChain(headerFileName,
".")[0].append(
".raw");
116 usMetaHeaderParser::MHDHeader header;
117 header.numberOfDimensions = 2;
118 header.elementType = usMetaHeaderParser::MET_SHORT;
120 header.elementSpacing[0] = 1;
121 header.elementSpacing[1] = 1;
125 header.MHDFileName = headerFileName;
127 header.rawFileName = vpIoTools::getName(imageFileName);
134 usMetaHeaderParser mhdParser;
135 mhdParser.setMHDHeader(header);
140 usRawFileParser rawParser;
141 rawParser.write(imageRf2D, imageFileName);
143 throw(vpException(vpException::fatalError,
"Only mdh/raw files types are allowed to write 3D RF images."));
158 reader.setFileName(headerFileName);
159 reader.open(imageRf2D);
162 usMetaHeaderParser mhdParser;
163 mhdParser.read(headerFileName);
165 throw(vpException(vpException::badValue,
"Reading a non rf 2D image!"));
167 if (mhdParser.getElementType() != usMetaHeaderParser::MET_SHORT) {
168 throw(vpException(vpException::badValue,
"Reading a non short image!"));
171 usMetaHeaderParser::MHDHeader mhdHeader = mhdParser.getMHDHeader();
184 imageRf2D.
resize(mhdHeader.dim[1], mhdHeader.dim[0]);
187 usRawFileParser rawParser;
188 std::string fullImageFileName =
189 vpIoTools::getParent(headerFileName) + vpIoTools::path(
"/") + mhdParser.getRawFileName();
190 rawParser.read(imageRf2D, fullImageFileName);
192 throw(vpException(vpException::fatalError,
"Unknown header format."));
205 write(imageRf3D, headerFileName, std::string(
".png"));
207 write(imageRf3D, headerFileName, std::string(
".raw"));
218 const std::string &imageExtension3D)
223 if (imageExtension3D !=
".raw") {
224 throw(vpException(vpException::fatalError,
"mhd files goes with .raw image extension"));
226 std::string imageFileName = vpIoTools::splitChain(headerFileName,
".")[0].append(
".raw");
228 usMetaHeaderParser::MHDHeader header;
229 header.numberOfDimensions = 3;
230 header.elementType = usMetaHeaderParser::MET_SHORT;
232 header.elementSpacing[0] = 1;
233 header.elementSpacing[1] = 1;
234 header.elementSpacing[2] = 1;
235 header.dim[0] = imageRf3D.
getWidth();
239 header.MHDFileName = headerFileName;
241 header.rawFileName = vpIoTools::getName(imageFileName);
251 usMetaHeaderParser mhdParser;
252 mhdParser.setMHDHeader(header);
257 usRawFileParser rawParser;
258 rawParser.write(imageRf3D, imageFileName);
260 throw(vpException(vpException::fatalError,
"Unknown extension, only mdh allowed for 3D RF images."));
274 usMetaHeaderParser mhdParser;
275 mhdParser.read(headerFileName);
277 throw(vpException(vpException::badValue,
"Reading a non rf 3D image!"));
279 if (mhdParser.getElementType() != usMetaHeaderParser::MET_SHORT) {
280 throw(vpException(vpException::badValue,
"Reading a non short image!"));
283 usMetaHeaderParser::MHDHeader mhdHeader = mhdParser.getMHDHeader();
286 imageRf3.
resize(mhdHeader.dim[1], mhdHeader.dim[0], mhdHeader.dim[2]);
294 settings.
setDepth(mhdParser.getAxialResolution() * mhdHeader.dim[1]);
307 usRawFileParser rawParser;
308 std::string fullImageFileName =
309 vpIoTools::getParent(headerFileName) + vpIoTools::path(
"/") + mhdParser.getRawFileName();
310 rawParser.read(imageRf3, fullImageFileName);
312 throw(vpException(vpException::fatalError,
"Only mdh type is allowed for RF 3D."));
325 write(preScanImage, headerFileName, std::string(
".png"));
327 write(preScanImage, headerFileName, std::string(
".raw"));
329 throw(vpException(vpException::fatalError,
"Unknown extension."));
340 const std::string &imageExtension2D)
345 std::string imageFileName = vpIoTools::splitChain(headerFileName,
".")[0].append(imageExtension2D);
346 #ifdef VISP_HAVE_XML2
349 vpImageIo::write(preScanImage, imageFileName);
357 imageFileName = vpIoTools::getName(imageFileName);
360 xmlSettings.save(headerFileName);
361 }
catch (std::exception &e) {
362 std::cout <<
"Error writing postScan image : " << std::endl;
363 std::cout << e.what() << std::endl;
366 throw(vpException(vpException::fatalError,
"Requires xml2"));
369 if (imageExtension2D !=
".raw") {
370 throw(vpException(vpException::fatalError,
"mhd files goes with .raw image extension"));
372 std::string imageFileName = vpIoTools::splitChain(headerFileName,
".")[0].append(
".raw");
374 usMetaHeaderParser::MHDHeader header;
375 header.numberOfDimensions = 2;
376 header.elementType = usMetaHeaderParser::MET_UCHAR;
378 header.elementSpacing[0] = 1;
379 header.elementSpacing[1] = 1;
383 header.MHDFileName = headerFileName;
385 header.rawFileName = vpIoTools::getName(imageFileName);
392 usMetaHeaderParser mhdParser;
393 mhdParser.setMHDHeader(header);
398 usRawFileParser rawParser;
399 rawParser.write(preScanImage, imageFileName);
401 throw(vpException(vpException::fatalError,
"Unknown extension."));
414 #ifdef VISP_HAVE_XML2
417 xmlSettings.parse(headerFileName);
419 std::string fullImageFileName =
420 vpIoTools::getParent(headerFileName) + vpIoTools::path(
"/") + xmlSettings.
getImageFileName();
421 vpImageIo::read(preScanImage, fullImageFileName);
432 throw(vpException(vpException::fatalError,
"Requires xml2 library"));
436 usMetaHeaderParser mhdParser;
437 mhdParser.read(headerFileName);
439 throw(vpException(vpException::badValue,
"Reading a non pre-scan 2D image!"));
441 if (mhdParser.getElementType() != usMetaHeaderParser::MET_UCHAR) {
442 throw(vpException(vpException::badValue,
"Reading a non unsigned char image!"));
445 usMetaHeaderParser::MHDHeader mhdHeader = mhdParser.getMHDHeader();
448 preScanImage.
resize(mhdHeader.dim[1], mhdHeader.dim[0], 0);
462 usRawFileParser rawParser;
463 std::string fullImageFileName =
464 vpIoTools::getParent(headerFileName) + vpIoTools::path(
"/") + mhdParser.getRawFileName();
465 rawParser.read(preScanImage, fullImageFileName);
467 throw(vpException(vpException::fatalError,
"Unknown header format."));
480 write(preScanImage, headerFileName, std::string(
".png"));
482 write(preScanImage, headerFileName, std::string(
".raw"));
493 const std::string &imageExtension2D)
499 #ifdef VISP_HAVE_XML2
501 throw(vpException(vpException::notImplementedError,
"Reading a 3D image as a set of 2D frames is not implemented"));
503 throw(vpException(vpException::fatalError,
"Requires xml2"));
506 if (imageExtension2D !=
".raw") {
507 throw(vpException(vpException::fatalError,
"mhd files goes with .raw image extension"));
509 std::string imageFileName = vpIoTools::splitChain(headerFileName,
".")[0].append(
".raw");
511 usMetaHeaderParser::MHDHeader header;
512 header.numberOfDimensions = 3;
513 header.elementType = usMetaHeaderParser::MET_UCHAR;
515 header.elementSpacing[0] = 1;
516 header.elementSpacing[1] = 1;
517 header.elementSpacing[2] = 1;
518 header.dim[0] = preScanImage.
getWidth();
519 header.dim[1] = preScanImage.
getHeight();
522 header.MHDFileName = headerFileName;
524 header.rawFileName = vpIoTools::getName(imageFileName);
534 usMetaHeaderParser mhdParser;
535 mhdParser.setMHDHeader(header);
540 usRawFileParser rawParser;
541 rawParser.write(preScanImage, imageFileName);
543 throw(vpException(vpException::fatalError,
"Unknown extension."));
557 #ifdef VISP_HAVE_XML2
563 sequenceReader.
open(preScanFrame);
565 throw(vpException(vpException::fatalError,
"Trying to open a 2D image, check your xml settings (frameNumber) !"));
571 preScanImage.
insertFrame(preScanFrame, frameIndex);
573 while (!sequenceReader.
end()) {
574 sequenceReader.
acquire(preScanFrame);
575 preScanImage.
insertFrame(preScanFrame, frameIndex);
587 throw(vpException(vpException::fatalError,
"Requires xml2 library"));
591 usMetaHeaderParser mhdParser;
592 mhdParser.read(headerFileName);
594 throw(vpException(vpException::badValue,
"Reading a non pre-scan 3D image!"));
596 if (mhdParser.getElementType() != usMetaHeaderParser::MET_UCHAR) {
597 throw(vpException(vpException::badValue,
"Reading a non unsigned char image!"));
600 usMetaHeaderParser::MHDHeader mhdHeader = mhdParser.getMHDHeader();
603 preScanImage.
resize(mhdHeader.dim[1], mhdHeader.dim[0], mhdHeader.dim[2]);
611 settings.
setDepth(mhdParser.getAxialResolution() * mhdHeader.dim[1]);
624 usRawFileParser rawParser;
625 std::string fullImageFileName =
626 vpIoTools::getParent(headerFileName) + vpIoTools::path(
"/") + mhdParser.getRawFileName();
627 rawParser.read(preScanImage, fullImageFileName);
630 int szHeader =
sizeof(VolHeader);
643 std::ifstream volFile;
644 volFile.open(headerFileName.c_str(), std::ios::in | std::ios::binary);
647 while (n < szHeader) {
648 volFile.read(&
byte, 1);
649 ((
char *)&header)[n] = byte;
653 std::cout << std::endl
654 <<
"Data header information: " << std::endl
655 <<
" type = " << header.type << std::endl
656 <<
" volumes = " << header.volumes << std::endl
657 <<
" fpv = " << header.fpv << std::endl
658 <<
" w = " << header.w << std::endl
659 <<
" h = " << header.h << std::endl
660 <<
" ss = " << header.ss << std::endl;
663 if (header.type != 0)
664 throw(vpException(vpException::badValue,
"trying to read non-prescan in .vol file"));
668 throw(vpException(vpException::badValue,
".vol file doesn't contain unsigned char data"));
674 preScanImage.
resize(header.h, header.w, header.fpv);
677 for (
int k = 0; k < header.fpv; k++) {
678 for (
int j = 0; j < header.w; j++) {
679 for (
int i = 0; i < header.h; i++) {
680 volFile.read((
char *)&voxel, 1);
681 preScanImage(j, i, k, voxel);
687 throw(vpException(vpException::fatalError,
"Unknown header format."));
697 const std::string &imageExtension2D)
700 (void)preScan2DImage;
701 (void)headerFileName;
702 (void)imageExtension2D;
714 (void)headerFileName;
724 const std::string &imageExtension2D)
727 (void)preScan3DImage;
728 (void)headerFileName;
729 (void)imageExtension2D;
740 (void)preScan3DImage;
741 (void)headerFileName;
754 write(postScanImage, headerFileName, std::string(
".png"));
756 write(postScanImage, headerFileName, std::string(
".raw"));
767 const std::string &imageExtension2D)
771 #ifdef VISP_HAVE_XML2
772 std::string imageFileName = vpIoTools::splitChain(headerFileName,
".")[0].append(imageExtension2D);
775 vpImageIo::writePNG(postScanImage, imageFileName);
785 imageFileName = vpIoTools::getName(imageFileName);
787 xmlSettings.save(headerFileName);
788 }
catch (std::exception &e) {
789 std::cout <<
"Error writing postScan image : " << std::endl;
790 std::cout << e.what() << std::endl;
793 throw(vpException(vpException::fatalError,
"Requires xml2 library"));
796 if (imageExtension2D !=
".raw" && imageExtension2D !=
".RAW") {
797 throw(vpException(vpException::fatalError,
"mhd files goes with .raw image extension"));
800 std::string imageFileName = vpIoTools::splitChain(headerFileName,
".")[0].append(
".raw");
802 usMetaHeaderParser::MHDHeader header;
803 header.numberOfDimensions = 2;
804 header.elementType = usMetaHeaderParser::MET_UCHAR;
806 header.elementSpacing[0] = 1;
807 header.elementSpacing[1] = 1;
808 header.dim[0] = postScanImage.getWidth();
809 header.dim[1] = postScanImage.getHeight();
811 header.MHDFileName = headerFileName;
813 header.rawFileName = vpIoTools::getName(imageFileName);
821 usMetaHeaderParser mhdParser;
822 mhdParser.setMHDHeader(header);
828 usRawFileParser rawParser;
829 rawParser.write(postScanImage, imageFileName);
831 throw(vpException(vpException::fatalError,
"Unknown header format."));
843 #ifdef VISP_HAVE_XML2
845 xmlSettings.parse(headerFileName);
847 std::string fullImageFileName =
848 vpIoTools::getParent(headerFileName) + vpIoTools::path(
"/") + xmlSettings.
getImageFileName();
849 vpImageIo::read(postScanImage, fullImageFileName);
860 throw(vpException(vpException::fatalError,
"Requires xml2 library"));
865 usMetaHeaderParser mhdParser;
866 mhdParser.read(headerFileName);
868 throw(vpException(vpException::badValue,
"Reading a non post-scan 2D image!"));
870 if (mhdParser.getElementType() != usMetaHeaderParser::MET_UCHAR) {
871 throw(vpException(vpException::badValue,
"Reading a non unsigned char image!"));
874 usMetaHeaderParser::MHDHeader mhdHeader = mhdParser.getMHDHeader();
877 postScanImage.resize(mhdHeader.dim[1], mhdHeader.dim[0]);
887 postScanImage.resize(mhdHeader.dim[1], mhdHeader.dim[0]);
889 usRawFileParser rawParser;
890 std::string fullImageFileName =
891 vpIoTools::getParent(headerFileName) + vpIoTools::path(
"/") + mhdParser.getRawFileName();
892 rawParser.read(postScanImage, fullImageFileName);
894 throw(vpException(vpException::fatalError,
"Unknown header format."));
907 write(postScanImage, headerFileName, std::string(
".png"));
909 write(postScanImage, headerFileName, std::string(
".raw"));
920 const std::string &imageExtension2D)
924 #ifdef VISP_HAVE_XML2
927 throw(vpException(vpException::fatalError,
"Requires xml2 library"));
930 if (imageExtension2D !=
".raw") {
931 throw(vpException(vpException::fatalError,
"mhd files goes with .raw image extension"));
933 std::string imageFileName = vpIoTools::splitChain(headerFileName,
".")[0].append(
".raw");
935 usMetaHeaderParser::MHDHeader header;
936 header.numberOfDimensions = 3;
937 header.elementType = usMetaHeaderParser::MET_UCHAR;
942 header.dim[0] = postScanImage.
getWidth();
943 header.dim[1] = postScanImage.
getHeight();
946 header.MHDFileName = headerFileName;
948 header.rawFileName = vpIoTools::getName(imageFileName);
960 usMetaHeaderParser mhdParser;
961 mhdParser.setMHDHeader(header);
967 usRawFileParser rawParser;
968 rawParser.write(postScanImage, imageFileName);
970 throw(vpException(vpException::fatalError,
"Unknown header format."));
982 #ifdef VISP_HAVE_XML2
985 throw(vpException(vpException::fatalError,
"Requires xml2 library"));
989 usMetaHeaderParser mhdParser;
990 mhdParser.read(headerFileName);
992 throw(vpException(vpException::badValue,
"Reading a non post-scan 3D image!"));
994 if (mhdParser.getElementType() != usMetaHeaderParser::MET_UCHAR) {
995 throw(vpException(vpException::badValue,
"Reading a non unsigned char image!"));
998 usMetaHeaderParser::MHDHeader mhdHeader = mhdParser.getMHDHeader();
1001 postScanImage.
resize(mhdHeader.dim[1], mhdHeader.dim[0], mhdHeader.dim[2]);
1018 usRawFileParser rawParser;
1019 std::string fullImageFileName =
1020 vpIoTools::getParent(headerFileName) + vpIoTools::path(
"/") + mhdParser.getRawFileName();
1021 rawParser.read(postScanImage, fullImageFileName);
1023 throw(vpException(vpException::fatalError,
"Unknown header format."));
unsigned int getNumberOfFrames() const
void resize(unsigned int height, unsigned int width, unsigned int numberOfFrames)
unsigned int getHeight() const
unsigned int getWidth() const
static usHeaderFormatType getHeaderFormat(const std::string &headerfilename)
static void read(usImageRF2D< short int > &imageRf2D, const std::string &headerFileName)
static void write(const usImageRF2D< short > &rfImage, const std::string &headerFileName, const std::string &imageExtension2D)
void setHeightResolution(double heightResolution)
double getHeightResolution() const
void setWidthResolution(double widthResolution)
double getWidthResolution() const
double getElementSpacingX() const
void setElementSpacingZ(double elementSpacingZ)
void setElementSpacingX(double elementSpacingX)
double getElementSpacingY() const
double getElementSpacingZ() const
void setElementSpacingY(double elementSpacingY)
void resize(const unsigned int h, const unsigned int w)
unsigned int getBModeSampleNumber() const
void setScanLineNumber(unsigned int scanLineNumber)
void resize(unsigned int height, unsigned int width, unsigned int numberOfFrames)
void insertFrame(const usImagePreScan2D< Type > &frame, unsigned int index)
Settings associated to ultrasound pre-scan images implemented in usImageRF2D, usImageRF3D,...
void setImagePreScanSettings(const usImagePreScanSettings &preScanSettings)
double getAxialResolution() const
void setAxialResolution(const double axialResolution)
2D Radio Frequence (RF) ultrasound image.
void resize(const unsigned int height, const unsigned int width)
unsigned int getRFSampleNumber() const
3D Radio Frequence (RF) ultrasound image.
unsigned int getWidth() const
void resize(unsigned int height, unsigned int width, unsigned int numberOfFrames)
unsigned int getHeight() const
unsigned int getNumberOfFrames() const
Input/output operations between ultrasound image settings and the associated xml files.
double getWidthResolution() const
usMotorSettings getMotorSettings() const
void setImageFileName(const std::string &imageFileName)
void setImageType(us::ImageType image_type)
usTransducerSettings getTransducerSettings() const
void setImageSettings(double transducerRadius, double scanLinePitch, bool isTransducerConvex, double axialResolution, us::ImageType image_type, int samplingFrequency, int transmitFrequency)
std::string getImageFileName() const
double getHeightResolution() const
double getAxialResolution() const
Generic class for 3D ultrasound motor settings associated to the 3D probe used during acquisition.
void setMotorSettings(const usMotorSettings &other)
unsigned int getFrameNumber() const
double getMotorRadius() const
void setMotorType(const usMotorType &motorType)
void setMotorRadius(double motorRadius)
double getFramePitch() const
void setFrameNumber(unsigned int frameNumber)
usMotorType getMotorType() const
void setFramePitch(double framePitch)
Reading of sequences of ultrasound images.
void open(ImageType &image, uint64_t ×tamp)
void acquire(ImageType &image)
void setSequenceFileName(const std::string &sequenceFileName)
usImageSettingsXmlParser getXmlParser()
void setTransducerConvexity(const bool isTransducerConvex)
int getTransmitFrequency() const
void setDepth(double depth)
void setScanLinePitch(const double scanLinePitch)
void setTransmitFrequency(const int transmitFrequency)
double getScanLinePitch() const
void setSamplingFrequency(const int samplingFrequency)
void setTransducerRadius(const double transducerRadius)
bool isTransducerConvex() const
double getTransducerRadius() const
int getSamplingFrequency() const
unsigned int getScanLineNumber() const
void setScanLineNumber(unsigned int scanLineNumber)