40 #ifndef __usSequenceReader_h_
41 #define __usSequenceReader_h_
49 #include <visp3/core/vpConfig.h>
53 #include <visp3/core/vpException.h>
54 #include <visp3/core/vpImage.h>
55 #include <visp3/io/vpImageIo.h>
57 #include <visp3/ustk_core/usImageIo.h>
58 #include <visp3/ustk_core/usImageSettingsXmlParser.h>
78 bool m_firstFrameIsSet;
82 bool m_lastFrameIsSet;
90 std::string m_sequenceFileName;
91 std::string m_genericImageFileName;
98 bool m_enableLoopCycling;
105 std::vector<uint64_t> m_timestamps;
114 void acquire(ImageType &image, uint64_t ×tamp);
126 if (m_enableLoopCycling) {
127 if (loopIncrement == 1) {
128 if (m_frameCount > m_lastFrame) {
133 }
else if (loopIncrement == -1) {
134 if (m_frameCount < m_firstFrame) {
140 }
else if (m_frameCount > m_lastFrame || m_frameCount < m_firstFrame)
164 void open(ImageType &image, uint64_t ×tamp);
180 template <
class ImageType>
182 : m_frame(), m_frameRate(0.0), m_firstFrame(0), m_firstFrameIsSet(false), m_lastFrame(0), m_lastFrameIsSet(false),
183 m_frameCount(0), m_sequenceFileName(
""), m_genericImageFileName(
""), m_fileNameIsSet(false), is_open(false),
184 m_enableLoopCycling(false), loopIncrement(1)
199 m_sequenceFileName = sequenceFileName;
200 m_fileNameIsSet =
true;
209 m_firstFrame = firstIndex;
210 m_firstFrameIsSet =
true;
219 m_lastFrame = lastIndex;
220 m_lastFrameIsSet =
true;
230 throw(vpException(vpException::notImplementedError));
242 throw(vpException(vpException::notImplementedError));
247 if (!m_fileNameIsSet) {
248 throw(vpException(vpException::badValue,
"Sequence settings file name not set"));
251 m_xmlParser.parse(m_sequenceFileName);
253 throw(vpException(vpException::badValue),
"trying to open a non-usImagePreScan2D image !");
255 setFirstFrameIndex(m_xmlParser.getSequenceStartNumber());
256 setLastFrameIndex(m_xmlParser.getSequenceStopNumber());
257 m_frameRate = m_xmlParser.getSequenceFrameRate();
258 m_genericImageFileName = m_xmlParser.getImageFileName();
261 m_frame.setTransducerRadius(m_xmlParser.getTransducerSettings().getTransducerRadius());
262 m_frame.setScanLinePitch(m_xmlParser.getTransducerSettings().getScanLinePitch());
263 m_frame.setScanLineNumber(m_xmlParser.getTransducerSettings().getScanLineNumber());
264 m_frame.setTransducerConvexity(m_xmlParser.getTransducerSettings().isTransducerConvex());
265 m_frame.setAxialResolution(m_xmlParser.getAxialResolution());
266 m_frame.setSamplingFrequency(m_xmlParser.getTransducerSettings().getSamplingFrequency());
267 m_frame.setTransmitFrequency(m_xmlParser.getTransducerSettings().getTransmitFrequency());
270 char buffer[FILENAME_MAX];
271 sprintf(buffer, m_genericImageFileName.c_str(), m_firstFrame);
272 std::string imageFileName;
274 std::vector<std::string> splitName =
275 vpIoTools::splitChain(vpIoTools::splitChain(m_genericImageFileName, std::string(
"/")).back(), std::string(
"."));
277 std::string parentName = vpIoTools::getParent(m_sequenceFileName);
278 if (!parentName.empty()) {
279 parentName = parentName + vpIoTools::path(
"/");
281 std::vector<std::string> splitNameDirs = vpIoTools::splitChain(m_genericImageFileName, std::string(
"/"));
282 if (splitNameDirs.size() > 1) {
283 for (
unsigned int i = 0; i < splitNameDirs.size() - 1; i++)
284 parentName += (splitNameDirs.at(i) + vpIoTools::path(
"/"));
286 if (splitName.size() == 2) {
287 imageFileName = parentName + vpIoTools::splitChain(std::string(buffer), std::string(
"/")).back();
288 }
else if (splitName.size() == 3) {
289 std::vector<std::string> dirFiles;
291 if (vpIoTools::checkDirectory(vpIoTools::getParent(m_sequenceFileName))) {
292 dirFiles = vpIoTools::getDirFiles(parentName);
294 if (dirFiles.size() == (
unsigned int)(m_xmlParser.getSequenceStopNumber() - m_xmlParser.getSequenceStartNumber() +
296 for (
unsigned int i = 0; i < dirFiles.size(); i++) {
297 if (vpIoTools::splitChain(dirFiles.at(i), std::string(
".")).at(1) == std::string(
"xml"))
298 dirFiles.erase(dirFiles.begin() + i);
301 if (dirFiles.size() !=
302 (
unsigned int)(m_xmlParser.getSequenceStopNumber() - m_xmlParser.getSequenceStartNumber() + 1))
303 throw(vpException(vpException::fatalError,
"For imgage sequnces with timeStamps, the directory must contain "
304 "only the entire image sequence (no additionnal files allowed)"));
308 while (i < dirFiles.size()) {
309 uint64_t timestamp_temp;
310 std::istringstream(vpIoTools::splitChain(dirFiles.at(i), std::string(
".")).at(1)) >> timestamp_temp;
311 m_timestamps.push_back(timestamp_temp);
314 imageFileName = parentName + dirFiles.front();
316 throw(vpException(vpException::fatalError),
"Sequence filename incorrect !");
320 vpImageIo::read(image, imageFileName);
322 m_frame.setDepth((image.getHeight() - 1) * m_frame.getAxialResolution());
326 int scanlineNumber = image.getWidth();
330 m_frameCount = m_firstFrame + 1;
338 if (!m_fileNameIsSet) {
339 throw(vpException(vpException::badValue,
"Sequence settings file name not set"));
342 m_xmlParser.parse(m_sequenceFileName);
344 throw(vpException(vpException::badValue),
"trying to open a non-usImagePreScan2D image !");
346 setFirstFrameIndex(m_xmlParser.getSequenceStartNumber());
347 setLastFrameIndex(m_xmlParser.getSequenceStopNumber());
348 m_frameRate = m_xmlParser.getSequenceFrameRate();
349 m_genericImageFileName = m_xmlParser.getImageFileName();
352 m_frame.setTransducerRadius(m_xmlParser.getTransducerSettings().getTransducerRadius());
353 m_frame.setScanLinePitch(m_xmlParser.getTransducerSettings().getScanLinePitch());
354 m_frame.setScanLineNumber(m_xmlParser.getTransducerSettings().getScanLineNumber());
355 m_frame.setTransducerConvexity(m_xmlParser.getTransducerSettings().isTransducerConvex());
356 m_frame.setAxialResolution(m_xmlParser.getAxialResolution());
357 m_frame.setSamplingFrequency(m_xmlParser.getTransducerSettings().getSamplingFrequency());
358 m_frame.setTransmitFrequency(m_xmlParser.getTransducerSettings().getTransmitFrequency());
361 char buffer[FILENAME_MAX];
362 sprintf(buffer, m_genericImageFileName.c_str(), m_firstFrame);
363 std::string imageFileName;
365 std::vector<std::string> splitName =
366 vpIoTools::splitChain(vpIoTools::splitChain(m_genericImageFileName, std::string(
"/")).back(), std::string(
"."));
368 std::string parentName = vpIoTools::getParent(m_sequenceFileName);
369 if (!parentName.empty()) {
370 parentName = parentName + vpIoTools::path(
"/");
372 std::vector<std::string> splitNameDirs = vpIoTools::splitChain(m_genericImageFileName, std::string(
"/"));
373 if (splitNameDirs.size() > 1) {
374 for (
unsigned int i = 0; i < splitNameDirs.size() - 1; i++)
375 parentName += (splitNameDirs.at(i) + vpIoTools::path(
"/"));
377 if (splitName.size() == 2) {
378 imageFileName = parentName + vpIoTools::splitChain(std::string(buffer), std::string(
"/")).back();
380 m_timestamps.clear();
381 m_timestamps.push_back(timestamp);
382 }
else if (splitName.size() == 3) {
383 std::vector<std::string> dirFiles;
385 if (vpIoTools::checkDirectory(vpIoTools::getParent(m_sequenceFileName))) {
386 dirFiles = vpIoTools::getDirFiles(parentName);
388 if (dirFiles.size() == (
unsigned int)(m_xmlParser.getSequenceStopNumber() - m_xmlParser.getSequenceStartNumber() +
390 for (
unsigned int i = 0; i < dirFiles.size(); i++) {
391 if (vpIoTools::splitChain(dirFiles.at(i), std::string(
".")).at(1) == std::string(
"xml"))
392 dirFiles.erase(dirFiles.begin() + i);
395 if (dirFiles.size() !=
396 (
unsigned int)(m_xmlParser.getSequenceStopNumber() - m_xmlParser.getSequenceStartNumber() + 1))
397 throw(vpException(vpException::fatalError,
"For imgage sequnces with timeStamps, the directory must contain "
398 "only the entire image sequence (no additionnal files allowed)"));
402 while (i < dirFiles.size()) {
403 uint64_t timestamp_temp;
404 std::istringstream(vpIoTools::splitChain(dirFiles.at(i), std::string(
".")).at(1)) >> timestamp_temp;
405 m_timestamps.push_back(timestamp_temp);
408 std::istringstream(vpIoTools::splitChain(dirFiles.at(0), std::string(
".")).at(1)) >> timestamp;
410 imageFileName = parentName + dirFiles.front();
412 throw(vpException(vpException::fatalError),
"Sequence filename incorrect !");
416 vpImageIo::read(image, imageFileName);
418 m_frame.setDepth((image.getHeight() - 1) * m_frame.getAxialResolution());
422 int scanlineNumber = image.getWidth();
426 m_frameCount = m_firstFrame + 1;
433 if (!m_fileNameIsSet) {
434 throw(vpException(vpException::badValue,
"Sequence settings file name not set"));
437 m_xmlParser.parse(m_sequenceFileName);
439 throw(vpException(vpException::badValue),
"trying to open a non-usImagePostScan2D image !");
441 setFirstFrameIndex(m_xmlParser.getSequenceStartNumber());
442 setLastFrameIndex(m_xmlParser.getSequenceStopNumber());
443 m_frameRate = m_xmlParser.getSequenceFrameRate();
444 m_genericImageFileName = m_xmlParser.getImageFileName();
447 m_frame.setTransducerRadius(m_xmlParser.getTransducerSettings().getTransducerRadius());
448 m_frame.setScanLinePitch(m_xmlParser.getTransducerSettings().getScanLinePitch());
449 m_frame.setScanLineNumber(m_xmlParser.getTransducerSettings().getScanLineNumber());
450 m_frame.setTransducerConvexity(m_xmlParser.getTransducerSettings().isTransducerConvex());
451 m_frame.setWidthResolution(m_xmlParser.getWidthResolution());
452 m_frame.setHeightResolution(m_xmlParser.getHeightResolution());
453 m_frame.setSamplingFrequency(m_xmlParser.getTransducerSettings().getSamplingFrequency());
454 m_frame.setTransmitFrequency(m_xmlParser.getTransducerSettings().getTransmitFrequency());
457 char buffer[FILENAME_MAX];
458 sprintf(buffer, m_genericImageFileName.c_str(), m_firstFrame);
459 std::string imageFileName;
461 std::vector<std::string> splitName =
462 vpIoTools::splitChain(vpIoTools::splitChain(m_genericImageFileName, std::string(
"/")).back(), std::string(
"."));
464 std::string parentName = vpIoTools::getParent(m_sequenceFileName);
465 if (!parentName.empty()) {
466 parentName = parentName + vpIoTools::path(
"/");
468 std::vector<std::string> splitNameDirs = vpIoTools::splitChain(m_genericImageFileName, std::string(
"/"));
469 if (splitNameDirs.size() > 1) {
470 for (
unsigned int i = 0; i < splitNameDirs.size() - 1; i++)
471 parentName += (splitNameDirs.at(i) + vpIoTools::path(
"/"));
473 if (splitName.size() == 2) {
474 imageFileName = parentName + vpIoTools::splitChain(std::string(buffer), std::string(
"/")).back();
475 }
else if (splitName.size() == 3) {
476 std::vector<std::string> dirFiles;
478 if (vpIoTools::checkDirectory(vpIoTools::getParent(m_sequenceFileName))) {
479 dirFiles = vpIoTools::getDirFiles(parentName);
481 if (dirFiles.size() == (
unsigned int)(m_xmlParser.getSequenceStopNumber() - m_xmlParser.getSequenceStartNumber() +
483 for (
unsigned int i = 0; i < dirFiles.size(); i++) {
484 if (vpIoTools::splitChain(dirFiles.at(i), std::string(
".")).at(1) == std::string(
"xml"))
485 dirFiles.erase(dirFiles.begin() + i);
489 if (dirFiles.size() !=
490 (
unsigned int)(m_xmlParser.getSequenceStopNumber() - m_xmlParser.getSequenceStartNumber() + 1))
491 throw(vpException(vpException::fatalError,
"For imgage sequnces with timeStamps, the directory must contain "
492 "only the entire image sequence (no additionnal files allowed)"));
496 while (i < dirFiles.size()) {
497 uint64_t timestamp_temp;
498 std::istringstream(vpIoTools::splitChain(dirFiles.at(i), std::string(
".")).at(1)) >> timestamp_temp;
499 m_timestamps.push_back(timestamp_temp);
503 imageFileName = parentName + dirFiles.front();
505 throw(vpException(vpException::fatalError),
"Sequence filename incorrect !");
509 vpImageIo::read(image, imageFileName);
522 m_frameCount = m_firstFrame + 1;
530 if (!m_fileNameIsSet) {
531 throw(vpException(vpException::badValue,
"Sequence settings file name not set"));
534 m_xmlParser.parse(m_sequenceFileName);
536 throw(vpException(vpException::badValue),
"trying to open a non-usImagePostScan2D image !");
538 setFirstFrameIndex(m_xmlParser.getSequenceStartNumber());
539 setLastFrameIndex(m_xmlParser.getSequenceStopNumber());
540 m_frameRate = m_xmlParser.getSequenceFrameRate();
541 m_genericImageFileName = m_xmlParser.getImageFileName();
544 m_frame.setTransducerRadius(m_xmlParser.getTransducerSettings().getTransducerRadius());
545 m_frame.setScanLinePitch(m_xmlParser.getTransducerSettings().getScanLinePitch());
546 m_frame.setScanLineNumber(m_xmlParser.getTransducerSettings().getScanLineNumber());
547 m_frame.setTransducerConvexity(m_xmlParser.getTransducerSettings().isTransducerConvex());
548 m_frame.setWidthResolution(m_xmlParser.getWidthResolution());
549 m_frame.setHeightResolution(m_xmlParser.getHeightResolution());
550 m_frame.setSamplingFrequency(m_xmlParser.getTransducerSettings().getSamplingFrequency());
551 m_frame.setTransmitFrequency(m_xmlParser.getTransducerSettings().getTransmitFrequency());
554 char buffer[FILENAME_MAX];
555 sprintf(buffer, m_genericImageFileName.c_str(), m_firstFrame);
556 std::string imageFileName;
558 std::vector<std::string> splitName =
559 vpIoTools::splitChain(vpIoTools::splitChain(m_genericImageFileName, std::string(
"/")).back(), std::string(
"."));
561 std::string parentName = vpIoTools::getParent(m_sequenceFileName);
562 if (!parentName.empty()) {
563 parentName = parentName + vpIoTools::path(
"/");
565 std::vector<std::string> splitNameDirs = vpIoTools::splitChain(m_genericImageFileName, std::string(
"/"));
566 if (splitNameDirs.size() > 1) {
567 for (
unsigned int i = 0; i < splitNameDirs.size() - 1; i++)
568 parentName += (splitNameDirs.at(i) + vpIoTools::path(
"/"));
570 if (splitName.size() == 2) {
571 imageFileName = parentName + vpIoTools::splitChain(std::string(buffer), std::string(
"/")).back();
573 }
else if (splitName.size() == 3) {
574 std::istringstream(splitName.at(1)) >> timestamp;
575 std::vector<std::string> dirFiles;
577 if (vpIoTools::checkDirectory(vpIoTools::getParent(m_sequenceFileName))) {
578 dirFiles = vpIoTools::getDirFiles(parentName);
580 if (dirFiles.size() == (
unsigned int)(m_xmlParser.getSequenceStopNumber() - m_xmlParser.getSequenceStartNumber() +
582 for (
unsigned int i = 0; i < dirFiles.size(); i++) {
583 if (vpIoTools::splitChain(dirFiles.at(i), std::string(
".")).at(1) == std::string(
"xml"))
584 dirFiles.erase(dirFiles.begin() + i);
588 std::istringstream(vpIoTools::splitChain(dirFiles.at(0), std::string(
".")).at(1)) >> timestamp;
590 if (dirFiles.size() !=
591 (
unsigned int)(m_xmlParser.getSequenceStopNumber() - m_xmlParser.getSequenceStartNumber() + 1))
592 throw(vpException(vpException::fatalError,
"For imgage sequnces with timeStamps, the directory must contain "
593 "only the entire image sequence (no additionnal files allowed)"));
597 while (i < dirFiles.size()) {
598 uint64_t timestamp_temp;
599 std::istringstream(vpIoTools::splitChain(dirFiles.at(i), std::string(
".")).at(1)) >> timestamp_temp;
600 m_timestamps.push_back(timestamp_temp);
604 imageFileName = parentName + dirFiles.front();
606 throw(vpException(vpException::fatalError),
"Sequence filename incorrect !");
609 vpImageIo::read(image, imageFileName);
622 m_frameCount = m_firstFrame + 1;
638 char buffer[FILENAME_MAX];
639 sprintf(buffer, m_genericImageFileName.c_str(), m_frameCount);
640 std::string imageFileName;
642 std::vector<std::string> splitName =
643 vpIoTools::splitChain(vpIoTools::splitChain(m_genericImageFileName, std::string(
"/")).back(), std::string(
"."));
645 std::string parentName = vpIoTools::getParent(m_sequenceFileName);
646 if (!parentName.empty()) {
647 parentName = parentName + vpIoTools::path(
"/");
649 std::vector<std::string> splitNameDirs = vpIoTools::splitChain(m_genericImageFileName, std::string(
"/"));
650 if (splitNameDirs.size() > 1) {
651 for (
unsigned int i = 0; i < splitNameDirs.size() - 1; i++)
652 parentName += (splitNameDirs.at(i) + vpIoTools::path(
"/"));
654 if (splitName.size() == 2) {
655 imageFileName = parentName + vpIoTools::splitChain(std::string(buffer), std::string(
"/")).back();
656 }
else if (splitName.size() == 3) {
657 std::vector<std::string> dirFiles;
659 if (vpIoTools::checkDirectory(vpIoTools::getParent(m_sequenceFileName))) {
660 dirFiles = vpIoTools::getDirFiles(parentName);
662 if (dirFiles.size() == (
unsigned int)(m_xmlParser.getSequenceStopNumber() - m_xmlParser.getSequenceStartNumber() +
664 for (
unsigned int i = 0; i < dirFiles.size(); i++) {
665 if (vpIoTools::splitChain(dirFiles.at(i), std::string(
".")).at(1) == std::string(
"xml"))
666 dirFiles.erase(dirFiles.begin() + i);
670 if (dirFiles.size() !=
671 (
unsigned int)(m_xmlParser.getSequenceStopNumber() - m_xmlParser.getSequenceStartNumber() + 1))
672 throw(vpException(vpException::fatalError,
"For imgage sequnces with timeStamps, the directory must contain "
673 "only the entire image sequence (no additionnal files allowed)"));
675 imageFileName = parentName + dirFiles.at(m_frameCount);
677 throw(vpException(vpException::fatalError),
"Sequence filename incorrect !");
680 vpImageIo::read(image, imageFileName);
681 image.setTransducerSettings(m_frame);
682 image.setScanLineNumber(image.getWidth());
683 image.setDepth(m_frame.getDepth());
685 m_frameCount += loopIncrement;
696 this->open(image, timestamp);
700 char buffer[FILENAME_MAX];
701 sprintf(buffer, m_genericImageFileName.c_str(), m_frameCount);
702 std::string imageFileName;
704 std::vector<std::string> splitName =
705 vpIoTools::splitChain(vpIoTools::splitChain(m_genericImageFileName, std::string(
"/")).back(), std::string(
"."));
707 std::string parentName = vpIoTools::getParent(m_sequenceFileName);
708 if (!parentName.empty()) {
709 parentName = parentName + vpIoTools::path(
"/");
711 std::vector<std::string> splitNameDirs = vpIoTools::splitChain(m_genericImageFileName, std::string(
"/"));
712 if (splitNameDirs.size() > 1) {
713 for (
unsigned int i = 0; i < splitNameDirs.size() - 1; i++)
714 parentName += (splitNameDirs.at(i) + vpIoTools::path(
"/"));
716 if (splitName.size() == 2) {
717 imageFileName = parentName + vpIoTools::splitChain(std::string(buffer), std::string(
"/")).back();
719 }
else if (splitName.size() == 3) {
721 std::vector<std::string> dirFiles;
723 if (vpIoTools::checkDirectory(vpIoTools::getParent(m_sequenceFileName))) {
724 dirFiles = vpIoTools::getDirFiles(parentName);
726 if (dirFiles.size() == (
unsigned int)(m_xmlParser.getSequenceStopNumber() - m_xmlParser.getSequenceStartNumber() +
728 for (
unsigned int i = 0; i < dirFiles.size(); i++) {
729 if (vpIoTools::splitChain(dirFiles.at(i), std::string(
".")).at(1) == std::string(
"xml"))
730 dirFiles.erase(dirFiles.begin() + i);
734 std::istringstream(vpIoTools::splitChain(dirFiles.at(m_frameCount), std::string(
".")).at(1)) >> timestamp;
736 if (dirFiles.size() !=
737 (
unsigned int)(m_xmlParser.getSequenceStopNumber() - m_xmlParser.getSequenceStartNumber() + 1))
738 throw(vpException(vpException::fatalError,
"For imgage sequnces with timeStamps, the directory must contain "
739 "only the entire image sequence (no additionnal files allowed)"));
741 imageFileName = parentName + dirFiles.at(m_frameCount);
743 throw(vpException(vpException::fatalError),
"Sequence filename incorrect !");
747 vpImageIo::read(image, imageFileName);
748 image.setTransducerSettings(m_frame);
749 image.setScanLineNumber(image.getWidth());
750 image.setDepth(m_frame.getDepth());
752 m_frameCount += loopIncrement;
767 char buffer[FILENAME_MAX];
768 sprintf(buffer, m_genericImageFileName.c_str(), m_frameCount);
769 std::string imageFileName;
771 std::vector<std::string> splitName =
772 vpIoTools::splitChain(vpIoTools::splitChain(m_genericImageFileName, std::string(
"/")).back(), std::string(
"."));
774 std::string parentName = vpIoTools::getParent(m_sequenceFileName);
775 if (!parentName.empty()) {
776 parentName = parentName + vpIoTools::path(
"/");
778 std::vector<std::string> splitNameDirs = vpIoTools::splitChain(m_genericImageFileName, std::string(
"/"));
779 if (splitNameDirs.size() > 1) {
780 for (
unsigned int i = 0; i < splitNameDirs.size() - 1; i++)
781 parentName += (splitNameDirs.at(i) + vpIoTools::path(
"/"));
783 if (splitName.size() == 2) {
784 imageFileName = parentName + vpIoTools::splitChain(std::string(buffer), std::string(
"/")).back();
785 }
else if (splitName.size() == 3) {
786 std::vector<std::string> dirFiles;
788 if (vpIoTools::checkDirectory(vpIoTools::getParent(m_sequenceFileName))) {
789 dirFiles = vpIoTools::getDirFiles(parentName);
791 if (dirFiles.size() == (
unsigned int)(m_xmlParser.getSequenceStopNumber() - m_xmlParser.getSequenceStartNumber() +
793 for (
unsigned int i = 0; i < dirFiles.size(); i++) {
794 if (vpIoTools::splitChain(dirFiles.at(i), std::string(
".")).at(1) == std::string(
"xml"))
795 dirFiles.erase(dirFiles.begin() + i);
799 if (dirFiles.size() !=
800 (
unsigned int)(m_xmlParser.getSequenceStopNumber() - m_xmlParser.getSequenceStartNumber() + 1))
801 throw(vpException(vpException::fatalError,
"For imgage sequnces with timeStamps, the directory must contain "
802 "only the entire image sequence (no additionnal files allowed)"));
804 imageFileName = parentName + dirFiles.at(m_frameCount);
806 throw(vpException(vpException::fatalError),
"Sequence filename incorrect !");
810 vpImageIo::read(image, imageFileName);
818 m_frameCount += loopIncrement;
831 this->open(image, timestamp);
835 char buffer[FILENAME_MAX];
836 sprintf(buffer, m_genericImageFileName.c_str(), m_frameCount);
837 std::string imageFileName;
839 std::vector<std::string> splitName =
840 vpIoTools::splitChain(vpIoTools::splitChain(m_genericImageFileName, std::string(
"/")).back(), std::string(
"."));
842 std::string parentName = vpIoTools::getParent(m_sequenceFileName);
843 if (!parentName.empty()) {
844 parentName = parentName + vpIoTools::path(
"/");
846 std::vector<std::string> splitNameDirs = vpIoTools::splitChain(m_genericImageFileName, std::string(
"/"));
847 if (splitNameDirs.size() > 1) {
848 for (
unsigned int i = 0; i < splitNameDirs.size() - 1; i++)
849 parentName += (splitNameDirs.at(i) + vpIoTools::path(
"/"));
851 if (splitName.size() == 2) {
852 imageFileName = parentName + vpIoTools::splitChain(std::string(buffer), std::string(
"/")).back();
854 }
else if (splitName.size() == 3) {
855 std::vector<std::string> dirFiles;
857 if (vpIoTools::checkDirectory(vpIoTools::getParent(m_sequenceFileName))) {
858 dirFiles = vpIoTools::getDirFiles(parentName);
860 std::sort(dirFiles.begin(), dirFiles.end());
861 if (dirFiles.size() == (
unsigned int)(m_xmlParser.getSequenceStopNumber() - m_xmlParser.getSequenceStartNumber() +
863 for (
unsigned int i = 0; i < dirFiles.size(); i++) {
864 if (vpIoTools::splitChain(dirFiles.at(i), std::string(
".")).at(1) == std::string(
"xml"))
865 dirFiles.erase(dirFiles.begin() + i);
868 std::istringstream(vpIoTools::splitChain(dirFiles.at(m_frameCount), std::string(
".")).at(1)) >> timestamp;
870 if (dirFiles.size() !=
871 (
unsigned int)(m_xmlParser.getSequenceStopNumber() - m_xmlParser.getSequenceStartNumber() + 1))
872 throw(vpException(vpException::fatalError,
"For imgage sequnces with timeStamps, the directory must contain "
873 "only the entire image sequence (no additionnal files allowed)"));
875 imageFileName = parentName + dirFiles.at(m_frameCount);
877 throw(vpException(vpException::fatalError),
"Sequence filename incorrect !");
881 vpImageIo::read(image, imageFileName);
889 m_frameCount += loopIncrement;
903 if (index < m_firstFrame || index > m_lastFrame) {
904 throw(vpException(vpException::badValue,
"position out of range"));
908 char buffer[FILENAME_MAX];
909 sprintf(buffer, m_genericImageFileName.c_str(), index);
910 std::string imageFileName = buffer;
912 vpImageIo::read(image, imageFileName);
913 image.setImageSettins(m_frame);
924 getFrame(image, index);
934 m_enableLoopCycling = activateLoopCycling;
944 return m_lastFrame - m_firstFrame + 1;
945 throw(vpException(vpException::fatalError,
"Cannot compute the frame number of the sequence before opening it !"));
956 throw(vpException(vpException::fatalError,
"Sequence not opened, xml parser is empty !"));
void setHeightResolution(double heightResolution)
double getHeightResolution() const
void setWidthResolution(double widthResolution)
void setScanLineNumber(unsigned int scanLineNumber)
void setImagePreScanSettings(const usImagePreScanSettings &preScanSettings)
void setAxialResolution(const double axialResolution)
Input/output operations between ultrasound image settings and the assiciated xml files.
Reading of sequences of ultrasound images.
virtual ~usSequenceReader()
void open(ImageType &image, uint64_t ×tamp)
void acquire(ImageType &image)
void setSequenceFileName(const std::string &sequenceFileName)
usImageSettingsXmlParser getXmlParser()
void setLastFrameIndex(long lastIndex)
std::vector< uint64_t > getSequenceTimestamps() const
long getImageNumber() const
void open(ImageType &image)
void setLoopCycling(bool activateLoopCycling)
ImageType & getFrame(int index)
double getFrameRate() const
void acquire(ImageType &image, uint64_t ×tamp)
void setFirstFrameIndex(long firstIndex)
void getFrame(ImageType &image, int index)
void setTransducerConvexity(const bool isTransducerConvex)
void setDepth(double depth)
void setScanLinePitch(const double scanLinePitch)
void setTransmitFrequency(const int transmitFrequency)
void setSamplingFrequency(const int samplingFrequency)
void setTransducerRadius(const double transducerRadius)
void setTransducerSettings(const usTransducerSettings &other)
void setScanLineNumber(unsigned int scanLineNumber)