From 720a5c63998727603bc25f18eda87ea5c6db3f2c Mon Sep 17 00:00:00 2001 From: "l.dressen" <l.dressen@fz-juelich.de> Date: Wed, 3 Jul 2024 13:52:07 +0200 Subject: [PATCH] Should throw error on reading ill-formed .pet-file (e.g. wrong decimal separator) --- src/calibration/extrCalibration.cpp | 75 +- src/petrack.cpp | 108 +-- src/petrack.h | 4 +- src/ui/dialogs/codeMarkerWidget.cpp | 118 +-- src/ui/dialogs/colorMarkerWidget.cpp | 87 +-- src/ui/dialogs/multiColorMarkerWidget.cpp | 106 +-- src/ui/dialogs/stereoWidget.cpp | 81 +- src/ui/main-windows/alignmentGridBox.cpp | 63 +- src/ui/main-windows/control.cpp | 735 +++++------------- src/ui/main-windows/coordinateSystemBox.cpp | 117 +-- src/ui/main-windows/correction.cpp | 52 +- src/ui/main-windows/correction.h | 8 +- src/ui/main-windows/extrinsicBox.cpp | 44 +- src/ui/main-windows/filterBeforeBox.cpp | 76 +- src/ui/main-windows/intrinsicBox.cpp | 133 +--- src/ui/visualization/moCapController.cpp | 137 +--- src/util/CMakeLists.txt | 4 +- src/util/helper.cpp | 30 - src/util/helper.h | 70 -- src/util/importHelper.cpp | 255 ++++++ src/util/importHelper.h | 162 ++++ .../data/old_pet_files/2006.pet | 47 ++ .../data/old_pet_files/2008.pet | 39 + .../data/old_pet_files/2009.pet | 58 ++ .../data/old_pet_files/2012.pet | 65 ++ .../data/old_pet_files/2013.pet | 65 ++ .../data/old_pet_files/2014.pet | 67 ++ .../data/old_pet_files/2015.pet | 71 ++ .../data/old_pet_files/2016.pet | 76 ++ .../data/old_pet_files/2017.pet | 83 ++ .../data/old_pet_files/2018.pet | 83 ++ .../data/old_pet_files/2019.pet | 83 ++ .../regression_test/tests/test_oldPetFiles.py | 74 ++ .../calibration/tst_extrCalibration.cpp | 2 +- .../unit_test/ui/main-windows/tst_control.cpp | 2 +- 35 files changed, 1696 insertions(+), 1584 deletions(-) create mode 100644 src/util/importHelper.cpp create mode 100644 src/util/importHelper.h create mode 100644 tests/regression_test/data/old_pet_files/2006.pet create mode 100644 tests/regression_test/data/old_pet_files/2008.pet create mode 100644 tests/regression_test/data/old_pet_files/2009.pet create mode 100644 tests/regression_test/data/old_pet_files/2012.pet create mode 100644 tests/regression_test/data/old_pet_files/2013.pet create mode 100644 tests/regression_test/data/old_pet_files/2014.pet create mode 100644 tests/regression_test/data/old_pet_files/2015.pet create mode 100644 tests/regression_test/data/old_pet_files/2016.pet create mode 100644 tests/regression_test/data/old_pet_files/2017.pet create mode 100644 tests/regression_test/data/old_pet_files/2018.pet create mode 100644 tests/regression_test/data/old_pet_files/2019.pet create mode 100644 tests/regression_test/tests/test_oldPetFiles.py diff --git a/src/calibration/extrCalibration.cpp b/src/calibration/extrCalibration.cpp index f37d03d33..3247fd669 100644 --- a/src/calibration/extrCalibration.cpp +++ b/src/calibration/extrCalibration.cpp @@ -19,6 +19,7 @@ #include "extrCalibration.h" #include "control.h" +#include "importHelper.h" #include "logger.h" #include "pMessageBox.h" #include "petrack.h" @@ -970,70 +971,40 @@ void ExtrCalibration::getXml(QDomElement &elem) void ReprojectionError::getXml(QDomElement &subElem) { - if(subElem.hasAttribute("AVG_PH")) + mPointHeightAvg = readDouble(subElem, "AVG_PH", 0); + mPointHeightStdDev = readDouble(subElem, "SD_PH", 0); + if(mPointHeightStdDev < 0) { - mPointHeightAvg = subElem.attribute("AVG_PH").toDouble(); + mPointHeightVariance = -1; } - if(subElem.hasAttribute("SD_PH")) - { - mPointHeightStdDev = subElem.attribute("SD_PH").toDouble(); - if(mPointHeightStdDev < 0) - { - mPointHeightVariance = -1; - } - else - { - mPointHeightVariance = pow(mPointHeightStdDev, 2); - } - } - if(subElem.hasAttribute("MAX_PH")) - { - mPointHeightMax = subElem.attribute("MAX_PH").toDouble(); - } - if(subElem.hasAttribute("AVG_DH")) - { - mDefaultHeightAvg = subElem.attribute("AVG_DH").toDouble(); - } - if(subElem.hasAttribute("SD_DH")) - { - mDefaultHeightStdDev = subElem.attribute("SD_DH").toDouble(); - if(mDefaultHeightStdDev < 0) - { - mDefaultHeightVariance = -1; - } - else - { - mDefaultHeightVariance = pow(mDefaultHeightStdDev, 2); - } - } - if(subElem.hasAttribute("MAX_DH")) + else { - mDefaultHeightMax = subElem.attribute("MAX_DH").toDouble(); + mPointHeightVariance = pow(mPointHeightStdDev, 2); } - if(subElem.hasAttribute("AVG_PX")) + mPointHeightMax = readDouble(subElem, "MAX_PH", 0); + mDefaultHeightAvg = readDouble(subElem, "AVG_DH", 0); + mDefaultHeightStdDev = readDouble(subElem, "SD_DH", 0); + if(mDefaultHeightStdDev < 0) { - mPixelAvg = subElem.attribute("AVG_PX").toDouble(); + mDefaultHeightVariance = -1; } - if(subElem.hasAttribute("SD_PX")) + else { - mPixelStdDev = subElem.attribute("SD_PX").toDouble(); - if(mPixelStdDev < 0) - { - mPixelVariance = -1; - } - else - { - mPixelVariance = pow(mPixelStdDev, 2); - } + mDefaultHeightVariance = pow(mDefaultHeightStdDev, 2); } - if(subElem.hasAttribute("MAX_PX")) + mDefaultHeightMax = readDouble(subElem, "MAX_DH", 0); + mPixelAvg = readDouble(subElem, "AVG_PX", 0); + mPixelStdDev = readDouble(subElem, "SD_PX", 0); + if(mPixelStdDev < 0) { - mPixelMax = subElem.attribute("MAX_PX").toDouble(); + mPixelVariance = -1; } - if(subElem.hasAttribute("USED_HEIGHT")) + else { - mUsedDefaultHeight = subElem.attribute("USED_HEIGHT").toDouble(); + mPixelVariance = pow(mPixelStdDev, 2); } + mPixelMax = readDouble(subElem, "MAX_PX", 0); + mUsedDefaultHeight = readDouble(subElem, "USED_HEIGHT", 0); auto data = getData(); mValid = !std::any_of(data.begin(), data.end(), [](double a) { return !std::isfinite(a) || a < 0; }); diff --git a/src/petrack.cpp b/src/petrack.cpp index a6f95be06..8fac72196 100644 --- a/src/petrack.cpp +++ b/src/petrack.cpp @@ -41,8 +41,8 @@ #include "extrinsicBox.h" #include "filterBeforeBox.h" #include "gridItem.h" -#include "helper.h" #include "imageItem.h" +#include "importHelper.h" #include "intrinsicBox.h" #include "keybindingDialog.h" #include "logger.h" @@ -356,9 +356,6 @@ Petrack::Petrack(QString petrackVersion) : // um im background subtraction filter das hoehenbild zu beruecksichtigen mBackgroundFilter.setStereoContext(&mStereoContext); - mAutoBackTrack = true; // ist der default, dann wenn in XML-Datei nicht drin steht - mAutoTrackOptimizeColor = false; // ist der default, dann wenn in XML-Datei nicht drin steht - setLoading(false); } Petrack::~Petrack() @@ -500,14 +497,7 @@ void Petrack::openXml(QDomDocument &doc, bool openSeq) } } } - if(elem.hasAttribute("STATUS_HEIGHT")) - { - if(mStatusPosRealHeight) // null kann eigentlich nicht vorkommen, da im constructor von petrack erzeugt - // wird - { - mStatusPosRealHeight->setValue(elem.attribute("STATUS_HEIGHT").toDouble()); - } - } + loadDoubleValue(elem, "STATUS_HEIGHT", mStatusPosRealHeight); } else if(elem.tagName() == "STEREO") { @@ -533,14 +523,8 @@ void Petrack::openXml(QDomDocument &doc, bool openSeq) { mControlWidget->getXml(elem, petVersion); QDomElement tmpElem = (elem.firstChildElement("TRACKING")).firstChildElement("PATH"); - if(tmpElem.hasAttribute("ONLY_PEOPLE_NR")) - { - onlyPeopleNr = tmpElem.attribute("ONLY_PEOPLE_NR").toInt(); - } - if(tmpElem.hasAttribute("ONLY_PEOPLE_NR_LIST")) - { - onlyPeopleNrList = tmpElem.attribute("ONLY_PEOPLE_NR_LIST"); - } + onlyPeopleNr = readInt(tmpElem, "ONLY_PEOPLE_NR", 1); + onlyPeopleNrList = readQString(tmpElem, "ONLY_PEOPLE_NR_LIST", ""); } else if(elem.tagName() == "EXTR_CALIBRATION") { @@ -548,75 +532,31 @@ void Petrack::openXml(QDomDocument &doc, bool openSeq) } else if(elem.tagName() == "PLAYER") { - if(elem.hasAttribute("FRAME")) - { - frame = elem.attribute("FRAME").toInt(); - } + frame = readInt(elem, "FRAME", -1); // handle old projects (prior to 0.10.2), which don't differentiate between sequence fps and playback fps - if(elem.hasAttribute("FPS")) - { - oldFps = elem.attribute("FPS").toDouble(); - } - if(elem.hasAttribute("SEQUENCE_FPS")) - { - sequenceFps = elem.attribute("SEQUENCE_FPS").toDouble(); - } - if(elem.hasAttribute("PLAYBACK_FPS")) - { - playbackFps = elem.attribute("PLAYBACK_FPS").toDouble(); - } - if(elem.hasAttribute("SOURCE_FRAME_IN")) - { - sourceFrameIn = elem.attribute("SOURCE_FRAME_IN").toInt(); - } - if(elem.hasAttribute("SOURCE_FRAME_OUT")) - { - sourceFrameOut = elem.attribute("SOURCE_FRAME_OUT").toInt(); - } - if(elem.hasAttribute("PLAYER_SPEED_FIXED")) - { - mPlayerWidget->setPlayerSpeedLimited(elem.attribute("PLAYER_SPEED_FIXED").toInt()); - } + oldFps = readDouble(elem, "FPS", -1); + sequenceFps = readDouble(elem, "SEQUENCE_FPS", -1); + playbackFps = readDouble(elem, "PLAYBACK_FPS", -1); + sourceFrameIn = readInt(elem, "SOURCE_FRAME_IN", -1); + sourceFrameOut = readInt(elem, "SOURCE_FRAME_OUT", -1); + mPlayerWidget->setPlayerSpeedLimited(readBool(elem, "PLAYER_SPEED_FIXED", false)); } else if(elem.tagName() == "VIEW") { - if(elem.hasAttribute("ANTIALIAS")) - { - mAntialiasAct->setChecked(elem.attribute("ANTIALIAS").toInt() == Qt::Checked); - } - if(elem.hasAttribute("OPENGL")) - { - mOpenGLAct->setChecked(elem.attribute("OPENGL").toInt() == Qt::Checked); - } - if(elem.hasAttribute("SAVE_TRANSFORMED")) - { - mCropZoomViewAct->setChecked(elem.attribute("SAVE_TRANSFORMED") == Qt::Checked); - } - if(elem.hasAttribute("TRANSFORMATION")) - { - QString matStr = elem.attribute("TRANSFORMATION"); - QTextStream in(&matStr); - in >> zoom >> rotate >> hScroll >> vScroll; - } - if(elem.hasAttribute("CAMERA")) - { - cam = (enum Camera) elem.attribute("CAMERA").toInt(); - } - if(elem.hasAttribute("HIDE_CONTROLS")) - { - mHideControlsAct->setChecked(elem.attribute("HIDE_CONTROLS").toInt() == Qt::Checked); - } + loadBoolValue(elem, "ANTIALIAS", mAntialiasAct, false); + loadBoolValue(elem, "OPENGL", mOpenGLAct, false); + loadBoolValue(elem, "SAVE_TRANSFORMED", mCropZoomViewAct, false); + QString matStr = readQString(elem, "TRANSFORMATION"); + QTextStream in(&matStr); + in >> zoom >> rotate >> hScroll >> vScroll; + + cam = (enum Camera) readInt(elem, "CAMERA", static_cast<int>(cameraUnset)); + loadBoolValue(elem, "HIDE_CONTROLS", mHideControlsAct, false); } else if(elem.tagName() == "AUTO_TRACK") { - if(elem.hasAttribute("BACK_TRACK")) - { - mAutoBackTrack = elem.attribute("BACK_TRACK").toInt(); - } - if(elem.hasAttribute("OPTIMZE_COLOR")) - { - mAutoTrackOptimizeColor = elem.attribute("OPTIMZE_COLOR").toInt(); - } + mAutoBackTrack = readBool(elem, "BACK_TRACK", true); + mAutoTrackOptimizeColor = readBool(elem, "OPTIMIZE_COLOR", false); } else if(elem.tagName() == "MISSING_FRAMES") { @@ -626,8 +566,8 @@ void Petrack::openXml(QDomDocument &doc, bool openSeq) auto node = elem.firstChildElement("FRAME"); for(; !node.isNull(); node = node.nextSiblingElement("FRAME")) { - size_t num = node.attribute("NUM_FRAME").toUInt(); - int count = node.attribute("NUM_MISSING").toInt(); + size_t num = readInt(node, "NUM_FRAME"); + int count = readInt(node, "NUM_MISSING"); missingFrames.push_back(MissingFrame{num, count}); } } diff --git a/src/petrack.h b/src/petrack.h index b472f2731..3573186fd 100644 --- a/src/petrack.h +++ b/src/petrack.h @@ -479,8 +479,8 @@ private: double mShowFPS; - bool mAutoBackTrack; - bool mAutoTrackOptimizeColor; + bool mAutoBackTrack = true; + bool mAutoTrackOptimizeColor = false; bool mLoading; MoCapStorage mMoCapStorage; diff --git a/src/ui/dialogs/codeMarkerWidget.cpp b/src/ui/dialogs/codeMarkerWidget.cpp index 6612c7518..14a7a194a 100644 --- a/src/ui/dialogs/codeMarkerWidget.cpp +++ b/src/ui/dialogs/codeMarkerWidget.cpp @@ -18,6 +18,7 @@ #include "codeMarkerWidget.h" +#include "importHelper.h" #include "pMessageBox.h" #include "recognition.h" #include "ui_codeMarker.h" @@ -172,104 +173,33 @@ void CodeMarkerWidget::getXml(QDomElement &elem) { if(subElem.tagName() == "DICTIONARY") { - if(subElem.hasAttribute("ID")) - { - mUi->dictList->setCurrentIndex(subElem.attribute("ID").toInt()); - } + loadActiveIndex(subElem, "ID", mUi->dictList, 0); } if(subElem.tagName() == "PARAM") { - if(subElem.hasAttribute("ADAPTIVE_THRESH_WIN_SIZE_MIN")) - { - mUi->adaptiveThreshWinSizeMin->setValue(subElem.attribute("ADAPTIVE_THRESH_WIN_SIZE_MIN").toInt()); - } - if(subElem.hasAttribute("ADAPTIVE_THRESH_WIN_SIZE_MAX")) - { - mUi->adaptiveThreshWinSizeMax->setValue(subElem.attribute("ADAPTIVE_THRESH_WIN_SIZE_MAX").toInt()); - } - if(subElem.hasAttribute("ADAPTIVE_THRESH_WIN_SIZE_STEP")) - { - mUi->adaptiveThreshWinSizeStep->setValue(subElem.attribute("ADAPTIVE_THRESH_WIN_SIZE_STEP").toInt()); - } - if(subElem.hasAttribute("ADAPTIVE_THRESH_CONSTANT")) - { - mUi->adaptiveThreshConstant->setValue(subElem.attribute("ADAPTIVE_THRESH_CONSTANT").toInt()); - } - if(subElem.hasAttribute("MIN_MARKER_PERIMETER")) - { - mUi->minMarkerPerimeter->setValue(subElem.attribute("MIN_MARKER_PERIMETER").toDouble()); - } - if(subElem.hasAttribute("MAX_MARKER_PERIMETER")) - { - mUi->maxMarkerPerimeter->setValue(subElem.attribute("MAX_MARKER_PERIMETER").toDouble()); - } - if(subElem.hasAttribute("MAX_RATIO_ERROR")) - { - mUi->polygonalApproxAccuracyRate->setValue(subElem.attribute("MAX_RATIO_ERROR").toDouble()); - } - if(subElem.hasAttribute("MIN_CORNER_DISTANCE")) - { - mUi->minCornerDistance->setValue(subElem.attribute("MIN_CORNER_DISTANCE").toDouble()); - } - if(subElem.hasAttribute("MIN_DISTANCE_TO_BORDER")) - { - mUi->minDistanceToBorder->setValue(subElem.attribute("MIN_DISTANCE_TO_BORDER").toInt()); - } - if(subElem.hasAttribute("MIN_MARKER_DISTANCE")) - { - mUi->minMarkerDistance->setValue(subElem.attribute("MIN_MARKER_DISTANCE").toDouble()); - } - if(subElem.hasAttribute("CORNER_REFINEMENT")) - { - mUi->doCornerRefinement->setChecked(subElem.attribute("CORNER_REFINEMENT").toInt()); - } - if(subElem.hasAttribute("CORNER_REFINEMENT_WIN_SIZE")) - { - mUi->cornerRefinementWinSize->setValue(subElem.attribute("CORNER_REFINEMENT_WIN_SIZE").toInt()); - } - if(subElem.hasAttribute("CORNER_REFINEMENT_MAX_ITERATIONS")) - { - mUi->cornerRefinementMaxIterations->setValue( - subElem.attribute("CORNER_REFINEMENT_MAX_ITERATIONS").toInt()); - } - if(subElem.hasAttribute("CORNER_REFINEMENT_MIN_ACCURACY")) - { - mUi->cornerRefinementMinAccuracy->setValue( - subElem.attribute("CORNER_REFINEMENT_MIN_ACCURACY").toDouble()); - } - if(subElem.hasAttribute("MARKER_BORDER_BITS")) - { - mUi->markerBorderBits->setValue(subElem.attribute("MARKER_BORDER_BITS").toInt()); - } - if(subElem.hasAttribute("PERSPECTIVE_REMOVE_PIXEL_PER_CELL")) - { - mUi->perspectiveRemovePixelPerCell->setValue( - subElem.attribute("PERSPECTIVE_REMOVE_PIXEL_PER_CELL").toInt()); - } - if(subElem.hasAttribute("PERSPECTIVE_REMOVE_IGNORED_MARGIN_PER_CELL")) - { - mUi->perspectiveRemoveIgnoredMarginPerCell->setValue( - subElem.attribute("PERSPECTIVE_REMOVE_IGNORED_MARGIN_PER_CELL").toDouble()); - } - if(subElem.hasAttribute("MAX_ERRONEOUS_BITS_IN_BORDER_RATE")) - { - mUi->maxErroneousBitsInBorderRate->setValue( - subElem.attribute("MAX_ERRONEOUS_BITS_IN_BORDER_RATE").toDouble()); - } - if(subElem.hasAttribute("MIN_OTSU_STD_DEV")) - { - mUi->minOtsuStdDev->setValue(subElem.attribute("MIN_OTSU_STD_DEV").toDouble()); - } - if(subElem.hasAttribute("ERROR_CORRECTION_RATE")) - { - mUi->errorCorrectionRate->setValue(subElem.attribute("ERROR_CORRECTION_RATE").toDouble()); - } - if(subElem.hasAttribute("SHOW_DETECTED_CANDIDATES")) - { - mUi->showDetectedCandidates->setCheckState( - subElem.attribute("SHOW_DETECTED_CANDIDATES").toInt() ? Qt::Checked : Qt::Unchecked); - } + loadIntValue(subElem, "ADAPTIVE_THRESH_WIN_SIZE_MIN", mUi->adaptiveThreshWinSizeMin); + loadIntValue(subElem, "ADAPTIVE_THRESH_WIN_SIZE_MAX", mUi->adaptiveThreshWinSizeMax); + loadIntValue(subElem, "ADAPTIVE_THRESH_WIN_SIZE_STEP", mUi->adaptiveThreshWinSizeStep); + loadIntValue(subElem, "ADAPTIVE_THRESH_CONSTANT", mUi->adaptiveThreshConstant); + loadDoubleValue(subElem, "MIN_MARKER_PERIMETER", mUi->minMarkerPerimeter); + loadDoubleValue(subElem, "MAX_MARKER_PERIMETER", mUi->maxMarkerPerimeter); + loadDoubleValue(subElem, "MAX_RATIO_ERROR", mUi->polygonalApproxAccuracyRate); + loadDoubleValue(subElem, "MIN_CORNER_DISTANCE", mUi->minCornerDistance); + loadIntValue(subElem, "MIN_DISTANCE_TO_BORDER", mUi->minDistanceToBorder); + loadDoubleValue(subElem, "MIN_MARKER_DISTANCE", mUi->minMarkerDistance); + loadBoolValue(subElem, "CORNER_REFINEMENT", mUi->doCornerRefinement); + loadIntValue(subElem, "CORNER_REFINEMENT_WIN_SIZE", mUi->cornerRefinementWinSize); + loadIntValue(subElem, "CORNER_REFINEMENT_MAX_ITERATIONS", mUi->cornerRefinementMaxIterations); + loadDoubleValue(subElem, "CORNER_REFINEMENT_MIN_ACCURACY", mUi->cornerRefinementMinAccuracy); + loadIntValue(subElem, "MARKER_BORDER_BITS", mUi->markerBorderBits); + loadIntValue(subElem, "PERSPECTIVE_REMOVE_PIXEL_PER_CELL", mUi->perspectiveRemovePixelPerCell); + loadDoubleValue( + subElem, "PERSPECTIVE_REMOVE_IGNORED_MARGIN_PER_CELL", mUi->perspectiveRemoveIgnoredMarginPerCell); + loadDoubleValue(subElem, "MAX_ERRONEOUS_BITS_IN_BORDER_RATE", mUi->maxErroneousBitsInBorderRate); + loadDoubleValue(subElem, "MIN_OTSU_STD_DEV", mUi->minOtsuStdDev); + loadDoubleValue(subElem, "ERROR_CORRECTION_RATE", mUi->errorCorrectionRate); + loadBoolValue(subElem, "SHOW_DETECTED_CANDIDATES", mUi->showDetectedCandidates); } } } diff --git a/src/ui/dialogs/colorMarkerWidget.cpp b/src/ui/dialogs/colorMarkerWidget.cpp index 3053da78d..59d96335b 100644 --- a/src/ui/dialogs/colorMarkerWidget.cpp +++ b/src/ui/dialogs/colorMarkerWidget.cpp @@ -18,6 +18,8 @@ #include "colorMarkerWidget.h" +#include "importHelper.h" + ColorMarkerWidget::ColorMarkerWidget(QWidget *parent) : QWidget(parent) { mMainWindow = (class Petrack *) parent; @@ -99,33 +101,15 @@ void ColorMarkerWidget::getXml(QDomElement &elem) { if(subElem.tagName() == "MASK") { - if(subElem.hasAttribute("SHOW")) - { - showMask->setCheckState(subElem.attribute("SHOW").toInt() ? Qt::Checked : Qt::Unchecked); - } - if(subElem.hasAttribute("OPACITY")) - { - opacity->setValue(subElem.attribute("OPACITY").toInt()); - } - if(subElem.hasAttribute("MASK")) - { - maskMask->setCheckState(subElem.attribute("MASK").toInt() ? Qt::Checked : Qt::Unchecked); - } + loadBoolValue(subElem, "SHOW", showMask); + loadIntValue(subElem, "OPACITY", opacity); + loadBoolValue(subElem, "MASK", maskMask); } if(subElem.tagName() == "FROM_COLOR") { - if(subElem.hasAttribute("HUE")) - { - h = subElem.attribute("HUE").toInt(); - } - if(subElem.hasAttribute("SATURATION")) - { - s = subElem.attribute("SATURATION").toInt(); - } - if(subElem.hasAttribute("VALUE")) - { - v = subElem.attribute("VALUE").toInt(); - } + h = readInt(subElem, "HUE"); + s = readInt(subElem, "SATURATION"); + v = readInt(subElem, "VALUE"); col.setHsv(h, s, v); if(col.isValid()) @@ -140,18 +124,9 @@ void ColorMarkerWidget::getXml(QDomElement &elem) } if(subElem.tagName() == "TO_COLOR") { - if(subElem.hasAttribute("HUE")) - { - h = subElem.attribute("HUE").toInt(); - } - if(subElem.hasAttribute("SATURATION")) - { - s = subElem.attribute("SATURATION").toInt(); - } - if(subElem.hasAttribute("VALUE")) - { - v = subElem.attribute("VALUE").toInt(); - } + h = readInt(subElem, "HUE"); + s = readInt(subElem, "SATURATION"); + v = readInt(subElem, "VALUE"); col.setHsv(h, s, v); if(col.isValid()) @@ -166,38 +141,14 @@ void ColorMarkerWidget::getXml(QDomElement &elem) } if(subElem.tagName() == "PARAM") { - if(subElem.hasAttribute("INVERS_HUE")) - { - inversHue->setCheckState(subElem.attribute("INVERS_HUE").toInt() ? Qt::Checked : Qt::Unchecked); - } - if(subElem.hasAttribute("CLOSE_RADIUS")) - { - closeRadius->setValue(subElem.attribute("CLOSE_RADIUS").toInt()); - } - if(subElem.hasAttribute("CLOSE_USED")) - { - useClose->setCheckState(subElem.attribute("CLOSE_USED").toInt() ? Qt::Checked : Qt::Unchecked); - } - if(subElem.hasAttribute("OPEN_RADIUS")) - { - openRadius->setValue(subElem.attribute("OPEN_RADIUS").toInt()); - } - if(subElem.hasAttribute("OPEN_USED")) - { - useOpen->setCheckState(subElem.attribute("OPEN_USED").toInt() ? Qt::Checked : Qt::Unchecked); - } - if(subElem.hasAttribute("MIN_AREA")) - { - minArea->setValue(subElem.attribute("MIN_AREA").toInt()); - } - if(subElem.hasAttribute("MAX_AREA")) - { - maxArea->setValue(subElem.attribute("MAX_AREA").toInt()); - } - if(subElem.hasAttribute("MAX_RATIO")) - { - maxRatio->setValue(subElem.attribute("MAX_RATIO").toDouble()); - } + loadBoolValue(subElem, "INVERS_HUE", inversHue); + loadIntValue(subElem, "CLOSE_RADIUS", closeRadius); + loadBoolValue(subElem, "CLOSE_USED", useClose); + loadIntValue(subElem, "OPEN_RADIUS", openRadius); + loadBoolValue(subElem, "OPEN_USED", useOpen); + loadIntValue(subElem, "MIN_AREA", minArea); + loadIntValue(subElem, "MAX_AREA", maxArea); + loadDoubleValue(subElem, "MAX_RATIO", maxRatio); } } } diff --git a/src/ui/dialogs/multiColorMarkerWidget.cpp b/src/ui/dialogs/multiColorMarkerWidget.cpp index 7f86a089d..050a71741 100644 --- a/src/ui/dialogs/multiColorMarkerWidget.cpp +++ b/src/ui/dialogs/multiColorMarkerWidget.cpp @@ -18,6 +18,8 @@ #include "multiColorMarkerWidget.h" +#include "importHelper.h" + MultiColorMarkerWidget::MultiColorMarkerWidget(QWidget *parent) : QWidget(parent) { mMainWindow = (class Petrack *) parent; @@ -76,102 +78,38 @@ void MultiColorMarkerWidget::getXml(QDomElement &elem) { if(subElem.tagName() == "MASK") { - if(subElem.hasAttribute("SHOW")) - { - showMask->setCheckState(subElem.attribute("SHOW").toInt() ? Qt::Checked : Qt::Unchecked); - } - if(subElem.hasAttribute("OPACITY")) - { - opacity->setValue(subElem.attribute("OPACITY").toInt()); - } - if(subElem.hasAttribute("MASK")) - { - maskMask->setCheckState(subElem.attribute("MASK").toInt() ? Qt::Checked : Qt::Unchecked); - } + loadBoolValue(subElem, "SHOW", showMask); + loadIntValue(subElem, "OPACITY", opacity); + loadBoolValue(subElem, "MASK", maskMask); } if(subElem.tagName() == "BLACK_DOT") { - if(subElem.hasAttribute("USE")) - { - useDot->setCheckState(subElem.attribute("USE").toInt() ? Qt::Checked : Qt::Unchecked); - } - if(subElem.hasAttribute("SIZE")) - { - dotSize->setValue(subElem.attribute("SIZE").toDouble()); - } - if(subElem.hasAttribute("IGNORE_WITHOUT")) - { - ignoreWithoutDot->setCheckState( - subElem.attribute("IGNORE_WITHOUT").toInt() ? Qt::Checked : Qt::Unchecked); - } - if(subElem.hasAttribute("USE_COLOR")) - { - useColor->setCheckState(subElem.attribute("USE_COLOR").toInt() ? Qt::Checked : Qt::Unchecked); - } - if(subElem.hasAttribute("RESTRICT_POSITION")) - { - restrictPosition->setCheckState( - subElem.attribute("RESTRICT_POSITION").toInt() ? Qt::Checked : Qt::Unchecked); - } + loadBoolValue(subElem, "USE", useDot); + loadDoubleValue(subElem, "SIZE", dotSize); + loadBoolValue(subElem, "IGNORE_WITHOUT", ignoreWithoutDot); + loadBoolValue(subElem, "USE_COLOR", useColor); + loadBoolValue(subElem, "RESTRICT_POSITION", restrictPosition); } if(subElem.tagName() == "CODE_MARKER") { - if(subElem.hasAttribute("USE")) - { - useCodeMarker->setCheckState(subElem.attribute("USE").toInt() ? Qt::Checked : Qt::Unchecked); - } - if(subElem.hasAttribute("IGNORE_WITHOUT")) - { - ignoreWithoutDot->setCheckState( - subElem.attribute("IGNORE_WITHOUT").toInt() ? Qt::Checked : Qt::Unchecked); - } + loadBoolValue(subElem, "USE", useCodeMarker); + // ignoreWithoutDot handles black dot and code marker and is therefore only read once } if(subElem.tagName() == "AUTO_CORRECT") { - if(subElem.hasAttribute("USE")) - { - autoCorrect->setCheckState(subElem.attribute("USE").toInt() ? Qt::Checked : Qt::Unchecked); - } - if(subElem.hasAttribute("ONLY_EXPORT")) - { - autoCorrectOnlyExport->setCheckState( - subElem.attribute("ONLY_EXPORT").toInt() ? Qt::Checked : Qt::Unchecked); - } + loadBoolValue(subElem, "USE", autoCorrect); + loadBoolValue(subElem, "ONLY_EXPORT", autoCorrectOnlyExport, false); } if(subElem.tagName() == "PARAM") { - if(subElem.hasAttribute("CLOSE_RADIUS")) - { - closeRadius->setValue(subElem.attribute("CLOSE_RADIUS").toInt()); - } - if(subElem.hasAttribute("CLOSE_USED")) - { - useClose->setCheckState(subElem.attribute("CLOSE_USED").toInt() ? Qt::Checked : Qt::Unchecked); - } - if(subElem.hasAttribute("OPEN_RADIUS")) - { - openRadius->setValue(subElem.attribute("OPEN_RADIUS").toInt()); - } - if(subElem.hasAttribute("OPEN_USED")) - { - useOpen->setCheckState(subElem.attribute("OPEN_USED").toInt() ? Qt::Checked : Qt::Unchecked); - } - if(subElem.hasAttribute("MIN_AREA")) - { - minArea->setValue(subElem.attribute("MIN_AREA").toInt()); - } - if(subElem.hasAttribute("MAX_AREA")) - { - maxArea->setValue(subElem.attribute("MAX_AREA").toInt()); - } - if(subElem.hasAttribute("USE_HEAD_SIZE")) - { - useHeadSize->setCheckState(subElem.attribute("USE_HEAD_SIZE").toInt() ? Qt::Checked : Qt::Unchecked); - } - if(subElem.hasAttribute("MAX_RATIO")) - { - maxRatio->setValue(subElem.attribute("MAX_RATIO").toDouble()); - } + loadIntValue(subElem, "CLOSE_RADIUS", closeRadius); + loadBoolValue(subElem, "CLOSE_USED", useClose); + loadIntValue(subElem, "OPEN_RADIUS", openRadius); + loadBoolValue(subElem, "OPEN_USED", useOpen); + loadIntValue(subElem, "MIN_AREA", minArea); + loadIntValue(subElem, "MAX_AREA", maxArea); + loadBoolValue(subElem, "USE_HEAD_SIZE", useHeadSize, false); + loadDoubleValue(subElem, "MAX_RATIO", maxRatio); } } } diff --git a/src/ui/dialogs/stereoWidget.cpp b/src/ui/dialogs/stereoWidget.cpp index 95d2a353f..65f583668 100644 --- a/src/ui/dialogs/stereoWidget.cpp +++ b/src/ui/dialogs/stereoWidget.cpp @@ -18,6 +18,7 @@ #include "stereoWidget.h" +#include "importHelper.h" #include "logger.h" StereoWidget::StereoWidget(QWidget *parent) : QWidget(parent) @@ -86,83 +87,33 @@ void StereoWidget::getXml(QDomElement &elem) { if(subElem.tagName() == "DISPARITY") { - if(subElem.hasAttribute("OPACITY")) - { - opacity->setValue(subElem.attribute("OPACITY").toInt()); - } - if(subElem.hasAttribute("SHOW")) - { - stereoShowDisparity->setCheckState(subElem.attribute("SHOW").toInt() ? Qt::Checked : Qt::Unchecked); - } - if(subElem.hasAttribute("COLOR")) - { - stereoColor->setCurrentIndex(subElem.attribute("COLOR").toInt()); - } - if(subElem.hasAttribute("ALGO")) - { - stereoDispAlgo->setCurrentIndex(subElem.attribute("ALGO").toInt()); - } - if(subElem.hasAttribute("HIDE_INVALID")) - { - hideWrong->setCheckState(subElem.attribute("HIDE_INVALID").toInt() ? Qt::Checked : Qt::Unchecked); - } + loadIntValue(subElem, "OPACITY", opacity, 100); + loadBoolValue(subElem, "SHOW", stereoShowDisparity, false); + loadActiveIndex(subElem, "COLOR", stereoColor, 0); + loadActiveIndex(subElem, "ALGO", stereoDispAlgo, 0); + loadBoolValue(subElem, "HIDE_INVALID", hideWrong, false); for(subSubElem = subElem.firstChildElement(); !subSubElem.isNull(); subSubElem = subSubElem.nextSiblingElement()) { if(subSubElem.tagName() == "VALUES") { - if(subSubElem.hasAttribute("MIN")) - { - minDisparity->setValue(subSubElem.attribute("MIN").toInt()); - } - if(subSubElem.hasAttribute("MAX")) - { - maxDisparity->setValue(subSubElem.attribute("MAX").toInt()); - } + loadIntValue(subSubElem, "MIN", minDisparity, 0); + loadIntValue(subSubElem, "MAX", maxDisparity, 100); } else if(subSubElem.tagName() == "MASK") { - if(subSubElem.hasAttribute("SIZE")) - { - stereoMaskSize->setValue(subSubElem.attribute("SIZE").toInt()); - } - if(subSubElem.hasAttribute("EDGE_SIZE")) - { - edgeMaskSize->setValue(subSubElem.attribute("EDGE_SIZE").toInt()); - } - if(subSubElem.hasAttribute("USE_EDGE")) - { - useEdge->setCheckState(subSubElem.attribute("USE_EDGE").toInt() ? Qt::Checked : Qt::Unchecked); - } + loadIntValue(subSubElem, "SIZE", stereoMaskSize, 7); + loadIntValue(subSubElem, "EDGE_SIZE", edgeMaskSize, 5); + loadBoolValue(subSubElem, "USE_EDGE", useEdge, false); } else if(subSubElem.tagName() == "USE") { - if(subSubElem.hasAttribute("RECO")) - { - stereoUseForReco->setCheckState( - subSubElem.attribute("RECO").toInt() ? Qt::Checked : Qt::Unchecked); - } - if(subSubElem.hasAttribute("HEIGHT")) - { - stereoUseForHeight->setCheckState( - subSubElem.attribute("HEIGHT").toInt() ? Qt::Checked : Qt::Unchecked); - } - if(subSubElem.hasAttribute("HEIGHT_EVER")) - { - stereoUseForHeightEver->setCheckState( - subSubElem.attribute("HEIGHT_EVER").toInt() ? Qt::Checked : Qt::Unchecked); - } - if(subSubElem.hasAttribute("EXPORT")) - { - stereoUseForExport->setCheckState( - subSubElem.attribute("EXPORT").toInt() ? Qt::Checked : Qt::Unchecked); - } - if(subSubElem.hasAttribute("CALIB_CENTER")) - { - stereoUseCalibrationCenter->setCheckState( - subSubElem.attribute("CALIB_CENTER").toInt() ? Qt::Checked : Qt::Unchecked); - } + loadBoolValue(subSubElem, "RECO", stereoUseForReco, false); + loadBoolValue(subSubElem, "HEIGHT", stereoUseForHeight, false); + loadBoolValue(subSubElem, "HEIGHT_EVER", stereoUseForHeightEver, true); + loadBoolValue(subSubElem, "EXPORT", stereoUseForExport, false); + loadBoolValue(subSubElem, "CALIB_CENTER", stereoUseCalibrationCenter, true); } else { diff --git a/src/ui/main-windows/alignmentGridBox.cpp b/src/ui/main-windows/alignmentGridBox.cpp index 97f937c38..6c8bf858a 100644 --- a/src/ui/main-windows/alignmentGridBox.cpp +++ b/src/ui/main-windows/alignmentGridBox.cpp @@ -18,6 +18,7 @@ #include "alignmentGridBox.h" +#include "importHelper.h" #include "pGroupBox.h" #include "ui_alignmentGridBox.h" @@ -113,54 +114,18 @@ bool AlignmentGridBox::getXml(QDomElement &subSubElem) { if(subSubElem.tagName() == "ALIGNMENT_GRID") { - if(subSubElem.hasAttribute("GRID_DIMENSION")) - { - mUi->gridTab->setCurrentIndex(subSubElem.attribute("GRID_DIMENSION").toInt()); - } - else - { - mUi->gridTab->setCurrentIndex(1); // = 2D - } - if(subSubElem.hasAttribute("SHOW")) - { - mUi->gridShow->setCheckState(subSubElem.attribute("SHOW").toInt() ? Qt::Checked : Qt::Unchecked); - } - if(subSubElem.hasAttribute("FIX")) - { - mUi->gridFix->setCheckState(subSubElem.attribute("FIX").toInt() ? Qt::Checked : Qt::Unchecked); - } - if(subSubElem.hasAttribute("ROTATE")) - { - setValue(mUi->gridRotate, subSubElem.attribute("ROTATE").toInt()); - } - if(subSubElem.hasAttribute("TRANS_X")) - { - setValue(mUi->gridTransX, subSubElem.attribute("TRANS_X").toInt()); - } - if(subSubElem.hasAttribute("TRANS_Y")) - { - setValue(mUi->gridTransY, subSubElem.attribute("TRANS_Y").toInt()); - } - if(subSubElem.hasAttribute("SCALE")) - { - setValue(mUi->gridScale, subSubElem.attribute("SCALE").toInt()); - } - if(subSubElem.hasAttribute("GRID3D_TRANS_X")) - { - setValue(mUi->grid3DTransX, subSubElem.attribute("GRID3D_TRANS_X").toInt()); - } - if(subSubElem.hasAttribute("GRID3D_TRANS_Y")) - { - setValue(mUi->grid3DTransY, subSubElem.attribute("GRID3D_TRANS_Y").toInt()); - } - if(subSubElem.hasAttribute("GRID3D_TRANS_Z")) - { - setValue(mUi->grid3DTransZ, subSubElem.attribute("GRID3D_TRANS_Z").toInt()); - } - if(subSubElem.hasAttribute("GRID3D_RESOLUTION")) - { - setValue(mUi->grid3DResolution, subSubElem.attribute("GRID3D_RESOLUTION").toInt()); - } + loadActiveIndex(subSubElem, "GRID_DIMENSION", mUi->gridTab, 1); + loadBoolValue(subSubElem, "SHOW", mUi->gridShow, false); + loadBoolValue(subSubElem, "FIX", mUi->gridFix, false); + loadIntValue(subSubElem, "ROTATE", mUi->gridRotate, 0); + loadIntValue(subSubElem, "TRANS_X", mUi->gridTransX, 0); + loadIntValue(subSubElem, "TRANS_Y", mUi->gridTransY, 0); + loadIntValue(subSubElem, "SCALE", mUi->gridScale, 100); + loadIntValue(subSubElem, "GRID3D_TRANS_X", mUi->grid3DTransX, 0); + loadIntValue(subSubElem, "GRID3D_TRANS_Y", mUi->grid3DTransY, 0); + loadIntValue(subSubElem, "GRID3D_TRANS_Z", mUi->grid3DTransZ, 0); + loadIntValue(subSubElem, "GRID3D_RESOLUTION", mUi->grid3DResolution, 100); + if(subSubElem.hasAttribute("IMMUTABLE")) { if(this->parent()) @@ -168,7 +133,7 @@ bool AlignmentGridBox::getXml(QDomElement &subSubElem) auto *parent = dynamic_cast<PGroupBox *>(this->parent()->parent()); if(parent) { - parent->setImmutable(subSubElem.attribute("IMMUTABLE").toInt()); + parent->setImmutable(readBool(subSubElem, "IMMUTABLE", false)); } } } diff --git a/src/ui/main-windows/control.cpp b/src/ui/main-windows/control.cpp index bd53a6919..a7c045b19 100644 --- a/src/ui/main-windows/control.cpp +++ b/src/ui/main-windows/control.cpp @@ -31,6 +31,7 @@ #include "extrinsicBox.h" #include "extrinsicParameters.h" #include "filterBeforeBox.h" +#include "importHelper.h" #include "intrinsicBox.h" #include "logger.h" #include "multiColorMarkerWidget.h" @@ -1969,11 +1970,8 @@ void Control::getXml(const QDomElement &elem, const QString &version) { QDomElement subElem, subSubElem, subSubSubElem; + loadActiveIndex(elem, "TAB", mUi->tabs, 0); - if(elem.hasAttribute("TAB")) - { - mUi->tabs->setCurrentIndex(elem.attribute("TAB").toInt()); - } for(subElem = elem.firstChildElement(); !subElem.isNull(); subElem = subElem.nextSiblingElement()) { if(subElem.tagName() == "CALIBRATION") @@ -2003,30 +2001,24 @@ void Control::getXml(const QDomElement &elem, const QString &version) } else if(subSubElem.tagName() == "BORDER") { - if(subSubElem.hasAttribute("COLOR")) - { - QColor color(subSubElem.attribute("COLOR")); - mMainWindow->getBorderFilter()->getBorderColR().setValue(color.red()); - mMainWindow->getBorderFilter()->getBorderColG().setValue(color.green()); - mMainWindow->getBorderFilter()->getBorderColB().setValue(color.blue()); - } + QColor color(readQString(subSubElem, "COLOR")); + mMainWindow->getBorderFilter()->getBorderColR().setValue(color.red()); + mMainWindow->getBorderFilter()->getBorderColG().setValue(color.green()); + mMainWindow->getBorderFilter()->getBorderColB().setValue(color.blue()); } else if(subSubElem.tagName() == "BG_SUB") { - if(subSubElem.hasAttribute("FILE")) + QString f = readQString(subSubElem, "FILE", ""); + if(f != "") { - QString f = subSubElem.attribute("FILE"); - if(f != "") + if(getExistingFile(f, mMainWindow->getProFileName()) != "") { - if(getExistingFile(f, mMainWindow->getProFileName()) != "") - { - mMainWindow->getBackgroundFilter()->setFilename( - getExistingFile(subSubElem.attribute("FILE"), mMainWindow->getProFileName())); - } - else - { - SPDLOG_WARN("Background subtracting file not readable!"); - } + mMainWindow->getBackgroundFilter()->setFilename( + getExistingFile(f, mMainWindow->getProFileName())); + } + else + { + SPDLOG_WARN("Background subtracting file not readable!"); } } } @@ -2043,24 +2035,17 @@ void Control::getXml(const QDomElement &elem, const QString &version) { if(subSubElem.tagName() == "PERFORM") { - if(subSubElem.hasAttribute("ENABLED")) - { - mUi->performRecognition->setCheckState( - subSubElem.attribute("ENABLED").toInt() ? Qt::Checked : Qt::Unchecked); - } - if(subSubElem.hasAttribute("METHOD")) + loadBoolValue(subSubElem, "ENABLED", mUi->performRecognition); + + auto recognitionMethod = static_cast<reco::RecognitionMethod>( + readInt(subSubElem, "METHOD", static_cast<int>(reco::RecognitionMethod::MultiColor))); + auto foundIndex = mUi->recoMethod->findData(QVariant::fromValue(recognitionMethod)); + if(foundIndex == -1) { - auto recognitionMethod = - static_cast<reco::RecognitionMethod>(subSubElem.attribute("METHOD").toInt()); - auto foundIndex = mUi->recoMethod->findData(QVariant::fromValue(recognitionMethod)); - if(foundIndex == -1) - { - throw std::invalid_argument( - "Recognition Method could not be found, please check your input"); - } - mUi->recoMethod->setCurrentIndex(foundIndex); + throw std::invalid_argument("Recognition Method could not be found, please check your input"); } - else if(newerThanVersion("0.8.6", version)) + mUi->recoMethod->setCurrentIndex(foundIndex); + if(newerThanVersion("0.8.6", version)) { // old default was Hermes-Marker auto foundIndex = @@ -2072,100 +2057,51 @@ void Control::getXml(const QDomElement &elem, const QString &version) } mUi->recoMethod->setCurrentIndex(foundIndex); } - if(subSubElem.hasAttribute("STEP")) - { - mUi->recoStep->setValue(subSubElem.attribute("STEP").toInt()); - } + loadIntValue(subSubElem, "STEP", mUi->recoStep); } else if(subSubElem.tagName() == "REGION_OF_INTEREST") { double x = 0, y = 0, w = 0, h = 0; - if(subSubElem.hasAttribute("SHOW")) - { - mUi->roiShow->setCheckState(subSubElem.attribute("SHOW").toInt() ? Qt::Checked : Qt::Unchecked); - } - if(subSubElem.hasAttribute("FIX")) - { - mUi->roiFix->setCheckState(subSubElem.attribute("FIX").toInt() ? Qt::Checked : Qt::Unchecked); - } - if(subSubElem.hasAttribute("X")) - { - x = subSubElem.attribute("X").toDouble(); - } - if(subSubElem.hasAttribute("Y")) - { - y = subSubElem.attribute("Y").toDouble(); - } - if(subSubElem.hasAttribute("WIDTH")) - { - w = subSubElem.attribute("WIDTH").toDouble(); - } - if(subSubElem.hasAttribute("HEIGHT")) - { - h = subSubElem.attribute("HEIGHT").toDouble(); - } + loadBoolValue(subSubElem, "SHOW", mUi->roiShow, false); + loadBoolValue(subSubElem, "FIX", mUi->roiFix, false); + + x = readDouble(subSubElem, "X"); + y = readDouble(subSubElem, "Y"); + w = readDouble(subSubElem, "WIDTH"); + h = readDouble(subSubElem, "HEIGHT"); + mMainWindow->getRecoRoiItem()->setRect(x, y, w, h); } else if(subSubElem.tagName() == "MARKER") { - if(subSubElem.hasAttribute("BRIGHTNESS")) - { - mUi->markerBrightness->setValue(subSubElem.attribute("BRIGHTNESS").toInt()); - } - if(subSubElem.hasAttribute("IGNORE_WITHOUT")) - { - mUi->markerIgnoreWithout->setCheckState( - subSubElem.attribute("IGNORE_WITHOUT").toInt() ? Qt::Checked : Qt::Unchecked); - } + loadIntValue(subSubElem, "BRIGHTNESS", mUi->markerBrightness); + loadBoolValue(subSubElem, "IGNORE_WITHOUT", mUi->markerIgnoreWithout); } else if(subSubElem.tagName() == "SIZE_COLOR") { mColorChanging = true; // damit bei Anpassungen Farbbild nicht immer wieder neu bestimmt wird - if(subSubElem.hasAttribute("SHOW")) - { - mUi->recoShowColor->setCheckState( - subSubElem.attribute("SHOW").toInt() ? Qt::Checked : Qt::Unchecked); - } - if(subSubElem.hasAttribute("AUTO_WB")) - { - mUi->recoAutoWB->setCheckState( - subSubElem.attribute("AUTO_WB").toInt() ? Qt::Checked : Qt::Unchecked); - } - if(subSubElem.hasAttribute("X")) - { - mUi->recoColorX->setCurrentIndex(subSubElem.attribute("X").toInt()); - } - if(subSubElem.hasAttribute("Y")) - { - mUi->recoColorY->setCurrentIndex(subSubElem.attribute("Y").toInt()); - } - if(subSubElem.hasAttribute("Z")) - { - mUi->recoColorZ->setValue(subSubElem.attribute("Z").toInt()); - } - if(subSubElem.hasAttribute("GREY_LEVEL")) - { - mUi->recoGreyLevel->setValue(subSubElem.attribute("GREY_LEVEL").toInt()); + loadBoolValue(subSubElem, "SHOW", mUi->recoShowColor); + loadBoolValue(subSubElem, "AUTO_WB", mUi->recoAutoWB); + loadActiveIndex(subSubElem, "X", mUi->recoColorX); + loadActiveIndex(subSubElem, "Y", mUi->recoColorY); + loadIntValue(subSubElem, "Z", mUi->recoColorZ); + loadIntValue(subSubElem, "GREY_LEVEL", mUi->recoGreyLevel); + loadIntValue(subSubElem, "SYMBOL_SIZE", mUi->recoSymbolSize); + + mColorChanging = false; + // MODEL setzen erzeugt Bild neu + // damit auch bild neu erzeugt wird, wenn sich index nicht aendert: + if(mUi->recoColorModel->currentIndex() == readInt(subSubElem, "MODEL")) + { + mIndexChanging = false; + on_recoColorModel_currentIndexChanged(mUi->recoColorModel->currentIndex()); } - if(subSubElem.hasAttribute("SYMBOL_SIZE")) - { - mUi->recoSymbolSize->setValue(subSubElem.attribute("SYMBOL_SIZE").toInt()); - } - mColorChanging = false; // MODEL setzen erzeugt Bild neu - if(subSubElem.hasAttribute("MODEL")) + else { - // damit auch bild neu erzeugt wird, wenn sich index nicht aendert: - if(mUi->recoColorModel->currentIndex() == subSubElem.attribute("MODEL").toInt()) - { - mIndexChanging = false; - on_recoColorModel_currentIndexChanged(mUi->recoColorModel->currentIndex()); - } - else - { - mUi->recoColorModel->setCurrentIndex(subSubElem.attribute("MODEL").toInt()); - } + mUi->recoColorModel->setCurrentIndex(readInt(subSubElem, "MODEL")); } + double x = 0., y = 0., width = 0., height = 0., mapHeightValue = DEFAULT_HEIGHT; bool colored = true, invHue = false; QColor fromCol, toCol; @@ -2179,67 +2115,30 @@ void Control::getXml(const QDomElement &elem, const QString &version) { if(subSubSubElem.tagName() == "MAP") { - if(subSubSubElem.hasAttribute("X")) - { - x = subSubSubElem.attribute("X").toDouble(); - } - if(subSubSubElem.hasAttribute("Y")) - { - y = subSubSubElem.attribute("Y").toDouble(); - } - if(subSubSubElem.hasAttribute("WIDTH")) - { - width = subSubSubElem.attribute("WIDTH").toDouble(); - } - if(subSubSubElem.hasAttribute("HEIGHT")) - { - height = subSubSubElem.attribute("HEIGHT").toDouble(); - } - if(subSubSubElem.hasAttribute("COLORED")) - { - colored = subSubSubElem.attribute("COLORED").toInt(); - } - if(subSubSubElem.hasAttribute("MAP_HEIGHT")) - { - mapHeightValue = subSubSubElem.attribute("MAP_HEIGHT").toDouble(); - } + x = readDouble(subSubSubElem, "X"); + y = readDouble(subSubSubElem, "Y"); + width = readDouble(subSubSubElem, "WIDTH"); + height = readDouble(subSubSubElem, "HEIGHT"); + colored = readBool(subSubSubElem, "COLORED"); + mapHeightValue = readDouble(subSubSubElem, "MAP_HEIGHT"); + h = readInt(subSubSubElem, "FROM_HUE", 0); + s = readInt(subSubSubElem, "FROM_SAT", 0); + v = readInt(subSubSubElem, "FROM_VAL", 128); - if(subSubSubElem.hasAttribute("FROM_HUE")) - { - h = subSubSubElem.attribute("FROM_HUE").toInt(); - } - if(subSubSubElem.hasAttribute("FROM_SAT")) - { - s = subSubSubElem.attribute("FROM_SAT").toInt(); - } - if(subSubSubElem.hasAttribute("FROM_VAL")) - { - v = subSubSubElem.attribute("FROM_VAL").toInt(); - } if(h >= 0) { fromCol.setHsv(h, s, v); } - if(subSubSubElem.hasAttribute("TO_HUE")) - { - h = subSubSubElem.attribute("TO_HUE").toInt(); - } - if(subSubSubElem.hasAttribute("TO_SAT")) - { - s = subSubSubElem.attribute("TO_SAT").toInt(); - } - if(subSubSubElem.hasAttribute("TO_VAL")) - { - v = subSubSubElem.attribute("TO_VAL").toInt(); - } + + h = readInt(subSubSubElem, "TO_HUE", 359); + s = readInt(subSubSubElem, "TO_SAT", 255); + v = readInt(subSubSubElem, "TO_VAL", 255); + if(h >= 0) { toCol.setHsv(h, s, v); } - if(subSubSubElem.hasAttribute("INV_HUE")) - { - invHue = subSubSubElem.attribute("INV_HUE").toInt(); - } + invHue = readBool(subSubSubElem, "INV_HUE", false); mUi->colorPlot->getMapItem()->addMap( x, y, width, height, colored, mapHeightValue, fromCol, toCol, invHue); @@ -2252,50 +2151,38 @@ void Control::getXml(const QDomElement &elem, const QString &version) } mUi->mapNr->setMaximum(mUi->colorPlot->getMapItem()->mapNum() - 1); - if(subSubElem.hasAttribute("MAP_NUMBER")) // hiermit werden aus map-datenstruktur richtige map - // angezeigt, daher am ende - { - mUi->mapNr->setValue(subSubElem.attribute("MAP_NUMBER").toInt()); - on_mapNr_valueChanged( - subSubElem.attribute("MAP_NUMBER").toInt()); // nochmal explizit aufrufen, falls 0, dann - // wuerde valueChanged nicht on_... durchlaufen - } - if(subSubElem.hasAttribute("DEFAULT_HEIGHT")) - { - mUi->mapDefaultHeight->setValue(subSubElem.attribute("DEFAULT_HEIGHT").toDouble()); - } + loadIntValue( + subSubElem, + "MAP_NUMBER", + mUi->mapNr); // here conversion from map data structure to real map, therefore at the end + on_mapNr_valueChanged(readInt( + subSubElem, + "MAP_NUMBER")); // explicitely called if 0, otherwise the signal wouldn't fire + loadDoubleValue(subSubElem, "DEFAULT_HEIGHT", mUi->mapDefaultHeight); } - else if(subSubElem.tagName() == "READ_HEIGHTS") { - if(subSubElem.hasAttribute("HEIGHT_FILE")) + QString heightFileName = readQString(subSubElem, "HEIGHT_FILE"); + if(!getExistingFile(heightFileName, mMainWindow->getProFileName()).isEmpty()) { - QString heightFileName = (subSubElem.attribute("HEIGHT_FILE")); - if(!getExistingFile(heightFileName, mMainWindow->getProFileName()).isEmpty()) - { - mMainWindow->setHeightFileName( - getExistingFile(heightFileName, mMainWindow->getProFileName())); - } - else - { - mMainWindow->setHeightFileName(heightFileName); - } + mMainWindow->setHeightFileName(getExistingFile(heightFileName, mMainWindow->getProFileName())); + } + else + { + mMainWindow->setHeightFileName(heightFileName); } } else if(subSubElem.tagName() == "READ_MARKER_IDS") { - if(subSubElem.hasAttribute("MARKER_FILE")) + QString fm = readQString(subSubElem, "MARKER_FILE"); + if(getExistingFile(fm, mMainWindow->getProFileName()) != "") { - QString fm = subSubElem.attribute("MARKER_FILE"); - if(getExistingFile(fm, mMainWindow->getProFileName()) != "") - { - mMainWindow->setMarkerIDFileName(getExistingFile(fm, mMainWindow->getProFileName())); - } - else - { - mMainWindow->setMarkerIDFileName(fm); - } + mMainWindow->setMarkerIDFileName(getExistingFile(fm, mMainWindow->getProFileName())); + } + else + { + mMainWindow->setMarkerIDFileName(fm); } } @@ -2312,399 +2199,158 @@ void Control::getXml(const QDomElement &elem, const QString &version) { if(subSubElem.tagName() == "ONLINE_CALCULATION") { - if(subSubElem.hasAttribute("ENABLED")) - { - mUi->trackOnlineCalc->setCheckState( - subSubElem.attribute("ENABLED").toInt() ? Qt::Checked : Qt::Unchecked); - } + loadBoolValue(subSubElem, "ENABLED", mUi->trackOnlineCalc); } else if(subSubElem.tagName() == "REPEAT_BELOW") { - if(subSubElem.hasAttribute("ENABLED")) - { - mUi->trackRepeat->setCheckState( - subSubElem.attribute("ENABLED").toInt() ? Qt::Checked : Qt::Unchecked); - } - if(subSubElem.hasAttribute("QUALITY")) - { - mUi->trackRepeatQual->setValue(subSubElem.attribute("QUALITY").toInt()); - } + loadBoolValue(subSubElem, "ENABLED", mUi->trackRepeat); + loadIntValue(subSubElem, "QUALITY", mUi->trackRepeatQual); } else if(subSubElem.tagName() == "EXTRAPOLATION") { - if(subSubElem.hasAttribute("ENABLED")) - { - mUi->trackExtrapolation->setCheckState( - subSubElem.attribute("ENABLED").toInt() ? Qt::Checked : Qt::Unchecked); - } + loadBoolValue(subSubElem, "ENABLED", mUi->trackExtrapolation); } else if(subSubElem.tagName() == "MERGE") { - if(subSubElem.hasAttribute("ENABLED")) - { - mUi->trackMerge->setCheckState( - subSubElem.attribute("ENABLED").toInt() ? Qt::Checked : Qt::Unchecked); - } + loadBoolValue(subSubElem, "ENABLED", mUi->trackMerge); } else if(subSubElem.tagName() == "ONLY_VISIBLE") { - if(subSubElem.hasAttribute("ENABLED")) - { - mUi->trackOnlySelected->setCheckState( - subSubElem.attribute("ENABLED").toInt() ? Qt::Checked : Qt::Unchecked); - } + loadBoolValue(subSubElem, "ENABLED", mUi->trackOnlySelected); } else if(subSubElem.tagName() == "SEARCH_MISSING_FRAMES") { - if(subSubElem.hasAttribute("ENABLED")) - { - mUi->trackMissingFrames->setCheckState( - subSubElem.attribute("ENABLED").toInt() ? Qt::Checked : Qt::Unchecked); - } + loadBoolValue(subSubElem, "ENABLED", mUi->trackMissingFrames); } else if(subSubElem.tagName() == "RECALCULATE_MEDIAN_HEIGHT") { - if(subSubElem.hasAttribute("ENABLED")) - { - mUi->trackRecalcHeight->setCheckState( - subSubElem.attribute("ENABLED").toInt() ? Qt::Checked : Qt::Unchecked); - } + loadBoolValue(subSubElem, "ENABLED", mUi->trackRecalcHeight); } else if(subSubElem.tagName() == "REGION_OF_INTEREST") { double x = 0, y = 0, w = 0, h = 0; - if(subSubElem.hasAttribute("SHOW")) - { - mUi->trackRoiShow->setCheckState( - subSubElem.attribute("SHOW").toInt() ? Qt::Checked : Qt::Unchecked); - } - if(subSubElem.hasAttribute("FIX")) - { - mUi->trackRoiFix->setCheckState( - subSubElem.attribute("FIX").toInt() ? Qt::Checked : Qt::Unchecked); - } - if(subSubElem.hasAttribute("X")) - { - x = subSubElem.attribute("X").toDouble(); - } - if(subSubElem.hasAttribute("Y")) - { - y = subSubElem.attribute("Y").toDouble(); - } - if(subSubElem.hasAttribute("WIDTH")) - { - w = subSubElem.attribute("WIDTH").toDouble(); - } - if(subSubElem.hasAttribute("HEIGHT")) - { - h = subSubElem.attribute("HEIGHT").toDouble(); - } + + loadBoolValue(subSubElem, "SHOW", mUi->trackRoiShow, false); + loadBoolValue(subSubElem, "FIX", mUi->trackRoiFix, false); + + x = readDouble(subSubElem, "X"); + y = readDouble(subSubElem, "Y"); + w = readDouble(subSubElem, "WIDTH"); + h = readDouble(subSubElem, "HEIGHT"); + mMainWindow->getTrackRoiItem()->setRect(x, y, w, h); } else if(subSubElem.tagName() == "ALLOW_ALTERNATE_HEIGHT") { - if(subSubElem.hasAttribute("ENABLED")) - { - mUi->trackAlternateHeight->setCheckState( - subSubElem.attribute("ENABLED").toInt() ? Qt::Checked : Qt::Unchecked); - } + loadBoolValue(subSubElem, "ENABLED", mUi->trackAlternateHeight); } else if(subSubElem.tagName() == "EXPORT_ELIMINATE_TRACKPOINT_WITHOUT_HEIGHT") { - if(subSubElem.hasAttribute("ENABLED")) - { - mUi->exportElimTp->setCheckState( - subSubElem.attribute("ENABLED").toInt() ? Qt::Checked : Qt::Unchecked); - } + loadBoolValue(subSubElem, "ENABLED", mUi->exportElimTp); } else if(subSubElem.tagName() == "EXPORT_ELIMINATE_TRAJECTORY_WITHOUT_HEIGHT") { - if(subSubElem.hasAttribute("ENABLED")) - { - mUi->exportElimTrj->setCheckState( - subSubElem.attribute("ENABLED").toInt() ? Qt::Checked : Qt::Unchecked); - } + loadBoolValue(subSubElem, "ENABLED", mUi->exportElimTrj); } else if(subSubElem.tagName() == "EXPORT_SMOOTH") { - if(subSubElem.hasAttribute("ENABLED")) - { - mUi->exportSmooth->setCheckState( - subSubElem.attribute("ENABLED").toInt() ? Qt::Checked : Qt::Unchecked); - } + loadBoolValue(subSubElem, "ENABLED", mUi->exportSmooth); } else if(subSubElem.tagName() == "EXPORT_VIEWING_DIRECTION") { - if(subSubElem.hasAttribute("ENABLED")) - { - mUi->exportViewDir->setCheckState( - subSubElem.attribute("ENABLED").toInt() ? Qt::Checked : Qt::Unchecked); - } + loadBoolValue(subSubElem, "ENABLED", mUi->exportViewDir); } else if(subSubElem.tagName() == "EXPORT_ANGLE_OF_VIEW") { - if(subSubElem.hasAttribute("ENABLED")) - { - mUi->exportAngleOfView->setCheckState( - subSubElem.attribute("ENABLED").toInt() ? Qt::Checked : Qt::Unchecked); - } + loadBoolValue(subSubElem, "ENABLED", mUi->exportAngleOfView); } else if(subSubElem.tagName() == "EXPORT_USE_METER") { - if(subSubElem.hasAttribute("ENABLED")) - { - mUi->exportUseM->setCheckState( - subSubElem.attribute("ENABLED").toInt() ? Qt::Checked : Qt::Unchecked); - } + loadBoolValue(subSubElem, "ENABLED", mUi->exportUseM); } else if(subSubElem.tagName() == "EXPORT_COMMENT") { - if(subSubElem.hasAttribute("ENABLED")) - { - mUi->exportComment->setCheckState( - subSubElem.attribute("ENABLED").toInt() ? Qt::Checked : Qt::Unchecked); - } + loadBoolValue(subSubElem, "ENABLED", mUi->exportComment); } else if(subSubElem.tagName() == "EXPORT_MARKERID") { - if(subSubElem.hasAttribute("ENABLED")) - { - mUi->exportMarkerID->setCheckState( - subSubElem.attribute("ENABLED").toInt() ? Qt::Checked : Qt::Unchecked); - } + loadBoolValue(subSubElem, "ENABLED", mUi->exportMarkerID); } else if((subSubElem.tagName() == "TEST_EQUAL") && (!newerThanVersion(version, QString("0.10.0")))) { - if(subSubElem.hasAttribute("ENABLED")) - { - mCorrectionWidget->setTestEqualCheckState( - subSubElem.attribute("ENABLED").toInt() ? Qt::Checked : Qt::Unchecked); - } + mCorrectionWidget->setTestEqualChecked(readBool(subSubElem, "ENABLED")); } else if((subSubElem.tagName() == "TEST_VELOCITY") && (!newerThanVersion(version, QString("0.10.0")))) { - if(subSubElem.hasAttribute("ENABLED")) - { - mCorrectionWidget->setTestVelocityCheckState( - subSubElem.attribute("ENABLED").toInt() ? Qt::Checked : Qt::Unchecked); - } + mCorrectionWidget->setTestVelocityChecked(readBool(subSubElem, "ENABLED")); } else if((subSubElem.tagName() == "TEST_INSIDE") && (!newerThanVersion(version, QString("0.10.0")))) { - if(subSubElem.hasAttribute("ENABLED")) - { - mCorrectionWidget->setTestInsideCheckState( - subSubElem.attribute("ENABLED").toInt() ? Qt::Checked : Qt::Unchecked); - } + mCorrectionWidget->setTestInsideChecked(readBool(subSubElem, "ENABLED")); } else if((subSubElem.tagName() == "TEST_LENGTH") && (!newerThanVersion(version, QString("0.10.0")))) { - if(subSubElem.hasAttribute("ENABLED")) - { - mCorrectionWidget->setTestLengthCheckState( - subSubElem.attribute("ENABLED").toInt() ? Qt::Checked : Qt::Unchecked); - } + mCorrectionWidget->setTestLengthChecked(readBool(subSubElem, "ENABLED")); } else if(subSubElem.tagName() == "TRACK_FILE") { - if(subSubElem.hasAttribute("FILENAME")) + if(getExistingFile(readQString(subSubElem, "FILENAME"), mMainWindow->getProFileName()) != "") { - if(getExistingFile(subSubElem.attribute("FILENAME"), mMainWindow->getProFileName()) != "") - { - mMainWindow->setTrackFileName( - getExistingFile(subSubElem.attribute("FILENAME"), mMainWindow->getProFileName())); - } - else // eigentlich nicht lesbar, aber so wird wenigstens beim projekt speichern wieder mit - // weggeschrieben - { - mMainWindow->setTrackFileName(subSubElem.attribute("FILENAME")); - } + mMainWindow->setTrackFileName( + getExistingFile(readQString(subSubElem, "FILENAME"), mMainWindow->getProFileName())); + } + else // eigentlich nicht lesbar, aber so wird wenigstens beim projekt speichern wieder mit + // weggeschrieben + { + mMainWindow->setTrackFileName(readQString(subSubElem, "FILENAME")); } } else if(subSubElem.tagName() == "SEARCH_REGION") { - if(subSubElem.hasAttribute("SCALE")) - { - mUi->trackRegionScale->setValue(subSubElem.attribute("SCALE").toInt()); - } - if(subSubElem.hasAttribute("LEVELS")) - { - mUi->trackRegionLevels->setValue(subSubElem.attribute("LEVELS").toInt()); - } - if(subSubElem.hasAttribute("MAX_ERROR")) - { - mUi->trackErrorExponent->setValue(subSubElem.attribute("MAX_ERROR").toInt()); - } - if(subSubElem.hasAttribute("SHOW")) - { - mUi->trackShowSearchSize->setCheckState( - subSubElem.attribute("SHOW").toInt() ? Qt::Checked : Qt::Unchecked); - } - if(subSubElem.hasAttribute("ADAPTIVE")) - { - mUi->adaptiveLevel->setCheckState( - subSubElem.attribute("ADAPTIVE").toInt() ? Qt::Checked : Qt::Unchecked); - } + loadIntValue(subSubElem, "SCALE", mUi->trackRegionScale); + loadIntValue(subSubElem, "LEVELS", mUi->trackRegionLevels); + loadIntValue(subSubElem, "MAX_ERROR", mUi->trackErrorExponent, 0); + loadBoolValue(subSubElem, "SHOW", mUi->trackShowSearchSize, false); + loadBoolValue(subSubElem, "ADAPTIVE", mUi->adaptiveLevel, false); } else if(subSubElem.tagName() == "PATH") { - if(subSubElem.hasAttribute("SHOW")) - { - mUi->trackShow->setCheckState( - subSubElem.attribute("SHOW").toInt() ? Qt::Checked : Qt::Unchecked); - } - if(subSubElem.hasAttribute("SHOW_COMPLETE")) - { - mUi->trackShowComplPath->setCheckState( - subSubElem.attribute("SHOW_COMPLETE").toInt() ? Qt::Checked : Qt::Unchecked); - } - else - { - mUi->trackShowComplPath->setCheckState(Qt::Unchecked); - } - if(subSubElem.hasAttribute("FIX")) - { - mUi->trackFix->setCheckState(subSubElem.attribute("FIX").toInt() ? Qt::Checked : Qt::Unchecked); - } - - if(subSubElem.hasAttribute("ONLY_VISIBLE")) - { - mUi->trackShowOnlyVisible->setCheckState( - subSubElem.attribute("ONLY_VISIBLE").toInt() ? Qt::Checked : Qt::Unchecked); - } - if(subSubElem.hasAttribute("ONLY_PEOPLE")) - { - mUi->trackShowOnly->setCheckState( - subSubElem.attribute("ONLY_PEOPLE").toInt() ? Qt::Checked : Qt::Unchecked); - } - - if(subSubElem.hasAttribute("ONLY_PEOPLE_LIST")) - { - mUi->trackShowOnlyList->setCheckState( - subSubElem.attribute("ONLY_PEOPLE_LIST").toInt() ? Qt::Checked : Qt::Unchecked); - } - + loadBoolValue(subSubElem, "SHOW_COMPLETE", mUi->trackShowComplPath, false); + loadBoolValue(subSubElem, "SHOW", mUi->trackShow, true); + loadBoolValue(subSubElem, "FIX", mUi->trackFix, false); + loadBoolValue(subSubElem, "ONLY_VISIBLE", mUi->trackShowOnlyVisible, false); + loadBoolValue(subSubElem, "ONLY_PEOPLE", mUi->trackShowOnly, false); + loadBoolValue(subSubElem, "ONLY_PEOPLE_LIST", mUi->trackShowOnlyList, false); // IMPORTANT: reading ONLY_PEOPLE_NR is done in petrack.cpp, as the trajectories need to be // loaded before! - if(subSubElem.hasAttribute("SHOW_CURRENT_POINT")) - { - mUi->trackShowCurrentPoint->setCheckState( - subSubElem.attribute("SHOW_CURRENT_POINT").toInt() ? Qt::Checked : Qt::Unchecked); - } - if(subSubElem.hasAttribute("SHOW_POINTS")) - { - mUi->trackShowPoints->setCheckState( - subSubElem.attribute("SHOW_POINTS").toInt() ? Qt::Checked : Qt::Unchecked); - } - if(subSubElem.hasAttribute("SHOW_PATH")) - { - mUi->trackShowPath->setCheckState( - subSubElem.attribute("SHOW_PATH").toInt() ? Qt::Checked : Qt::Unchecked); - } - if(subSubElem.hasAttribute("SHOW_COLLECTIVE_COLOR")) - { - mUi->trackShowColColor->setCheckState( - subSubElem.attribute("SHOW_COLLECTIVE_COLOR").toInt() ? Qt::Checked : Qt::Unchecked); - } - if(subSubElem.hasAttribute("SHOW_COLOR_MARKER")) - { - mUi->trackShowColorMarker->setCheckState( - subSubElem.attribute("SHOW_COLOR_MARKER").toInt() ? Qt::Checked : Qt::Unchecked); - } - if(subSubElem.hasAttribute("SHOW_NUMBER")) - { - mUi->trackShowNumber->setCheckState( - subSubElem.attribute("SHOW_NUMBER").toInt() ? Qt::Checked : Qt::Unchecked); - } - if(subSubElem.hasAttribute("SHOW_GROUND_POSITION")) - { - mUi->trackShowGroundPosition->setCheckState( - subSubElem.attribute("SHOW_GROUND_POSITION").toInt() ? Qt::Checked : Qt::Unchecked); - } - if(subSubElem.hasAttribute("SHOW_GROUND_PATH")) - { - mUi->trackShowGroundPath->setCheckState( - subSubElem.attribute("SHOW_GROUND_PATH").toInt() ? Qt::Checked : Qt::Unchecked); - } - if(subSubElem.hasAttribute("TRACK_PATH_COLOR")) - { - QColor color(subSubElem.attribute("TRACK_PATH_COLOR")); - setTrackPathColor(color); - } - if(subSubElem.hasAttribute("TRACK_GROUND_PATH_COLOR")) - { - QColor color(subSubElem.attribute("TRACK_GROUND_PATH_COLOR")); - setTrackGroundPathColor(color); - } - if(subSubElem.hasAttribute("HEAD_SIZE")) - { - mUi->trackHeadSized->setCheckState( - subSubElem.attribute("HEAD_SIZE").toInt() ? Qt::Checked : Qt::Unchecked); - } - if(subSubElem.hasAttribute("CURRENT_POINT_SIZE")) - { - mUi->trackCurrentPointSize->setValue(subSubElem.attribute("CURRENT_POINT_SIZE").toInt()); - } - if(subSubElem.hasAttribute("CURRENT_POINT_LINE_WIDTH")) - { - mUi->trackCurrentPointLineWidth->setValue( - subSubElem.attribute("CURRENT_POINT_LINE_WIDTH").toInt()); - } - if(subSubElem.hasAttribute("POINTS_SIZE")) - { - mUi->trackPointSize->setValue(subSubElem.attribute("POINTS_SIZE").toInt()); - } - if(subSubElem.hasAttribute("SHOW_POINTS_LINE_WIDTH")) - { - mUi->trackShowPointsLineWidth->setValue(subSubElem.attribute("SHOW_POINTS_LINE_WIDTH").toInt()); - } - if(subSubElem.hasAttribute("PATH_SIZE")) - { - mUi->trackPathWidth->setValue(subSubElem.attribute("PATH_SIZE").toInt()); - } - if(subSubElem.hasAttribute("COLLECTIVE_COLOR_SIZE")) - { - mUi->trackColColorSize->setValue(subSubElem.attribute("COLLECTIVE_COLOR_SIZE").toInt()); - } - if(subSubElem.hasAttribute("COLOR_MARKER_SIZE")) - { - mUi->trackColorMarkerSize->setValue(subSubElem.attribute("COLOR_MARKER_SIZE").toInt()); - } - if(subSubElem.hasAttribute("COLOR_MARKER_LINE_WIDTH")) - { - mUi->trackColorMarkerLineWidth->setValue( - subSubElem.attribute("COLOR_MARKER_LINE_WIDTH").toInt()); - } - if(subSubElem.hasAttribute("NUMBER_SIZE")) - { - mUi->trackNumberSize->setValue(subSubElem.attribute("NUMBER_SIZE").toInt()); - } - if(subSubElem.hasAttribute("GROUND_POSITION_SIZE")) - { - mUi->trackGroundPositionSize->setValue(subSubElem.attribute("GROUND_POSITION_SIZE").toInt()); - } - if(subSubElem.hasAttribute("GROUND_PATH_SIZE")) - { - mUi->trackGroundPathSize->setValue(subSubElem.attribute("GROUND_PATH_SIZE").toInt()); - } - if(subSubElem.hasAttribute("POINTS_COLORED")) - { - mUi->trackShowPointsColored->setCheckState( - subSubElem.attribute("POINTS_COLORED").toInt() ? Qt::Checked : Qt::Unchecked); - } - if(subSubElem.hasAttribute("NUMBER_BOLD")) - { - mUi->trackNumberBold->setCheckState( - subSubElem.attribute("NUMBER_BOLD").toInt() ? Qt::Checked : Qt::Unchecked); - } - if(subSubElem.hasAttribute("BEFORE")) - { - mUi->trackShowBefore->setValue(subSubElem.attribute("BEFORE").toInt()); - } - if(subSubElem.hasAttribute("AFTER")) - { - mUi->trackShowAfter->setValue(subSubElem.attribute("AFTER").toInt()); - } + loadBoolValue(subSubElem, "SHOW_CURRENT_POINT", mUi->trackShowCurrentPoint, true); + loadBoolValue(subSubElem, "SHOW_POINTS", mUi->trackShowPoints, false); + loadBoolValue(subSubElem, "SHOW_PATH", mUi->trackShowPath, true); + loadBoolValue(subSubElem, "SHOW_COLLECTIVE_COLOR", mUi->trackShowColColor, true); + loadBoolValue(subSubElem, "SHOW_COLOR_MARKER", mUi->trackShowColorMarker, true); + loadBoolValue(subSubElem, "SHOW_NUMBER", mUi->trackShowNumber, true); + loadBoolValue(subSubElem, "SHOW_GROUND_POSITION", mUi->trackShowGroundPosition, false); + loadBoolValue(subSubElem, "SHOW_GROUND_PATH", mUi->trackShowGroundPath, false); + + setTrackPathColor(readQString(subSubElem, "TRACK_PATH_COLOR", "#ff0000")); + setTrackGroundPathColor(readQString(subSubElem, "TRACK_GROUND_PATH_COLOR", "#00ff00")); + + loadBoolValue(subSubElem, "HEAD_SIZE", mUi->trackHeadSized, true); + loadIntValue(subSubElem, "CURRENT_POINT_SIZE", mUi->trackCurrentPointSize, 60); + loadIntValue(subSubElem, "CURRENT_POINT_LINE_WIDTH", mUi->trackCurrentPointLineWidth, 1); + loadIntValue(subSubElem, "POINTS_SIZE", mUi->trackPointSize, 7); + loadIntValue(subSubElem, "SHOW_POINTS_LINE_WIDTH", mUi->trackShowPointsLineWidth, 1); + loadIntValue(subSubElem, "PATH_SIZE", mUi->trackPathWidth, 2); + loadIntValue(subSubElem, "COLLECTIVE_COLOR_SIZE", mUi->trackColColorSize, 11); + loadIntValue(subSubElem, "COLOR_MARKER_SIZE", mUi->trackColorMarkerSize, 14); + loadIntValue(subSubElem, "COLOR_MARKER_LINE_WIDTH", mUi->trackColorMarkerLineWidth, 1); + loadIntValue(subSubElem, "NUMBER_SIZE", mUi->trackNumberSize, 14); + loadIntValue(subSubElem, "GROUND_POSITION_SIZE", mUi->trackGroundPositionSize, 1); + loadIntValue(subSubElem, "GROUND_PATH_SIZE", mUi->trackGroundPathSize, 1); + loadBoolValue(subSubElem, "POINTS_COLORED", mUi->trackShowPointsColored, true); + loadBoolValue(subSubElem, "NUMBER_BOLD", mUi->trackNumberBold, true); + loadIntValue(subSubElem, "BEFORE", mUi->trackShowBefore, 15); + loadIntValue(subSubElem, "AFTER", mUi->trackShowAfter, 15); } else { @@ -2719,51 +2365,20 @@ void Control::getXml(const QDomElement &elem, const QString &version) { if(subSubElem.tagName() == "SEARCH_MISSING_FRAMES") { - if(subSubElem.hasAttribute("ENABLED")) - { - mUi->anaMissingFrames->setCheckState( - subSubElem.attribute("ENABLED").toInt() ? Qt::Checked : Qt::Unchecked); - } + loadBoolValue(subSubElem, "ENABLED", mUi->anaMissingFrames); } else if(subSubElem.tagName() == "MARK_ACTUAL") { - if(subSubElem.hasAttribute("ENABLED")) - { - mUi->anaMarkAct->setCheckState( - subSubElem.attribute("ENABLED").toInt() ? Qt::Checked : Qt::Unchecked); - } + loadBoolValue(subSubElem, "ENABLED", mUi->anaMarkAct); } else if(subSubElem.tagName() == "CALCULATION") { - if(subSubElem.hasAttribute("STEP_SIZE")) - { - mUi->anaStep->setValue(subSubElem.attribute("STEP_SIZE").toInt()); - } - if(subSubElem.hasAttribute("CONSIDER_X")) - { - mUi->anaConsiderX->setCheckState( - subSubElem.attribute("CONSIDER_X").toInt() ? Qt::Checked : Qt::Unchecked); - } - if(subSubElem.hasAttribute("CONSIDER_Y")) - { - mUi->anaConsiderY->setCheckState( - subSubElem.attribute("CONSIDER_Y").toInt() ? Qt::Checked : Qt::Unchecked); - } - if(subSubElem.hasAttribute("ABSOLUTE")) - { - mUi->anaConsiderAbs->setCheckState( - subSubElem.attribute("ABSOLUTE").toInt() ? Qt::Checked : Qt::Unchecked); - } - if(subSubElem.hasAttribute("REVERSE")) - { - mUi->anaConsiderRev->setCheckState( - subSubElem.attribute("REVERSE").toInt() ? Qt::Checked : Qt::Unchecked); - } - if(subSubElem.hasAttribute("SHOW_VORONOI")) - { - mUi->showVoronoiCells->setCheckState( - subSubElem.attribute("SHOW_VORONOI").toInt() ? Qt::Checked : Qt::Unchecked); - } + loadIntValue(subSubElem, "STEP_SIZE", mUi->anaStep); + loadBoolValue(subSubElem, "CONSIDER_X", mUi->anaConsiderX); + loadBoolValue(subSubElem, "CONSIDER_Y", mUi->anaConsiderY); + loadBoolValue(subSubElem, "ABSOLUTE", mUi->anaConsiderAbs); + loadBoolValue(subSubElem, "REVERSE", mUi->anaConsiderRev); + loadBoolValue(subSubElem, "SHOW_VORONOI", mUi->showVoronoiCells, false); } else { diff --git a/src/ui/main-windows/coordinateSystemBox.cpp b/src/ui/main-windows/coordinateSystemBox.cpp index aff734256..96fbf71da 100644 --- a/src/ui/main-windows/coordinateSystemBox.cpp +++ b/src/ui/main-windows/coordinateSystemBox.cpp @@ -22,6 +22,7 @@ #include "extrCalibration.h" #include "extrinsicBox.h" #include "imageItem.h" +#include "importHelper.h" #include "intrinsicBox.h" #include "pGroupBox.h" #include "ui_coordinateSystemBox.h" @@ -378,101 +379,37 @@ bool CoordinateSystemBox::getXml(const QDomElement &subSubElem) { if(subSubElem.tagName() == "EXTRINSIC_PARAMETERS") { - if(subSubElem.hasAttribute("SHOW_CALIB_POINTS")) - { - mUi->extCalibPointsShow->setCheckState( - subSubElem.attribute("SHOW_CALIB_POINTS").toInt() ? Qt::Checked : Qt::Unchecked); - } + loadBoolValue(subSubElem, "SHOW_CALIB_POINTS", mUi->extCalibPointsShow, false); + loadActiveIndex(subSubElem, "COORD_DIMENSION", mUi->coordTab, 0); + loadBoolValue(subSubElem, "SHOW", mUi->coordShow, false); + loadBoolValue(subSubElem, "FIX", mUi->coordFix, false); + loadIntValue(subSubElem, "ROTATE", mUi->coordRotate, 0); - if(subSubElem.hasAttribute("COORD_DIMENSION")) - { - mUi->coordTab->setCurrentIndex(subSubElem.attribute("COORD_DIMENSION").toInt()); - } - else - { - mUi->coordTab->setCurrentIndex(1); // = 2D - mExtrBox.setEnabledExtrParams(false); - } - if(subSubElem.hasAttribute("SHOW")) - { - mUi->coordShow->setCheckState(subSubElem.attribute("SHOW").toInt() ? Qt::Checked : Qt::Unchecked); - } - if(subSubElem.hasAttribute("FIX")) - { - mUi->coordFix->setCheckState(subSubElem.attribute("FIX").toInt() ? Qt::Checked : Qt::Unchecked); - } - if(subSubElem.hasAttribute("ROTATE")) - { - mUi->coordRotate->setValue(subSubElem.attribute("ROTATE").toInt()); - } - if(subSubElem.hasAttribute("TRANS_X")) - { - int trans_x = subSubElem.attribute("TRANS_X").toInt(); - if(trans_x > mUi->coordTransX->maximum()) - { - setCalibCoordTransXMax(trans_x); - } - mUi->coordTransX->setValue(trans_x); - } - if(subSubElem.hasAttribute("TRANS_Y")) - { - int trans_y = subSubElem.attribute("TRANS_Y").toInt(); - if(trans_y > mUi->coord3DTransY->maximum()) - { - setCalibCoordTransYMax(trans_y); - } - mUi->coordTransY->setValue(trans_y); - } - mUi->coordTransY->setValue(subSubElem.attribute("TRANS_Y").toInt()); - if(subSubElem.hasAttribute("SCALE")) - { - mUi->coordScale->setValue(subSubElem.attribute("SCALE").toInt()); - } - if(subSubElem.hasAttribute("ALTITUDE")) - { - mUi->coordAltitude->setValue(subSubElem.attribute("ALTITUDE").toDouble()); - } - if(subSubElem.hasAttribute("UNIT")) - { - mUi->coordUnit->setValue(subSubElem.attribute("UNIT").toDouble()); - } - if(subSubElem.hasAttribute("USE_INTRINSIC_CENTER")) - { - mUi->coordUseIntrinsic->setCheckState( - subSubElem.attribute("USE_INTRINSIC_CENTER").toInt() ? Qt::Checked : Qt::Unchecked); - } - if(subSubElem.hasAttribute("COORD3D_TRANS_X")) - { - mUi->coord3DTransX->setValue(subSubElem.attribute("COORD3D_TRANS_X").toInt()); - } - if(subSubElem.hasAttribute("COORD3D_TRANS_Y")) - { - mUi->coord3DTransY->setValue(subSubElem.attribute("COORD3D_TRANS_Y").toInt()); - } - if(subSubElem.hasAttribute("COORD3D_TRANS_Z")) - { - mUi->coord3DTransZ->setValue(subSubElem.attribute("COORD3D_TRANS_Z").toInt()); - } - if(subSubElem.hasAttribute("COORD3D_AXIS_LEN")) + int trans_x = readInt(subSubElem, "TRANS_X", 0); + if(trans_x > mUi->coordTransX->maximum()) { - mUi->coord3DAxeLen->setValue(subSubElem.attribute("COORD3D_AXIS_LEN").toInt()); + setCalibCoordTransXMax(trans_x); } - if(subSubElem.hasAttribute("COORD3D_SWAP_X")) - { - mUi->coord3DSwapX->setCheckState( - subSubElem.attribute("COORD3D_SWAP_X").toInt() ? Qt::Checked : Qt::Unchecked); - } - if(subSubElem.hasAttribute("COORD3D_SWAP_Y")) - { - mUi->coord3DSwapY->setCheckState( - subSubElem.attribute("COORD3D_SWAP_Y").toInt() ? Qt::Checked : Qt::Unchecked); - } - if(subSubElem.hasAttribute("COORD3D_SWAP_Z")) + mUi->coordTransX->setValue(trans_x); + + int trans_y = readInt(subSubElem, "TRANS_Y", 0); + if(trans_y > mUi->coord3DTransY->maximum()) { - mUi->coord3DSwapZ->setCheckState( - subSubElem.attribute("COORD3D_SWAP_Z").toInt() ? Qt::Checked : Qt::Unchecked); + setCalibCoordTransYMax(trans_y); } + loadIntValue(subSubElem, "TRANS_Y", mUi->coordTransY, 0); + loadIntValue(subSubElem, "SCALE", mUi->coordScale, 100); + loadDoubleValue(subSubElem, "ALTITUDE", mUi->coordAltitude, 535); + loadDoubleValue(subSubElem, "UNIT", mUi->coordUnit, 100); + loadBoolValue(subSubElem, "USE_INTRINSIC_CENTER", mUi->coordUseIntrinsic, false); + loadIntValue(subSubElem, "COORD3D_TRANS_X", mUi->coord3DTransX, 0); + loadIntValue(subSubElem, "COORD3D_TRANS_Y", mUi->coord3DTransY, 0); + loadIntValue(subSubElem, "COORD3D_TRANS_Z", mUi->coord3DTransZ, 0); + loadIntValue(subSubElem, "COORD3D_AXIS_LEN", mUi->coord3DAxeLen, 200); + loadBoolValue(subSubElem, "COORD3D_SWAP_X", mUi->coord3DSwapX, false); + loadBoolValue(subSubElem, "COORD3D_SWAP_Y", mUi->coord3DSwapY, false); + loadBoolValue(subSubElem, "COORD3D_SWAP_Z", mUi->coord3DSwapZ, false); if(subSubElem.hasAttribute("IMMUTABLE_COORD_BOX")) { @@ -481,7 +418,7 @@ bool CoordinateSystemBox::getXml(const QDomElement &subSubElem) auto *parent = dynamic_cast<PGroupBox *>(this->parent()->parent()); if(parent) { - parent->setImmutable(subSubElem.attribute("IMMUTABLE_COORD_BOX").toInt()); + parent->setImmutable(readBool(subSubElem, "IMMUTABLE_COORD_BOX", false)); } } } diff --git a/src/ui/main-windows/correction.cpp b/src/ui/main-windows/correction.cpp index ae8af8f99..e4f40afff 100644 --- a/src/ui/main-windows/correction.cpp +++ b/src/ui/main-windows/correction.cpp @@ -20,6 +20,7 @@ #include "animation.h" #include "control.h" +#include "importHelper.h" #include "pMessageBox.h" #include "personStorage.h" #include "player.h" @@ -198,36 +199,36 @@ bool Correction::getTestEqualChecked() const { return mUi->chbEqual->isChecked(); } -void Correction::setTestEqualCheckState(Qt::CheckState testEqual) +void Correction::setTestEqualChecked(bool testEqual) { - mUi->chbEqual->setCheckState(testEqual); + mUi->chbEqual->setChecked(testEqual); } bool Correction::getTestVelocityChecked() const { return mUi->chbVelocity->isChecked(); } -void Correction::setTestVelocityCheckState(Qt::CheckState testVelocity) +void Correction::setTestVelocityChecked(bool testVelocity) { - mUi->chbVelocity->setCheckState(testVelocity); + mUi->chbVelocity->setChecked(testVelocity); } bool Correction::getTestLengthChecked() const { return mUi->chbLength->isChecked(); } -void Correction::setTestLengthCheckState(Qt::CheckState testLength) +void Correction::setTestLengthChecked(bool testLength) { - mUi->chbLength->setCheckState(testLength); + mUi->chbLength->setChecked(testLength); } bool Correction::getTestInsideChecked() const { return mUi->chbInside->isChecked(); } -void Correction::setTestInsideCheckState(Qt::CheckState testInside) +void Correction::setTestInsideChecked(bool testInside) { - mUi->chbInside->setCheckState(testInside); + mUi->chbInside->setChecked(testInside); } void Correction::selectedRowChanged() @@ -545,43 +546,22 @@ bool Correction::getXml(const QDomElement &correctionElem) { if(subElem.tagName() == "EQUALITY") { - if(subElem.hasAttribute("ENABLED")) - { - mUi->chbEqual->setCheckState(subElem.attribute("ENABLED").toInt() ? Qt::Checked : Qt::Unchecked); - } - if(subElem.hasAttribute("DISTANCE")) - { - setValue(mUi->spbxEqualityDistance, subElem.attribute("DISTANCE").toDouble()); - } + loadBoolValue(subElem, "ENABLED", mUi->chbEqual); + loadDoubleValue(subElem, "DISTANCE", mUi->spbxEqualityDistance); } else if(subElem.tagName() == "VELOCITY") { - if(subElem.hasAttribute("ENABLED")) - { - mUi->chbVelocity->setCheckState(subElem.attribute("ENABLED").toInt() ? Qt::Checked : Qt::Unchecked); - } + loadBoolValue(subElem, "ENABLED", mUi->chbVelocity); } else if(subElem.tagName() == "LENGTH") { - if(subElem.hasAttribute("ENABLED")) - { - mUi->chbLength->setCheckState(subElem.attribute("ENABLED").toInt() ? Qt::Checked : Qt::Unchecked); - } - if(subElem.hasAttribute("MIN_LENGTH")) - { - setValue(mUi->spbxMinFrameLength, subElem.attribute("MIN_LENGTH").toDouble()); - } + loadBoolValue(subElem, "ENABLED", mUi->chbLength); + loadDoubleValue(subElem, "MIN_LENGTH", mUi->spbxMinFrameLength); } else if(subElem.tagName() == "INSIDE") { - if(subElem.hasAttribute("ENABLED")) - { - mUi->chbInside->setCheckState(subElem.attribute("ENABLED").toInt() ? Qt::Checked : Qt::Unchecked); - } - if(subElem.hasAttribute("MARGIN")) - { - setValue(mUi->spbxInsideMargin, subElem.attribute("MARGIN").toDouble()); - } + loadBoolValue(subElem, "ENABLED", mUi->chbInside); + loadIntValue(subElem, "MARGIN", mUi->spbxInsideMargin); } else { diff --git a/src/ui/main-windows/correction.h b/src/ui/main-windows/correction.h index 7e4008c42..225b3483c 100644 --- a/src/ui/main-windows/correction.h +++ b/src/ui/main-windows/correction.h @@ -69,16 +69,16 @@ public: ~Correction() override; bool getTestEqualChecked() const; - void setTestEqualCheckState(Qt::CheckState testEqual); + void setTestEqualChecked(bool testEqual); bool getTestVelocityChecked() const; - void setTestVelocityCheckState(Qt::CheckState testVelocity); + void setTestVelocityChecked(bool testVelocity); bool getTestLengthChecked() const; - void setTestLengthCheckState(Qt::CheckState testLength); + void setTestLengthChecked(bool testLength); bool getTestInsideChecked() const; - void setTestInsideCheckState(Qt::CheckState testInside); + void setTestInsideChecked(bool testInside); void setXml(QDomElement &elem) const; bool getXml(const QDomElement &elem); diff --git a/src/ui/main-windows/extrinsicBox.cpp b/src/ui/main-windows/extrinsicBox.cpp index 029d5a91f..706f3168a 100644 --- a/src/ui/main-windows/extrinsicBox.cpp +++ b/src/ui/main-windows/extrinsicBox.cpp @@ -20,6 +20,7 @@ #include "extrCalibration.h" #include "helper.h" +#include "importHelper.h" #include "pGroupBox.h" #include "ui_extrinsicBox.h" @@ -241,41 +242,20 @@ bool ExtrinsicBox::getXml(QDomElement &subSubElem) if(subSubElem.tagName() == "EXTRINSIC_PARAMETERS") { ExtrinsicParameters params; - if(subSubElem.hasAttribute("EXTR_ROT_1")) - { - params.rot1 = subSubElem.attribute("EXTR_ROT_1").toDouble(); - } - if(subSubElem.hasAttribute("EXTR_ROT_2")) - { - params.rot2 = subSubElem.attribute("EXTR_ROT_2").toDouble(); - } - if(subSubElem.hasAttribute("EXTR_ROT_3")) - { - params.rot3 = subSubElem.attribute("EXTR_ROT_3").toDouble(); - } - if(subSubElem.hasAttribute("EXTR_TRANS_1")) - { - params.trans1 = subSubElem.attribute("EXTR_TRANS_1").toDouble(); - } - if(subSubElem.hasAttribute("EXTR_TRANS_2")) - { - params.trans2 = subSubElem.attribute("EXTR_TRANS_2").toDouble(); - } - if(subSubElem.hasAttribute("EXTR_TRANS_3")) - { - params.trans3 = subSubElem.attribute("EXTR_TRANS_3").toDouble(); - } + + params.rot1 = readDouble(subSubElem, "EXTR_ROT_1", 0); + params.rot2 = readDouble(subSubElem, "EXTR_ROT_2", 0); + params.rot3 = readDouble(subSubElem, "EXTR_ROT_3", 0); + params.trans1 = readDouble(subSubElem, "EXTR_TRANS_1", 0); + params.trans2 = readDouble(subSubElem, "EXTR_TRANS_2", 0); + params.trans3 = readDouble(subSubElem, "EXTR_TRANS_3", -500); setExtrinsicParameters(params); if(subSubElem.hasAttribute("EXTERNAL_CALIB_FILE")) { - if(getExistingFile(QString::fromStdString(subSubElem.attribute("EXTERNAL_CALIB_FILE").toStdString())) != "") - { - mExtrCalibration.setExtrCalibFile( - getExistingFile(QString::fromStdString(subSubElem.attribute("EXTERNAL_CALIB_FILE").toStdString()))); - // mMainWindow->isLoading() is true; doesn't perform calibration -> ignore return - mExtrCalibration.loadExtrCalibFile(); - } + mExtrCalibration.setExtrCalibFile(getExistingFile(readQString(subSubElem, "EXTERNAL_CALIB_FILE"))); + // mMainWindow->isLoading() is true; doesn't perform calibration -> ignore return + mExtrCalibration.loadExtrCalibFile(); } if(subSubElem.hasAttribute("IMMUTABLE_EXTRINSIC_BOX")) @@ -285,7 +265,7 @@ bool ExtrinsicBox::getXml(QDomElement &subSubElem) auto *parent = dynamic_cast<PGroupBox *>(this->parent()->parent()); if(parent) { - parent->setImmutable(subSubElem.attribute("IMMUTABLE_EXTRINSIC_BOX").toInt()); + parent->setImmutable(readBool(subSubElem, "IMMUTABLE_EXTRINSIC_BOX", false)); } } } diff --git a/src/ui/main-windows/filterBeforeBox.cpp b/src/ui/main-windows/filterBeforeBox.cpp index 4c141f7e6..672f2d9f8 100644 --- a/src/ui/main-windows/filterBeforeBox.cpp +++ b/src/ui/main-windows/filterBeforeBox.cpp @@ -22,7 +22,7 @@ #include "backgroundItem.h" #include "borderFilter.h" #include "brightContrastFilter.h" -#include "helper.h" +#include "importHelper.h" #include "pGroupBox.h" #include "pMessageBox.h" #include "swapFilter.h" @@ -88,84 +88,40 @@ bool FilterBeforeBox::getXmlSub(QDomElement &subSubElem) auto *parent = dynamic_cast<PGroupBox *>(this->parent()->parent()); if(parent) { - parent->setImmutable(subSubElem.attribute("IMMUTABLE").toInt()); + parent->setImmutable(readBool(subSubElem, "IMMUTABLE", false)); } } } else if(subSubElem.tagName() == "BRIGHTNESS") { - if(subSubElem.hasAttribute("ENABLED")) - { - mUi->filterBrightContrast->setCheckState( - subSubElem.attribute("ENABLED").toInt() ? Qt::Checked : Qt::Unchecked); - } - if(subSubElem.hasAttribute("VALUE")) - { - mUi->filterBrightParam->setValue(subSubElem.attribute("VALUE").toInt()); - } + loadBoolValue(subSubElem, "ENABLED", mUi->filterBrightContrast); + loadIntValue(subSubElem, "VALUE", mUi->filterBrightParam); } else if(subSubElem.tagName() == "CONTRAST") { - if(subSubElem.hasAttribute("ENABLED")) - { - mUi->filterBrightContrast->setCheckState( - subSubElem.attribute("ENABLED").toInt() ? Qt::Checked : Qt::Unchecked); - } - if(subSubElem.hasAttribute("VALUE")) - { - mUi->filterContrastParam->setValue(subSubElem.attribute("VALUE").toInt()); - } + loadBoolValue(subSubElem, "ENABLED", mUi->filterBrightContrast); + loadIntValue(subSubElem, "VALUE", mUi->filterContrastParam); } else if(subSubElem.tagName() == "BORDER") { - if(subSubElem.hasAttribute("ENABLED")) - { - mUi->filterBorder->setCheckState(subSubElem.attribute("ENABLED").toInt() ? Qt::Checked : Qt::Unchecked); - } - if(subSubElem.hasAttribute("VALUE")) - { - setValue(mUi->filterBorderParamSize, subSubElem.attribute("VALUE").toInt()); - } + loadBoolValue(subSubElem, "ENABLED", mUi->filterBorder); + loadIntValue(subSubElem, "VALUE", mUi->filterBorderParamSize); // bgColor still needs to be read by control return false; } else if(subSubElem.tagName() == "SWAP") { - if(subSubElem.hasAttribute("ENABLED")) - { - mUi->filterSwap->setCheckState(subSubElem.attribute("ENABLED").toInt() ? Qt::Checked : Qt::Unchecked); - } - if(subSubElem.hasAttribute("HORIZONTALLY")) - { - mUi->filterSwapH->setCheckState(subSubElem.attribute("HORIZONTALLY").toInt() ? Qt::Checked : Qt::Unchecked); - } - if(subSubElem.hasAttribute("VERTICALLY")) - { - mUi->filterSwapV->setCheckState(subSubElem.attribute("VERTICALLY").toInt() ? Qt::Checked : Qt::Unchecked); - } + loadBoolValue(subSubElem, "ENABLED", mUi->filterSwap); + loadBoolValue(subSubElem, "HORIZONTALLY", mUi->filterSwapH); + loadBoolValue(subSubElem, "VERTICALLY", mUi->filterSwapV); } else if(subSubElem.tagName() == "BG_SUB") { - if(subSubElem.hasAttribute("ENABLED")) - { - mUi->filterBg->setCheckState(subSubElem.attribute("ENABLED").toInt() ? Qt::Checked : Qt::Unchecked); - } - if(subSubElem.hasAttribute("UPDATE")) - { - mUi->filterBgUpdate->setCheckState(subSubElem.attribute("UPDATE").toInt() ? Qt::Checked : Qt::Unchecked); - } - if(subSubElem.hasAttribute("SHOW")) - { - mUi->filterBgShow->setCheckState(subSubElem.attribute("SHOW").toInt() ? Qt::Checked : Qt::Unchecked); - } - if(subSubElem.hasAttribute("DELETE")) - { - mUi->filterBgDeleteTrj->setCheckState(subSubElem.attribute("DELETE").toInt() ? Qt::Checked : Qt::Unchecked); - } - if(subSubElem.hasAttribute("DELETE_NUMBER")) - { - mUi->filterBgDeleteNumber->setValue(subSubElem.attribute("DELETE_NUMBER").toInt()); - } + loadBoolValue(subSubElem, "ENABLED", mUi->filterBg); + loadBoolValue(subSubElem, "UPDATE", mUi->filterBgUpdate, false); + loadBoolValue(subSubElem, "SHOW", mUi->filterBgShow, false); + loadBoolValue(subSubElem, "DELETE", mUi->filterBgDeleteTrj, true); + loadIntValue(subSubElem, "DELETE_NUMBER", mUi->filterBgDeleteNumber, 3); // control still needs to read file return false; } diff --git a/src/ui/main-windows/intrinsicBox.cpp b/src/ui/main-windows/intrinsicBox.cpp index 1674042a0..a2cbb3ba5 100644 --- a/src/ui/main-windows/intrinsicBox.cpp +++ b/src/ui/main-windows/intrinsicBox.cpp @@ -22,6 +22,7 @@ #include "calibFilter.h" #include "extrinsicBox.h" #include "helper.h" +#include "importHelper.h" #include "pGroupBox.h" #include "pMessageBox.h" #include "ui_intrinsicBox.h" @@ -137,88 +138,27 @@ void IntrinsicBox::imageSizeChanged(int width, int height, int borderDiff) IntrinsicCameraParams IntrinsicBox::getXmlParams(const QDomElement &elem) { IntrinsicCameraParams params; - if(elem.hasAttribute("FX")) - { - params.setFx(elem.attribute("FX").toDouble()); - } - if(elem.hasAttribute("FY")) - { - params.setFy(elem.attribute("FY").toDouble()); - } - if(elem.hasAttribute("CX")) - { - params.setCx(elem.attribute("CX").toDouble()); - } - if(elem.hasAttribute("CY")) - { - params.setCy(elem.attribute("CY").toDouble()); - } - if(elem.hasAttribute("R2")) - { - params.setR2(elem.attribute("R2").toDouble()); - } - if(elem.hasAttribute("R4")) - { - params.setR4(elem.attribute("R4").toDouble()); - } - if(elem.hasAttribute("R6")) - { - params.setR6(elem.attribute("R6").toDouble()); - } - if(elem.hasAttribute("TX")) - { - params.setTx(elem.attribute("TX").toDouble()); - } - if(elem.hasAttribute("TY")) - { - params.setTy(elem.attribute("TY").toDouble()); - } - if(elem.hasAttribute("K4")) - { - params.setK4(elem.attribute("K4").toDouble()); - } - if(elem.hasAttribute("K5")) - { - params.setK5(elem.attribute("K5").toDouble()); - } - if(elem.hasAttribute("K6")) - { - params.setK6(elem.attribute("K6").toDouble()); - } - if(elem.hasAttribute("S1")) - { - params.setS1(elem.attribute("S1").toDouble()); - } - if(elem.hasAttribute("S2")) - { - params.setS2(elem.attribute("S2").toDouble()); - } - if(elem.hasAttribute("S3")) - { - params.setS3(elem.attribute("S3").toDouble()); - } - if(elem.hasAttribute("S4")) - { - params.setS4(elem.attribute("S4").toDouble()); - } - if(elem.hasAttribute("TAUX")) - { - params.setTaux(elem.attribute("TAUX").toDouble()); - } - if(elem.hasAttribute("TAUY")) - { - params.setTauy(elem.attribute("TAUY").toDouble()); - } - if(elem.hasAttribute("ReprError")) - { - bool conversionSuccessful; - params.reprojectionError = elem.attribute("ReprError").toDouble(&conversionSuccessful); - if(!conversionSuccessful) - { - // Qt sets to inf instead of nan - params.reprojectionError = std::numeric_limits<double>::quiet_NaN(); - } - } + + params.setFx(readDouble(elem, "FX", 881)); + params.setFy(readDouble(elem, "FY", 881)); + params.setCx(readDouble(elem, "CX", 551.5)); + params.setCy(readDouble(elem, "CY", 383.5)); + params.setR2(readDouble(elem, "R2", 0)); + params.setR4(readDouble(elem, "R4", 0)); + params.setR6(readDouble(elem, "R6", 0)); + params.setTx(readDouble(elem, "TX", 0)); + params.setTy(readDouble(elem, "TY", 0)); + params.setK4(readDouble(elem, "K4", 0)); + params.setK5(readDouble(elem, "K5", 0)); + params.setK6(readDouble(elem, "K6", 0)); + params.setS1(readDouble(elem, "S1", 0)); + params.setS2(readDouble(elem, "S2", 0)); + params.setS3(readDouble(elem, "S3", 0)); + params.setS4(readDouble(elem, "S4", 0)); + params.setTaux(readDouble(elem, "TAUX", 0)); + params.setTauy(readDouble(elem, "TAUY", 0)); + params.reprojectionError = readDouble(elem, "ReprError", std::numeric_limits<double>::quiet_NaN()); + return params; } @@ -256,32 +196,23 @@ bool IntrinsicBox::getXml(QDomElement &subSubElem) { if(subSubElem.tagName() == "PATTERN") { - if(subSubElem.hasAttribute("BOARD_SIZE_X")) - { - mUi->boardSizeX->setValue(subSubElem.attribute("BOARD_SIZE_X").toInt()); - } - if(subSubElem.hasAttribute("BOARD_SIZE_Y")) - { - mUi->boardSizeY->setValue(subSubElem.attribute("BOARD_SIZE_Y").toInt()); - } - if(subSubElem.hasAttribute("SQUARE_SIZE")) - { - mUi->squareSize->setValue(subSubElem.attribute("SQUARE_SIZE").toDouble()); - } + loadIntValue(subSubElem, "BOARD_SIZE_X", mUi->boardSizeX, 6); + loadIntValue(subSubElem, "BOARD_SIZE_Y", mUi->boardSizeY, 8); + loadDoubleValue(subSubElem, "SQUARE_SIZE", mUi->squareSize, 4.6); } else if(subSubElem.tagName() == "INTRINSIC_PARAMETERS") { - loadValue(subSubElem, "ENABLED", mUi->apply); + loadBoolValue(subSubElem, "ENABLED", mUi->apply, false); // signals are supposed to change model values; but since we read them in // from a valid file, no changes are neccessary -> can safely block signals - loadValue(subSubElem, "QUAD_ASPECT_RATIO", mUi->quadAspectRatio); - loadValue(subSubElem, "FIX_CENTER", mUi->fixCenter); - loadValue(subSubElem, "TANG_DIST", mUi->tangDist); + loadBoolValue(subSubElem, "QUAD_ASPECT_RATIO", mUi->quadAspectRatio, false); + loadBoolValue(subSubElem, "FIX_CENTER", mUi->fixCenter, false); + loadBoolValue(subSubElem, "TANG_DIST", mUi->tangDist, false); if(subSubElem.elementsByTagName("OLD_MODEL").isEmpty()) { // old file with only one model - if(subSubElem.hasAttribute("EXT_MODEL_ENABLED") && subSubElem.attribute("EXT_MODEL_ENABLED").toInt()) + if(subSubElem.hasAttribute("EXT_MODEL_ENABLED") && readBool(subSubElem, "EXT_MODEL_ENABLED")) { mModelsParams.extModelParams = getXmlParams(subSubElem); mModelsParams.oldModelParams = IntrinsicCameraParams{}; @@ -301,7 +232,7 @@ bool IntrinsicBox::getXml(QDomElement &subSubElem) checkModelParams(mModelsParams.oldModelParams); checkModelParams(mModelsParams.extModelParams); - loadValue(subSubElem, "EXT_MODEL_ENABLED", mUi->extModelCheckBox); + loadBoolValue(subSubElem, "EXT_MODEL_ENABLED", mUi->extModelCheckBox, false); loadCalibFiles(subSubElem); @@ -351,7 +282,7 @@ bool IntrinsicBox::getXml(QDomElement &subSubElem) auto *parent = dynamic_cast<PGroupBox *>(this->parent()->parent()); if(parent) { - parent->setImmutable(subSubElem.attribute("IMMUTABLE").toInt()); + parent->setImmutable(readBool(subSubElem, "IMMUTABLE", false)); } } } diff --git a/src/ui/visualization/moCapController.cpp b/src/ui/visualization/moCapController.cpp index 2fd6f227a..571a01396 100644 --- a/src/ui/visualization/moCapController.cpp +++ b/src/ui/visualization/moCapController.cpp @@ -19,7 +19,7 @@ #include "moCapController.h" #include "IO.h" -#include "helper.h" +#include "importHelper.h" #include "logger.h" #include "moCapPerson.h" @@ -317,20 +317,10 @@ void MoCapController::setXml(QDomElement &elem) void MoCapController::getXml(const QDomElement &elem) { // NOTE: Maybe only load the c3d-files once show is activated - if(elem.hasAttribute("SHOW")) - { - bool isVisible = elem.attribute("SHOW").toInt(); - setShowMoCap(isVisible); - } - if(elem.hasAttribute("COLOR")) - { - QColor color(elem.attribute("COLOR")); - setColor(color); - } - if(elem.hasAttribute("SIZE")) - { - setThickness(elem.attribute("SIZE").toInt()); - } + + setShowMoCap(readBool(elem, "SHOW")); + setColor(readQString(elem, "COLOR")); + setThickness(readInt(elem, "SIZE")); std::vector<MoCapPersonMetadata> savedMetadata; try @@ -340,96 +330,43 @@ void MoCapController::getXml(const QDomElement &elem) if(subElem.tagName() == "PERSON") { MoCapPersonMetadata metadata; - bool ok; QString path; - if(subElem.hasAttribute("FILE") && subElem.hasAttribute("SYSTEM")) + path = readQString(subElem, "FILE"); + const QString file = getExistingFile(path); + path = path.split(";").size() == 2 ? path.split(";").at(1) : + "Saved path is invalid" + ""; + int system = readInt(subElem, "SYSTEM"); + if(system < 0 || system >= MoCapSystem::END) { - path = subElem.attribute("FILE"); - const QString file = getExistingFile(path); - path = path.split(";").size() == 2 ? path.split(";").at(1) : - "Saved path is invalid" - ""; - int system = subElem.attribute("SYSTEM").toInt(&ok); - - if(!ok) - { - std::stringstream ss; - ss << "Element SYSTEM of " << path << " does not contain a valid integer!"; - throw std::invalid_argument(ss.str()); - } - if(system < 0 || system >= MoCapSystem::END) - { - std::stringstream ss; - ss << "System index " << system << " of file " << path - << " is not associated with an implemented MoCap system."; - throw std::invalid_argument(ss.str()); - } - - metadata.setFilepath(file.toStdString(), static_cast<MoCapSystem>(system)); + throw std::invalid_argument( + QString("System index %1 of file %2 is not associated with an implemented MoCap system.") + .arg(system) + .arg(path) + .toStdString()); } - if(subElem.hasAttribute("TIME_OFFSET")) - { - metadata.setUserTimeOffset(subElem.attribute("TIME_OFFSET").toDouble(&ok)); - std::stringstream ss; - ss << "Element TIME_OFFSET of file " << path << " does not contain a valid floating-point number!"; - if(!ok) - { - throw std::invalid_argument(ss.str()); - } - } - if(subElem.hasAttribute("SAMPLE_RATE")) - { - metadata.setSamplerate(subElem.attribute("SAMPLE_RATE").toInt(&ok)); - std::stringstream ss; - ss << "Element SAMPLE_RATE of file " << path << " does not contain a valid integer!"; - if(!ok) - { - throw std::invalid_argument(ss.str()); - } - } - if(subElem.hasAttribute("VISIBLE")) - { - metadata.setVisible(subElem.attribute("VISIBLE").toInt(&ok)); - std::stringstream ss; - ss << "Element VISIBLE of file " << path - << " does not contain a valid value integer (should be 0 or 1)!"; - if(!ok) - { - throw std::invalid_argument(ss.str()); - } - } - if(subElem.hasAttribute("ANGLE")) - { - double angle = subElem.attribute("ANGLE").toDouble(&ok); - std::stringstream ss; - ss << "Element ANGLE of file " << path - << " does not contain a valid angle (should be between -360 and 360)!"; - if(!ok || abs(angle) > 360) - { - throw std::invalid_argument(ss.str()); - } - metadata.setAngle(angle); - } - if(subElem.hasAttribute("TRANS_X") && subElem.hasAttribute("TRANS_Y") && - subElem.hasAttribute("TRANS_Z")) + metadata.setFilepath(file.toStdString(), static_cast<MoCapSystem>(system)); + metadata.setUserTimeOffset(readDouble(subElem, "TIME_OFFSET", 0)); + metadata.setSamplerate(readInt(subElem, "SAMPLE_RATE")); + metadata.setVisible(readBool(subElem, "VISIBLE", false)); + + + double angle = readDouble(subElem, "ANGLE", 0); + if(abs(angle) > 360) { - bool allOk = true; - double transX = subElem.attribute("TRANS_X").toDouble(&ok); - allOk &= ok; - double transY = subElem.attribute("TRANS_Y").toDouble(&ok); - allOk &= ok; - double transZ = subElem.attribute("TRANS_Z").toDouble(&ok); - allOk &= ok; - - std::stringstream ss; - ss << "Element TRANS of file " << path << " does not contain a valid translation!"; - if(!allOk) - { - throw std::invalid_argument(ss.str()); - } - metadata.setTranslation( - cv::Affine3f(cv::Mat::eye(3, 3, CV_32F), cv::Vec3f(transX, transY, transZ))); + throw std::invalid_argument( + QString( + "Element ANGLE of file %1 does not contain a valid angle (should be between -360 and 360)!") + .arg(path) + .toStdString()); } + metadata.setAngle(angle); + + double transX = readDouble(subElem, "TRANS_X", 0); + double transY = readDouble(subElem, "TRANS_Y", 0); + double transZ = readDouble(subElem, "TRANS_Z", 0); + metadata.setTranslation(cv::Affine3f(cv::Mat::eye(3, 3, CV_32F), cv::Vec3f(transX, transY, transZ))); + savedMetadata.push_back(metadata); } } diff --git a/src/util/CMakeLists.txt b/src/util/CMakeLists.txt index fc9829bfa..3ce07e544 100644 --- a/src/util/CMakeLists.txt +++ b/src/util/CMakeLists.txt @@ -7,5 +7,7 @@ target_sources(petrack_core PRIVATE helper.h logger.h vector.cpp - vector.h + vector.h + importHelper.h + importHelper.cpp ) diff --git a/src/util/helper.cpp b/src/util/helper.cpp index a4bd14ae2..2388da1bb 100644 --- a/src/util/helper.cpp +++ b/src/util/helper.cpp @@ -20,7 +20,6 @@ #include "logger.h" -#include <QCheckBox> #include <algorithm> #include <opencv2/opencv.hpp> @@ -255,32 +254,3 @@ bool newerThanVersion(const QString &q1, const QString &q2) } return false; } - - -void loadValueBlocked(const QDomElement &elem, const QString &name, QCheckBox *widget) -{ - if(elem.hasAttribute(name)) - { - QSignalBlocker blocker(widget); - setValue(widget, bool(elem.attribute(name).toInt())); - } -} - -void setValue(QCheckBox *widget, bool value) -{ - widget->setChecked(value); -} - -void setValueBlocked(QCheckBox *widget, bool value) -{ - QSignalBlocker blocker(widget); - widget->setChecked(value); -} - -void loadValue(const QDomElement &elem, const QString &name, QCheckBox *widget) -{ - if(elem.hasAttribute(name)) - { - setValue(widget, bool(elem.attribute(name).toInt())); - } -} diff --git a/src/util/helper.h b/src/util/helper.h index e8559bf95..86ba4725e 100644 --- a/src/util/helper.h +++ b/src/util/helper.h @@ -25,8 +25,6 @@ #include <opencv2/core/types.hpp> #include <opencv2/opencv.hpp> -class QCheckBox; - extern const QString commandLineOptionsString; extern QString proFileName; ///< Path to the project (.pet) file; defined in helper.cpp @@ -293,73 +291,5 @@ T computeMedian(std::vector<T> data) return 0.5 * (data[data.size() / 2] + data[(data.size() - 1) / 2]); } -#include <QDomElement> - -template <typename T> -void setValue(T widget, double value) -{ - if(widget->minimum() > value || widget->maximum() < value) - { - std::stringstream ss; - ss << "Value " << value << " for " << widget->objectName().toStdString() << " is out of range from " - << widget->minimum() << " to " << widget->maximum(); - throw std::domain_error(ss.str()); - } - widget->setValue(value); -} - -void setValue(QCheckBox *widget, bool value); - -template <typename T> -void loadValue(const QDomElement &elem, const QString &name, T widget) -{ - if(elem.hasAttribute(name)) - { - setValue(widget, elem.attribute(name).toDouble()); - } -} - -void loadValue(const QDomElement &elem, const QString &name, QCheckBox *widget); -template <typename T> -void setValueBlocked(T widget, double value) -{ - if(widget->minimum() > value || widget->maximum() < value) - { - std::stringstream ss; - ss << "Value " << value << " for " << widget->objectName().toStdString() << " is out of range from " - << widget->minimum() << " to " << widget->maximum(); - throw std::domain_error(ss.str()); - } - widget->blockSignals(true); - widget->setValue(value); - widget->blockSignals(false); -} - -void setValueBlocked(QCheckBox *widget, bool value); - - -template <typename T> -void loadValueBlocked(const QDomElement &elem, const QString &name, T widget) -{ - if(elem.hasAttribute(name)) - { - QSignalBlocker blocker(widget); - setValue(widget, elem.attribute(name).toDouble()); - } -} - -void loadValueBlocked(const QDomElement &elem, const QString &name, QCheckBox *widget); - -template <typename T> -void checkValueValid(T widget, double value) -{ - if(widget->minimum() > value || widget->maximum() < value) - { - std::stringstream ss; - ss << "Value " << value << " for " << widget->objectName().toStdString() << " is out of range from " - << widget->minimum() << " to " << widget->maximum(); - throw std::domain_error(ss.str()); - } -} #endif diff --git a/src/util/importHelper.cpp b/src/util/importHelper.cpp new file mode 100644 index 000000000..b3f5e0905 --- /dev/null +++ b/src/util/importHelper.cpp @@ -0,0 +1,255 @@ +/* + * PeTrack - Software for tracking pedestrians movement in videos + * Copyright (C) 2024 Forschungszentrum Jülich GmbH, IAS-7 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +#include "importHelper.h" + +#include <QAction> +#include <QCheckBox> +#include <QComboBox> +#include <QGroupBox> +#include <QTabWidget> + +void loadBoolValueBlocked(const QDomElement &elem, const QString &name, QCheckBox *widget) +{ + QSignalBlocker blocker(widget); + setValue(widget, readBool(elem, name)); +} + +void setValue(QCheckBox *widget, bool value) +{ + widget->setChecked(value); +} + +double readDouble(const QDomElement &elem, const QString &name, const double &defaultVal) +{ + if(elem.hasAttribute(name)) + { + bool parsedSuccessfully = false; + double value = elem.attribute(name).toDouble(&parsedSuccessfully); + if(!parsedSuccessfully) + { + throw std::domain_error( + QString("Could not parse parameter %1 successfully. Value: %2, Node: %3. Ill-formed .pet-file.") + .arg(name) + .arg(value) + .arg(elem.tagName()) + .toStdString()); + } + return value; + } + return defaultVal; +} + +double readDouble(const QDomElement &elem, const QString &name) +{ + if(elem.hasAttribute(name)) + { + bool parsedSuccessfully = false; + double value = elem.attribute(name).toDouble(&parsedSuccessfully); + if(!parsedSuccessfully) + { + throw std::domain_error( + QString("Could not parse parameter %1 successfully. Value: %2, Node: %3. Ill-formed .pet-file.") + .arg(name) + .arg(value) + .arg(elem.tagName()) + .toStdString()); + } + return value; + } + throw std::domain_error(QString("Required parameter %1 is missing in the .pet-file.").arg(name).toStdString()); +} + +int readInt(const QDomElement &elem, const QString &name, const int defaultVal) +{ + if(elem.hasAttribute(name)) + { + bool parsedSuccessfully = false; + int value = elem.attribute(name).toInt(&parsedSuccessfully); + if(!parsedSuccessfully) + { + throw std::domain_error( + QString("Could not parse parameter %1 successfully. Value: %2, Node: %3. Ill-formed .pet-file.") + .arg(name) + .arg(value) + .arg(elem.tagName()) + .toStdString()); + } + return value; + } + return defaultVal; +} + +int readInt(const QDomElement &elem, const QString &name) +{ + if(elem.hasAttribute(name)) + { + bool parsedSuccessfully = false; + int value = elem.attribute(name).toInt(&parsedSuccessfully); + if(!parsedSuccessfully) + { + throw std::domain_error( + QString("Could not parse parameter %1 successfully. Value: %2, Node: %3. Ill-formed .pet-file.") + .arg(name) + .arg(value) + .arg(elem.tagName()) + .toStdString()); + } + return value; + } + throw std::domain_error(QString("Required parameter %1 is missing in the .pet-file.").arg(name).toStdString()); +} + +QString readQString(const QDomElement &elem, const QString &name, const QString &defaultVal) +{ + if(elem.hasAttribute(name)) + { + return elem.attribute(name); + } + return defaultVal; +} + +QString readQString(const QDomElement &elem, const QString &name) +{ + if(elem.hasAttribute(name)) + { + return elem.attribute(name); + } + throw std::domain_error(QString("Required parameter %1 is missing in the .pet-file.").arg(name).toStdString()); +} + +bool readBool(const QDomElement &elem, const QString &name, const bool &defaultVal) +{ + if(elem.hasAttribute(name)) + { + bool parsedSuccessfully = false; + int value = elem.attribute(name).toInt(&parsedSuccessfully); + if(!parsedSuccessfully) + { + throw std::domain_error( + QString("Could not parse parameter %1 successfully. Value: %2, Node: %3. Ill-formed .pet-file.") + .arg(name) + .arg(value) + .arg(elem.tagName()) + .toStdString()); + } + // implicitely casting int to bool otherwise returns true for every number except 0 + if(value == 1 || value == Qt::Checked) + { + return true; + } + if(value == 0) + { + return false; + } + throw std::domain_error( + QString("Could not parse parameter %1 successfully. Value: %2, Node: %3. Ill-formed .pet-file.") + .arg(name) + .arg(value) + .arg(elem.tagName()) + .toStdString()); + } + return defaultVal; +} + +bool readBool(const QDomElement &elem, const QString &name) +{ + if(elem.hasAttribute(name)) + { + bool parsedSuccessfully = false; + int value = elem.attribute(name).toInt(&parsedSuccessfully); + if(!parsedSuccessfully) + { + throw std::domain_error( + QString("Could not parse parameter %1 successfully. Value: %2, Node: %3. Ill-formed .pet-file.") + .arg(name) + .arg(value) + .arg(elem.tagName()) + .toStdString()); + } + // implicitely casting int to bool otherwise returns true for every number except 0 + if(value == 1 || value == Qt::Checked) + { + return true; + } + else if(value == 0) + { + return false; + } + else + { + throw std::domain_error( + QString("Could not parse parameter %1 successfully. Value: %2, Node: %3. Ill-formed .pet-file.") + .arg(name) + .arg(value) + .arg(elem.tagName()) + .toStdString()); + } + } + throw std::domain_error(QString("Required parameter %1 is missing in the .pet-file.").arg(name).toStdString()); +} + +void setValueBlocked(QCheckBox *widget, bool value) +{ + QSignalBlocker blocker(widget); + widget->setChecked(value); +} + +void loadValue(const QDomElement &elem, const QString &name, QCheckBox *widget) +{ + setValue(widget, readBool(elem, name)); +} + +void loadActiveIndex(const QDomElement &elem, const QString &name, QComboBox *widget, const int defaultVal) +{ + widget->setCurrentIndex(readInt(elem, name, defaultVal)); +} + +void loadActiveIndex(const QDomElement &elem, const QString &name, QComboBox *widget) +{ + widget->setCurrentIndex(readInt(elem, name)); +} + +void loadActiveIndex(const QDomElement &elem, const QString &name, QTabWidget *widget, const int defaultVal) +{ + widget->setCurrentIndex(readInt(elem, name, defaultVal)); +} + +void loadActiveIndex(const QDomElement &elem, const QString &name, QTabWidget *widget) +{ + widget->setCurrentIndex(readInt(elem, name)); +} + +void loadBoolValue(const QDomElement &elem, const QString &name, QGroupBox *widget, const bool defaultVal) +{ + widget->setChecked(readBool(elem, name, defaultVal)); +} + +void loadBoolValue(const QDomElement &elem, const QString &name, QGroupBox *widget) +{ + widget->setChecked(readBool(elem, name)); +} + +void loadBoolValue(const QDomElement &elem, const QString &name, QAction *widget, const bool defaultVal) +{ + widget->setChecked(readBool(elem, name, defaultVal)); +} +void loadBoolValue(const QDomElement &elem, const QString &name, QAction *widget) +{ + widget->setChecked(readBool(elem, name)); +} \ No newline at end of file diff --git a/src/util/importHelper.h b/src/util/importHelper.h new file mode 100644 index 000000000..2380eda14 --- /dev/null +++ b/src/util/importHelper.h @@ -0,0 +1,162 @@ +/* + * PeTrack - Software for tracking pedestrians movement in videos + * Copyright (C) 2024 Forschungszentrum Jülich GmbH, IAS-7 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +#ifndef IMPORTHELPER_H +#define IMPORTHELPER_H + +#include <QDomElement> +#include <QFileInfo> +#include <sstream> + +class QCheckBox; +class QComboBox; +class QGroupBox; +class QTabWidget; +class QAction; + + +template <typename T> +void setValue(T widget, double value); +void setValue(QCheckBox *widget, bool value); + +double readDouble(const QDomElement &elem, const QString &name, const double &defaultVal); +double readDouble(const QDomElement &elem, const QString &name); +int readInt(const QDomElement &elem, const QString &name, const int defaultVal); +int readInt(const QDomElement &elem, const QString &name); +QString readQString(const QDomElement &elem, const QString &name, const QString &defaultVal); +QString readQString(const QDomElement &elem, const QString &name); +bool readBool(const QDomElement &elem, const QString &name, const bool &defaultVal); +bool readBool(const QDomElement &elem, const QString &name); + +template <typename T> +void loadIntValue(const QDomElement &elem, const QString &name, T widget, const int defaultVal); +template <typename T> +void loadIntValue(const QDomElement &elem, const QString &name, T widget); +template <typename T> +void loadDoubleValue(const QDomElement &elem, const QString &name, T widget, const double defaultVal); +template <typename T> +void loadDoubleValue(const QDomElement &elem, const QString &name, T widget); +template <typename T> +void loadBoolValue(const QDomElement &elem, const QString &name, T widget); +template <typename T> +void loadBoolValue(const QDomElement &elem, const QString &name, T widget); +void loadBoolValue(const QDomElement &elem, const QString &name, QGroupBox *widget, bool defaultVal); +void loadBoolValue(const QDomElement &elem, const QString &name, QGroupBox *widget); +void loadBoolValue(const QDomElement &elem, const QString &name, QAction *widget, bool defaultVal); +void loadBoolValue(const QDomElement &elem, const QString &name, QAction *widget); +void loadActiveIndex(const QDomElement &elem, const QString &name, QComboBox *widget, const int defaultVal); +void loadActiveIndex(const QDomElement &elem, const QString &name, QComboBox *widget); +void loadActiveIndex(const QDomElement &elem, const QString &name, QTabWidget *widget, const int defaultVal); +void loadActiveIndex(const QDomElement &elem, const QString &name, QTabWidget *widget); + +template <typename T> +void setValueBlocked(T widget, double value); +void setValueBlocked(QCheckBox *widget, bool value); + +template <typename T> +void loadDoubleValueBlocked(const QDomElement &elem, const QString &name, T widget); +void loadBoolValueBlocked(const QDomElement &elem, const QString &name, QCheckBox *widget); + +template <typename T> +void checkValueValid(T widget, double value); + + +template <typename T> +inline void setValue(T widget, double value) +{ + if(widget->minimum() > value || widget->maximum() < value) + { + std::stringstream ss; + ss << "Value " << value << " for " << widget->objectName().toStdString() << " is out of range from " + << widget->minimum() << " to " << widget->maximum(); + throw std::domain_error(ss.str()); + } + widget->setValue(value); +} + +template <typename T> +void loadIntValue(const QDomElement &elem, const QString &name, T widget, const int defaultVal) +{ + setValue(widget, readInt(elem, name, defaultVal)); +} + +template <typename T> +void loadIntValue(const QDomElement &elem, const QString &name, T widget) +{ + setValue(widget, readInt(elem, name)); +} + +template <typename T> +void loadDoubleValue(const QDomElement &elem, const QString &name, T widget, const double defaultVal) +{ + setValue(widget, readDouble(elem, name, defaultVal)); +} + +template <typename T> +void loadDoubleValue(const QDomElement &elem, const QString &name, T widget) +{ + setValue(widget, readDouble(elem, name)); +} + +template <typename T> +void loadBoolValue(const QDomElement &elem, const QString &name, T widget, bool defaultVal) +{ + setValue(widget, readBool(elem, name, defaultVal)); +} + +template <typename T> +void loadBoolValue(const QDomElement &elem, const QString &name, T widget) +{ + setValue(widget, readBool(elem, name)); +} + +template <typename T> +void setValueBlocked(T widget, double value) +{ + if(widget->minimum() > value || widget->maximum() < value) + { + std::stringstream ss; + ss << "Value " << value << " for " << widget->objectName().toStdString() << " is out of range from " + << widget->minimum() << " to " << widget->maximum(); + throw std::domain_error(ss.str()); + } + widget->blockSignals(true); + widget->setValue(value); + widget->blockSignals(false); +} + +template <typename T> +void loadDoubleValueBlocked(const QDomElement &elem, const QString &name, T widget) +{ + QSignalBlocker blocker(widget); + setValue(widget, readDouble(elem, name)); +} + +template <typename T> +void checkValueValid(T widget, double value) +{ + if(widget->minimum() > value || widget->maximum() < value) + { + std::stringstream ss; + ss << "Value " << value << " for " << widget->objectName().toStdString() << " is out of range from " + << widget->minimum() << " to " << widget->maximum(); + throw std::domain_error(ss.str()); + } +} + +#endif // IMPORTHELPER_H diff --git a/tests/regression_test/data/old_pet_files/2006.pet b/tests/regression_test/data/old_pet_files/2006.pet new file mode 100644 index 000000000..5029f895c --- /dev/null +++ b/tests/regression_test/data/old_pet_files/2006.pet @@ -0,0 +1,47 @@ +<?xml version="1.0" ?> +<!DOCTYPE PETRACK> +<PETRACK VERSION="0.6" > + <MAIN SRC="D:/Petrack/b090.avi" STATUS_HEIGHT="180" /> + <CONTROL TAB="2" > + <CALIBRATION> + <BRIGHTNESS ENABLED="0" VALUE="0" /> + <CONTRAST ENABLED="0" VALUE="0" /> + <BORDER ENABLED="1" VALUE="39" COLOR="#000000" /> + <BG_SUB ENABLED="0" /> + <INTRINSIC_PARAMETERS FX="882.16" FY="882.16" R2="-0.378664" TANG_DIST="1" CALIB_FILES="C:/Dokumente und Einstellungen/Maik Boltes/Eigene Dateien/diss/src/opencv/calibrate/pattern_usb_tamron_cam2/v2/22.png, C:/Dokumente und Einstellungen/Maik Boltes/Eigene Dateien/diss/src/opencv/calibrate/pattern_usb_tamron_cam2/v2/1.png, C:/Dokumente und Einstellungen/Maik Boltes/Eigene Dateien/diss/src/opencv/calibrate/pattern_usb_tamron_cam2/v2/2.png, C:/Dokumente und Einstellungen/Maik Boltes/Eigene Dateien/diss/src/opencv/calibrate/pattern_usb_tamron_cam2/v2/3.png, C:/Dokumente und Einstellungen/Maik Boltes/Eigene Dateien/diss/src/opencv/calibrate/pattern_usb_tamron_cam2/v2/4.png, C:/Dokumente und Einstellungen/Maik Boltes/Eigene Dateien/diss/src/opencv/calibrate/pattern_usb_tamron_cam2/v2/5.png, C:/Dokumente und Einstellungen/Maik Boltes/Eigene Dateien/diss/src/opencv/calibrate/pattern_usb_tamron_cam2/v2/6.png, C:/Dokumente und Einstellungen/Maik Boltes/Eigene Dateien/diss/src/opencv/calibrate/pattern_usb_tamron_cam2/v2/7.png, C:/Dokumente und Einstellungen/Maik Boltes/Eigene Dateien/diss/src/opencv/calibrate/pattern_usb_tamron_cam2/v2/8.png, C:/Dokumente und Einstellungen/Maik Boltes/Eigene Dateien/diss/src/opencv/calibrate/pattern_usb_tamron_cam2/v2/9.png, C:/Dokumente und Einstellungen/Maik Boltes/Eigene Dateien/diss/src/opencv/calibrate/pattern_usb_tamron_cam2/v2/10.png, C:/Dokumente und Einstellungen/Maik Boltes/Eigene Dateien/diss/src/opencv/calibrate/pattern_usb_tamron_cam2/v2/11.png, C:/Dokumente und Einstellungen/Maik Boltes/Eigene Dateien/diss/src/opencv/calibrate/pattern_usb_tamron_cam2/v2/12.png, C:/Dokumente und Einstellungen/Maik Boltes/Eigene Dateien/diss/src/opencv/calibrate/pattern_usb_tamron_cam2/v2/13.png, C:/Dokumente und Einstellungen/Maik Boltes/Eigene Dateien/diss/src/opencv/calibrate/pattern_usb_tamron_cam2/v2/14.png, C:/Dokumente und Einstellungen/Maik Boltes/Eigene Dateien/diss/src/opencv/calibrate/pattern_usb_tamron_cam2/v2/15.png, C:/Dokumente und Einstellungen/Maik Boltes/Eigene Dateien/diss/src/opencv/calibrate/pattern_usb_tamron_cam2/v2/16.png, C:/Dokumente und Einstellungen/Maik Boltes/Eigene Dateien/diss/src/opencv/calibrate/pattern_usb_tamron_cam2/v2/17.png, C:/Dokumente und Einstellungen/Maik Boltes/Eigene Dateien/diss/src/opencv/calibrate/pattern_usb_tamron_cam2/v2/18.png, C:/Dokumente und Einstellungen/Maik Boltes/Eigene Dateien/diss/src/opencv/calibrate/pattern_usb_tamron_cam2/v2/19.png, C:/Dokumente und Einstellungen/Maik Boltes/Eigene Dateien/diss/src/opencv/calibrate/pattern_usb_tamron_cam2/v2/20.png, C:/Dokumente und Einstellungen/Maik Boltes/Eigene Dateien/diss/src/opencv/calibrate/pattern_usb_tamron_cam2/v2/21.png" CX="589.5" R4="0.158617" TX="-0.000241" CY="461.5" TY="0.000312" ENABLED="1" FIX_CENTER="1" QUAD_ASPECT_RATIO="1" /> + <EXTRINSIC_PARAMETERS FIX="1" ALTITUDE="537" UNIT="46" USE_INTRINSIC_CENTER="0" SCALE="767" TILT_X="4000" TILT_Y="4000" TRANS_X="5179" TRANS_Y="2170" SHOW="0" ROTATE="27" /> + <ALIGNMENT_GRID FIX="1" SCALE="768" TRANS_X="245" TRANS_Y="657" SHOW="0" ROTATE="27" /> + </CALIBRATION> + <RECOGNITION> + <PERFORM ENABLED="0" STEP="5" /> + <REGION_OF_INTEREST FIX="1" WIDTH="1008.917665008991" X="9.940092883276023" Y="82.80615101111441" HEIGHT="583.3232280366677" SHOW="1" /> + <MARKER BRIGHTNESS="50" IGNORE_WITHOUT="1" /> + <SIZE_COLOR SYMBOL_SIZE="9" AUTO_WB="0" X="0" Y="1" MODEL="0" Z="255" GREY_LEVEL="33" MAP_NUMBER="0" DEFAULT_HEIGHT="180" SHOW="1" > + <MAP WIDTH="11" X="0" Y="58.5" MAP_HEIGHT="205.5" HEIGHT="189" COLORED="1" /> + <MAP WIDTH="33" X="327" Y="58.5" MAP_HEIGHT="200.5" HEIGHT="189" COLORED="1" /> + <MAP WIDTH="32" X="11" Y="58" MAP_HEIGHT="195.5" HEIGHT="190" COLORED="1" /> + <MAP WIDTH="63" X="43" Y="23" MAP_HEIGHT="190.5" HEIGHT="225" COLORED="1" /> + <MAP WIDTH="55" X="106" Y="23" MAP_HEIGHT="185.5" HEIGHT="225" COLORED="1" /> + <MAP WIDTH="36" X="161" Y="23" MAP_HEIGHT="180.5" HEIGHT="225" COLORED="1" /> + <MAP WIDTH="40" X="197" Y="23" MAP_HEIGHT="175.5" HEIGHT="225" COLORED="1" /> + <MAP WIDTH="29" X="213" Y="75" MAP_HEIGHT="170.5" HEIGHT="83" COLORED="0" /> + <MAP WIDTH="57" X="185" Y="23" MAP_HEIGHT="165.5" HEIGHT="63" COLORED="0" /> + </SIZE_COLOR> + </RECOGNITION> + <TRACKING> + <ONLINE_CALCULATION ENABLED="0" /> + <REPEAT_BELOW QUALITY="50" ENABLED="0" /> + <SEARCH_MISSING_FRAMES ENABLED="1" /> + <TRACK_FILE FILENAME="D:/Petrack/Matthias/b090MM.trc" /> + <SEARCH_REGION LEVELS="3" SCALE="16" SHOW="0" /> + <PATH SHOW="1" NUMBER_SIZE="14" ONLY_PEOPLE="0" SHOW_CURRENT_POINT="1" AFTER="10" FIX="0" PATH_SIZE="3" ONLY_VISIBLE="0" COLOR_MARKER_SIZE="14" SHOW_COLLECTIVE_COLOR="1" NUMBER_BOLD="1" CURRENT_POINT_SIZE="60" ONLY_PEOPLE_NR="1" POINTS_COLORED="1" SHOW_POINTS="0" BEFORE="10" SHOW_COLOR_MARKER="1" SHOW_PATH="1" HEAD_SIZE="1" COLLECTIVE_COLOR_SIZE="11" SHOW_NUMBER="1" POINTS_SIZE="7" /> + </TRACKING> + <ANALYSIS> + <SEARCH_MISSING_FRAMES ENABLED="1" /> + <MARK_ACTUAL ENABLED="0" /> + <CALCULATION STEP_SIZE="25" CONSIDER_X="0" ABSOLUTE="0" CONSIDER_Y="1" REVERSE="0" /> + </ANALYSIS> + </CONTROL> + <PLAYER FRAME="0" /> + <VIEW SAVE_TRANSFORMED="0" TRANSFORMATION="249 0 0 -77" ANTIALIAS="0" OPENGL="0" /> +</PETRACK> diff --git a/tests/regression_test/data/old_pet_files/2008.pet b/tests/regression_test/data/old_pet_files/2008.pet new file mode 100644 index 000000000..7006bbac5 --- /dev/null +++ b/tests/regression_test/data/old_pet_files/2008.pet @@ -0,0 +1,39 @@ +<?xml version="1.0" ?> +<!DOCTYPE PETRACK> +<PETRACK VERSION="0.6" > + <MAIN SRC="H:/labor08/versuchsreihe1/dv/34_95qual.avi" STATUS_HEIGHT="0" /> + <CONTROL TAB="2" > + <CALIBRATION> + <BRIGHTNESS ENABLED="0" VALUE="0" /> + <CONTRAST ENABLED="0" VALUE="0" /> + <BORDER ENABLED="1" VALUE="10" COLOR="#000000" /> + <BG_SUB ENABLED="0" /> + <INTRINSIC_PARAMETERS FX="844.86" FY="867.38" R2="-0.213522" TANG_DIST="1" CALIB_FILES="H:/labor08/pattern/dv/01.bmp, H:/labor08/pattern/dv/18.bmp, H:/labor08/pattern/dv/17.bmp, H:/labor08/pattern/dv/16.bmp, H:/labor08/pattern/dv/15.bmp, H:/labor08/pattern/dv/14.bmp, H:/labor08/pattern/dv/13.bmp, H:/labor08/pattern/dv/12.bmp, H:/labor08/pattern/dv/11.bmp, H:/labor08/pattern/dv/10.bmp, H:/labor08/pattern/dv/09.bmp, H:/labor08/pattern/dv/08.bmp, H:/labor08/pattern/dv/07.bmp, H:/labor08/pattern/dv/06.bmp, H:/labor08/pattern/dv/05.bmp, H:/labor08/pattern/dv/04.bmp, H:/labor08/pattern/dv/03.bmp, H:/labor08/pattern/dv/02.bmp" CX="388.1" R4="0.175628" TX="-0.002302" CY="288.24" TY="-0.002336" ENABLED="1" FIX_CENTER="0" QUAD_ASPECT_RATIO="0" /> + <EXTRINSIC_PARAMETERS FIX="1" ALTITUDE="535" UNIT="200" USE_INTRINSIC_CENTER="0" SCALE="3600" TILT_X="4000" TILT_Y="4000" TRANS_X="1700" TRANS_Y="5030" SHOW="0" ROTATE="0" /> + <ALIGNMENT_GRID FIX="0" SCALE="200" TRANS_X="0" TRANS_Y="0" SHOW="0" ROTATE="0" /> + </CALIBRATION> + <RECOGNITION> + <PERFORM ENABLED="0" STEP="5" /> + <REGION_OF_INTEREST FIX="0" WIDTH="720" X="3.378258500303088" Y="-1.69349062472503" HEIGHT="576" SHOW="1" /> + <MARKER BRIGHTNESS="50" IGNORE_WITHOUT="1" /> + <SIZE_COLOR SYMBOL_SIZE="5" AUTO_WB="0" X="0" Y="1" MODEL="0" Z="255" GREY_LEVEL="50" MAP_NUMBER="0" DEFAULT_HEIGHT="50" SHOW="1" > + <MAP WIDTH="0" X="1" Y="0" MAP_HEIGHT="180" HEIGHT="0" COLORED="1" /> + </SIZE_COLOR> + </RECOGNITION> + <TRACKING> + <ONLINE_CALCULATION ENABLED="0" /> + <REPEAT_BELOW QUALITY="50" ENABLED="0" /> + <SEARCH_MISSING_FRAMES ENABLED="1" /> + <TRACK_FILE FILENAME="H:/labor08/versuchsreihe1/dv/34_trajectories.JL.trc" /> + <SEARCH_REGION LEVELS="3" SCALE="16" SHOW="0" /> + <PATH SHOW="1" NUMBER_SIZE="14" ONLY_PEOPLE="0" SHOW_CURRENT_POINT="1" AFTER="15" FIX="0" PATH_SIZE="2" ONLY_VISIBLE="0" COLOR_MARKER_SIZE="14" SHOW_COLLECTIVE_COLOR="1" NUMBER_BOLD="1" CURRENT_POINT_SIZE="60" ONLY_PEOPLE_NR="1" POINTS_COLORED="1" SHOW_POINTS="0" BEFORE="15" SHOW_COLOR_MARKER="1" SHOW_PATH="1" HEAD_SIZE="0" COLLECTIVE_COLOR_SIZE="11" SHOW_NUMBER="1" POINTS_SIZE="7" /> + </TRACKING> + <ANALYSIS> + <SEARCH_MISSING_FRAMES ENABLED="1" /> + <MARK_ACTUAL ENABLED="0" /> + <CALCULATION STEP_SIZE="25" CONSIDER_X="0" ABSOLUTE="0" CONSIDER_Y="1" REVERSE="0" /> + </ANALYSIS> + </CONTROL> + <PLAYER FRAME="1898" /> + <VIEW SAVE_TRANSFORMED="0" TRANSFORMATION="262 0 0 0" ANTIALIAS="1" OPENGL="0" /> +</PETRACK> diff --git a/tests/regression_test/data/old_pet_files/2009.pet b/tests/regression_test/data/old_pet_files/2009.pet new file mode 100644 index 000000000..963f1a942 --- /dev/null +++ b/tests/regression_test/data/old_pet_files/2009.pet @@ -0,0 +1,58 @@ +<?xml version="1.0" ?> +<!DOCTYPE PETRACK> +<PETRACK VERSION="0.7"> + <MAIN SRC="" STATUS_HEIGHT="176"/> + <CONTROL TAB="2"> + <CALIBRATION> + <BRIGHTNESS ENABLED="0" VALUE="0"/> + <CONTRAST ENABLED="0" VALUE="0"/> + <BORDER ENABLED="0" VALUE="0" COLOR="#000000"/> + <BG_SUB ENABLED="0"/> + <INTRINSIC_PARAMETERS FX="881" FY="881" R2="0" TANG_DIST="1" CALIB_FILES="" CX="590" R4="0" TX="0" CY="430" TY="0" ENABLED="1" FIX_CENTER="0" QUAD_ASPECT_RATIO="0"/> + <EXTRINSIC_PARAMETERS FIX="1" ALTITUDE="1190" UNIT="120" USE_INTRINSIC_CENTER="0" SCALE="938" TILT_X="4000" TILT_Y="4000" TRANS_X="10829" TRANS_Y="4353" SHOW="1" ROTATE="906"/> + <ALIGNMENT_GRID FIX="1" SCALE="1254" TRANS_X="1252" TRANS_Y="2115" SHOW="0" ROTATE="5"/> + </CALIBRATION> + <RECOGNITION> + <PERFORM ENABLED="1" STEP="1"/> + <REGION_OF_INTEREST FIX="1" WIDTH="614.842581257741" X="289.9924112199483" Y="333.6979739895014" HEIGHT="304.8768709170594" SHOW="1"/> + <MARKER BRIGHTNESS="59" IGNORE_WITHOUT="1"/> + <SIZE_COLOR SYMBOL_SIZE="10" AUTO_WB="0" X="0" Y="1" MODEL="0" Z="255" GREY_LEVEL="50" MAP_NUMBER="0" DEFAULT_HEIGHT="176" SHOW="0"> + <MAP WIDTH="0" X="0" Y="0" MAP_HEIGHT="180" HEIGHT="0" COLORED="1"/> + </SIZE_COLOR> + </RECOGNITION> + <TRACKING> + <ONLINE_CALCULATION ENABLED="1"/> + <REPEAT_BELOW QUALITY="50" ENABLED="0"/> + <EXTRAPOLATION ENABLED="1"/> + <MERGE ENABLED="0"/> + <ONLY_VISIBLE ENABLED="1"/> + <SEARCH_MISSING_FRAMES ENABLED="0"/> + <RECALCULATE_MEDIAN_HEIGHT ENABLED="0"/> + <ALLOW_ALTERNATE_HEIGHT ENABLED="1"/> + <EXPORT_ELIMINATE_TRACKPOINT_WITHOUT_HEIGHT ENABLED="1"/> + <EXPORT_ELIMINATE_TRAJECTORY_WITHOUT_HEIGHT ENABLED="1"/> + <EXPORT_SMOOTH ENABLED="1"/> + <TEST_EQUAL ENABLED="1"/> + <TEST_VELOCITY ENABLED="1"/> + <TEST_INSIDE ENABLED="1"/> + <TEST_LENGTH ENABLED="1"/> + <TRACK_FILE FILENAME=""/> + <SEARCH_REGION LEVELS="3" SCALE="16" SHOW="0"/> + <PATH SHOW="1" NUMBER_SIZE="14" ONLY_PEOPLE="0" SHOW_CURRENT_POINT="1" AFTER="15" FIX="0" PATH_SIZE="2" ONLY_VISIBLE="0" COLOR_MARKER_SIZE="14" SHOW_COLLECTIVE_COLOR="0" NUMBER_BOLD="1" CURRENT_POINT_SIZE="34" ONLY_PEOPLE_NR="1" POINTS_COLORED="1" SHOW_POINTS="0" BEFORE="15" SHOW_COLOR_MARKER="0" SHOW_PATH="1" HEAD_SIZE="1" COLLECTIVE_COLOR_SIZE="11" SHOW_NUMBER="0" POINTS_SIZE="7"/> + </TRACKING> + <ANALYSIS> + <SEARCH_MISSING_FRAMES ENABLED="0"/> + <MARK_ACTUAL ENABLED="0"/> + <CALCULATION STEP_SIZE="25" CONSIDER_X="1" ABSOLUTE="0" CONSIDER_Y="1" REVERSE="0"/> + </ANALYSIS> + </CONTROL> + <STEREO> + <DISPARITY OPACITY="50" HIDE_INVALID="1" SHOW="0" COLOR="0"> + <VALUES MIN="18" MAX="56"/> + <MASK USE_EDGE="1" SIZE="9" EDGE_SIZE="3"/> + <USE CALIB_CENTER="1" HEIGHT_EVER="1" EXPORT="0" HEIGHT="1" RECO="0"/> + </DISPARITY> + </STEREO> + <PLAYER FRAME="0"/> + <VIEW SAVE_TRANSFORMED="0" TRANSFORMATION="249 0 0 0" CAMERA="1" ANTIALIAS="0" OPENGL="0"/> +</PETRACK> diff --git a/tests/regression_test/data/old_pet_files/2012.pet b/tests/regression_test/data/old_pet_files/2012.pet new file mode 100644 index 000000000..1dd86a272 --- /dev/null +++ b/tests/regression_test/data/old_pet_files/2012.pet @@ -0,0 +1,65 @@ +<?xml version="1.0" ?> +<!DOCTYPE PETRACK> +<PETRACK VERSION="0.7"> + <MAIN SRC="/home/zam/salden/Masterstudium/Masterarbeit/Fahrrad_Experiment/Fahrrad_Experiment_new.jpg;home/zam/salden/Masterstudium/Masterarbeit/Fahrrad_Experiment/Fahrrad_Experiment_new.jpg" STATUS_HEIGHT="0"/> + <CONTROL TAB="0"> + <CALIBRATION> + <BRIGHTNESS ENABLED="0" VALUE="0"/> + <CONTRAST ENABLED="0" VALUE="0"/> + <BORDER ENABLED="0" VALUE="0" COLOR="#000000"/> + <SWAP VERTICALLY="0" ENABLED="0" HORIZONTALLY="0"/> + <BG_SUB ENABLED="0" UPDATE="0" FILE="" SHOW="0"/> + <INTRINSIC_PARAMETERS FX="1416" FY="1417" R2="0" TANG_DIST="1" CALIB_FILES="/home/salden/Entwicklung/PeopleCount/petrack-build-desktop" CX="959.5" R4="0" TX="0" CY="539.5" TY="0" ENABLED="0" FIX_CENTER="1" QUAD_ASPECT_RATIO="0"/> + <EXTRINSIC_PARAMETERS FIX="0" ALTITUDE="535" UNIT="100" USE_INTRINSIC_CENTER="0" SCALE="2116" TILT_X="4000" TILT_Y="4000" TRANS_X="0" TRANS_Y="0" SHOW="1" ROTATE="0"/> + <ALIGNMENT_GRID FIX="0" SCALE="100" TRANS_X="1000" TRANS_Y="1000" SHOW="1" ROTATE="0"/> + </CALIBRATION> + <RECOGNITION> + <PERFORM METHOD="1" ENABLED="1" STEP="5"/> + <REGION_OF_INTEREST FIX="0" WIDTH="1920" X="0" Y="0" HEIGHT="1080" SHOW="0"/> + <MARKER BRIGHTNESS="50" IGNORE_WITHOUT="1"/> + <SIZE_COLOR SYMBOL_SIZE="10" AUTO_WB="0" X="0" Y="1" MODEL="0" Z="255" GREY_LEVEL="50" MAP_NUMBER="0" DEFAULT_HEIGHT="180" SHOW="1"> + <MAP WIDTH="0" X="0" Y="0" MAP_HEIGHT="180" HEIGHT="0" COLORED="1"/> + </SIZE_COLOR> + </RECOGNITION> + <TRACKING> + <ONLINE_CALCULATION ENABLED="1"/> + <REPEAT_BELOW QUALITY="50" ENABLED="1"/> + <EXTRAPOLATION ENABLED="1"/> + <MERGE ENABLED="0"/> + <ONLY_VISIBLE ENABLED="1"/> + <SEARCH_MISSING_FRAMES ENABLED="1"/> + <RECALCULATE_MEDIAN_HEIGHT ENABLED="1"/> + <ALLOW_ALTERNATE_HEIGHT ENABLED="0"/> + <EXPORT_ELIMINATE_TRACKPOINT_WITHOUT_HEIGHT ENABLED="0"/> + <EXPORT_ELIMINATE_TRAJECTORY_WITHOUT_HEIGHT ENABLED="0"/> + <EXPORT_SMOOTH ENABLED="1"/> + <TEST_EQUAL ENABLED="1"/> + <TEST_VELOCITY ENABLED="1"/> + <TEST_INSIDE ENABLED="1"/> + <TEST_LENGTH ENABLED="1"/> + <TRACK_FILE FILENAME=""/> + <SEARCH_REGION LEVELS="3" SCALE="16" SHOW="0"/> + <PATH SHOW="1" NUMBER_SIZE="14" ONLY_PEOPLE="0" SHOW_CURRENT_POINT="1" AFTER="15" FIX="0" PATH_SIZE="2" ONLY_VISIBLE="0" COLOR_MARKER_SIZE="14" SHOW_COLLECTIVE_COLOR="1" NUMBER_BOLD="1" CURRENT_POINT_SIZE="60" ONLY_PEOPLE_NR="1" POINTS_COLORED="1" SHOW_POINTS="0" BEFORE="15" SHOW_COLOR_MARKER="1" SHOW_PATH="1" HEAD_SIZE="1" COLLECTIVE_COLOR_SIZE="11" SHOW_NUMBER="1" POINTS_SIZE="7"/> + </TRACKING> + <ANALYSIS> + <SEARCH_MISSING_FRAMES ENABLED="1"/> + <MARK_ACTUAL ENABLED="0"/> + <CALCULATION STEP_SIZE="25" CONSIDER_X="0" ABSOLUTE="0" CONSIDER_Y="1" REVERSE="0"/> + </ANALYSIS> + </CONTROL> + <STEREO> + <DISPARITY OPACITY="100" ALGO="0" HIDE_INVALID="1" SHOW="0" COLOR="0"> + <VALUES MIN="0" MAX="100"/> + <MASK USE_EDGE="0" SIZE="7" EDGE_SIZE="5"/> + <USE CALIB_CENTER="1" HEIGHT_EVER="1" EXPORT="0" HEIGHT="0" RECO="0"/> + </DISPARITY> + </STEREO> + <COLOR_MARKER> + <MASK OPACITY="100" SHOW="0" MASK="1"/> + <FROM_COLOR HUE="0" SATURATION="0" VALUE="128"/> + <TO_COLOR HUE="359" SATURATION="255" VALUE="255"/> + <PARAM CLOSE_RADIUS="2" INVERS_HUE="0" CLOSE_USED="1" MAX_AREA="5000" MIN_AREA="1000" OPEN_USED="1" MAX_RATIO="2" OPEN_RADIUS="5"/> + </COLOR_MARKER> + <PLAYER FRAME="0"/> + <VIEW SAVE_TRANSFORMED="0" TRANSFORMATION="181 0 0 0" CAMERA="2" ANTIALIAS="0" OPENGL="0"/> +</PETRACK> diff --git a/tests/regression_test/data/old_pet_files/2013.pet b/tests/regression_test/data/old_pet_files/2013.pet new file mode 100644 index 000000000..bd6c21884 --- /dev/null +++ b/tests/regression_test/data/old_pet_files/2013.pet @@ -0,0 +1,65 @@ +<?xml version="1.0" ?> +<!DOCTYPE PETRACK> +<PETRACK VERSION="0.7"> + <MAIN SRC="D:/diss/vortraege/2013.01.28_Japan_Versuche/cam1/00049000.jpg;00049000.jpg" STATUS_HEIGHT="0"/> + <CONTROL TAB="0"> + <CALIBRATION> + <BRIGHTNESS ENABLED="0" VALUE="0"/> + <CONTRAST ENABLED="0" VALUE="0"/> + <BORDER ENABLED="1" VALUE="40" COLOR="#000000"/> + <SWAP VERTICALLY="0" ENABLED="0" HORIZONTALLY="0"/> + <BG_SUB ENABLED="0" UPDATE="0" FILE="" SHOW="0"/> + <INTRINSIC_PARAMETERS FX="1653.49" FY="1673.56" R2="0.000681" TANG_DIST="1" CALIB_FILES="D:\diss\vortraege\2013.01.28_Japan_Versuche\cam\00049000.jpg, D:\diss\vortraege\2013.01.28_Japan_Versuche\cam\00049034.jpg, D:\diss\vortraege\2013.01.28_Japan_Versuche\cam\00049056.jpg, D:\diss\vortraege\2013.01.28_Japan_Versuche\cam\00049074.jpg, D:\diss\vortraege\2013.01.28_Japan_Versuche\cam\00049108.jpg, D:\diss\vortraege\2013.01.28_Japan_Versuche\cam\00049200.jpg, D:\diss\vortraege\2013.01.28_Japan_Versuche\cam\00049225.jpg, D:\diss\vortraege\2013.01.28_Japan_Versuche\cam\00049243.jpg, D:\diss\vortraege\2013.01.28_Japan_Versuche\cam\00049258.jpg, D:\diss\vortraege\2013.01.28_Japan_Versuche\cam\00049282.jpg" CX="1045.31" R4="-0.227154" TX="0.004273" CY="670" TY="0.000448" ENABLED="1" FIX_CENTER="0" QUAD_ASPECT_RATIO="0"/> + <EXTRINSIC_PARAMETERS FIX="0" ALTITUDE="535" UNIT="100" USE_INTRINSIC_CENTER="0" SCALE="1000" TILT_X="4000" TILT_Y="4000" TRANS_X="4000" TRANS_Y="4000" SHOW="0" ROTATE="0"/> + <ALIGNMENT_GRID FIX="0" SCALE="200" TRANS_X="0" TRANS_Y="0" SHOW="0" ROTATE="0"/> + </CALIBRATION> + <RECOGNITION> + <PERFORM METHOD="1" ENABLED="0" STEP="5"/> + <REGION_OF_INTEREST FIX="0" WIDTH="1920" X="0" Y="0" HEIGHT="1080" SHOW="0"/> + <MARKER BRIGHTNESS="50" IGNORE_WITHOUT="1"/> + <SIZE_COLOR SYMBOL_SIZE="10" AUTO_WB="0" X="0" Y="1" MODEL="0" Z="255" GREY_LEVEL="50" MAP_NUMBER="0" DEFAULT_HEIGHT="180" SHOW="1"> + <MAP WIDTH="0" X="0" Y="0" MAP_HEIGHT="180" HEIGHT="0" COLORED="1"/> + </SIZE_COLOR> + </RECOGNITION> + <TRACKING> + <ONLINE_CALCULATION ENABLED="0"/> + <REPEAT_BELOW QUALITY="50" ENABLED="1"/> + <EXTRAPOLATION ENABLED="1"/> + <MERGE ENABLED="0"/> + <ONLY_VISIBLE ENABLED="1"/> + <SEARCH_MISSING_FRAMES ENABLED="1"/> + <RECALCULATE_MEDIAN_HEIGHT ENABLED="1"/> + <ALLOW_ALTERNATE_HEIGHT ENABLED="0"/> + <EXPORT_ELIMINATE_TRACKPOINT_WITHOUT_HEIGHT ENABLED="0"/> + <EXPORT_ELIMINATE_TRAJECTORY_WITHOUT_HEIGHT ENABLED="0"/> + <EXPORT_SMOOTH ENABLED="1"/> + <TEST_EQUAL ENABLED="1"/> + <TEST_VELOCITY ENABLED="1"/> + <TEST_INSIDE ENABLED="1"/> + <TEST_LENGTH ENABLED="1"/> + <TRACK_FILE FILENAME=""/> + <SEARCH_REGION LEVELS="3" SCALE="16" SHOW="0"/> + <PATH SHOW="1" NUMBER_SIZE="14" ONLY_PEOPLE="0" SHOW_CURRENT_POINT="1" AFTER="15" FIX="0" PATH_SIZE="2" ONLY_VISIBLE="0" COLOR_MARKER_SIZE="14" SHOW_COLLECTIVE_COLOR="1" NUMBER_BOLD="1" CURRENT_POINT_SIZE="60" ONLY_PEOPLE_NR="1" POINTS_COLORED="1" SHOW_POINTS="0" BEFORE="15" SHOW_COLOR_MARKER="1" SHOW_PATH="1" HEAD_SIZE="1" COLLECTIVE_COLOR_SIZE="11" SHOW_NUMBER="1" POINTS_SIZE="7"/> + </TRACKING> + <ANALYSIS> + <SEARCH_MISSING_FRAMES ENABLED="1"/> + <MARK_ACTUAL ENABLED="0"/> + <CALCULATION STEP_SIZE="25" CONSIDER_X="0" ABSOLUTE="0" CONSIDER_Y="1" REVERSE="0"/> + </ANALYSIS> + </CONTROL> + <STEREO> + <DISPARITY OPACITY="100" ALGO="0" HIDE_INVALID="1" SHOW="0" COLOR="0"> + <VALUES MIN="0" MAX="100"/> + <MASK USE_EDGE="0" SIZE="7" EDGE_SIZE="5"/> + <USE CALIB_CENTER="1" HEIGHT_EVER="1" EXPORT="0" HEIGHT="0" RECO="0"/> + </DISPARITY> + </STEREO> + <COLOR_MARKER> + <MASK OPACITY="100" SHOW="0" MASK="1"/> + <FROM_COLOR HUE="0" SATURATION="0" VALUE="0"/> + <TO_COLOR HUE="359" SATURATION="255" VALUE="255"/> + <PARAM CLOSE_RADIUS="2" INVERS_HUE="0" CLOSE_USED="1" MAX_AREA="5000" MIN_AREA="1000" OPEN_USED="1" MAX_RATIO="2" OPEN_RADIUS="5"/> + </COLOR_MARKER> + <PLAYER FRAME="4"/> + <VIEW SAVE_TRANSFORMED="0" TRANSFORMATION="205 0 0 0" CAMERA="2" ANTIALIAS="0" OPENGL="0"/> +</PETRACK> diff --git a/tests/regression_test/data/old_pet_files/2014.pet b/tests/regression_test/data/old_pet_files/2014.pet new file mode 100644 index 000000000..19bd381e9 --- /dev/null +++ b/tests/regression_test/data/old_pet_files/2014.pet @@ -0,0 +1,67 @@ +<?xml version="1.0" ?> +<!DOCTYPE PETRACK> +<PETRACK VERSION="0.8"> + <MAIN SRC="/usr/nfs/fs1/ped/experiments/2014.09.09_Juelich_Rotunde_TestFuerWuppertal/raw/cam5/3D_calib_images/3D_Punkte_Uebersicht.jpg;3D_calib_images/3D_Punkte_Uebersicht.jpg" STATUS_HEIGHT="0"/> + <CONTROL TAB="0"> + <CALIBRATION> + <BRIGHTNESS ENABLED="0" VALUE="0"/> + <CONTRAST ENABLED="0" VALUE="0"/> + <BORDER ENABLED="0" VALUE="60" COLOR="#000000"/> + <SWAP VERTICALLY="0" ENABLED="0" HORIZONTALLY="0"/> + <BG_SUB ENABLED="0" UPDATE="0" FILE="" DELETE="1" SHOW="0" DELETE_NUMBER="3"/> + <PATTERN BOARD_SIZE_X="6" BOARD_SIZE_Y="9" SQUARE_SIZE="3"/> + <INTRINSIC_PARAMETERS FX="1156.59" FY="1149.15" R2="-0.097071" TANG_DIST="1" CALIB_FILES="/usr/nfs/fs1/ped/experiments/2014.09.09_Juelich_Rotunde_TestFuerWuppertal/raw/cam5/calib_images/00000.MTS.Standbild001.jpg, /usr/nfs/fs1/ped/experiments/2014.09.09_Juelich_Rotunde_TestFuerWuppertal/raw/cam5/calib_images/00000.MTS.Standbild002.jpg, /usr/nfs/fs1/ped/experiments/2014.09.09_Juelich_Rotunde_TestFuerWuppertal/raw/cam5/calib_images/00000.MTS.Standbild003.jpg, /usr/nfs/fs1/ped/experiments/2014.09.09_Juelich_Rotunde_TestFuerWuppertal/raw/cam5/calib_images/00000.MTS.Standbild004.jpg, /usr/nfs/fs1/ped/experiments/2014.09.09_Juelich_Rotunde_TestFuerWuppertal/raw/cam5/calib_images/00000.MTS.Standbild005.jpg, /usr/nfs/fs1/ped/experiments/2014.09.09_Juelich_Rotunde_TestFuerWuppertal/raw/cam5/calib_images/00000.MTS.Standbild006.jpg, /usr/nfs/fs1/ped/experiments/2014.09.09_Juelich_Rotunde_TestFuerWuppertal/raw/cam5/calib_images/00000.MTS.Standbild007.jpg, /usr/nfs/fs1/ped/experiments/2014.09.09_Juelich_Rotunde_TestFuerWuppertal/raw/cam5/calib_images/00000.MTS.Standbild008.jpg, /usr/nfs/fs1/ped/experiments/2014.09.09_Juelich_Rotunde_TestFuerWuppertal/raw/cam5/calib_images/00000.MTS.Standbild009.jpg" CX="944.54" R4="0.016589" TX="-0.000412" CY="544.87" TY="-0.003728" ENABLED="1" FIX_CENTER="0" QUAD_ASPECT_RATIO="0"/> + <EXTRINSIC_PARAMETERS SHOW="1" COORD3D_AXIS_LEN="1000" UNIT="100" FIX="0" COORD_DIMENSION="0" ROTATE="0" EXTR_TRANS_1="-191.6842" USE_INTRINSIC_CENTER="0" EXTR_ROT_1="2.66151" EXTR_TRANS_2="173.10289" EXTR_ROT_2="0.37189" EXTR_TRANS_3="-357.29825" EXTR_ROT_3="-0.09617000000000001" COORD3D_SWAP_X="0" COORD3D_TRANS_X="0" COORD3D_SWAP_Y="0" COORD3D_TRANS_Y="0" COORD3D_SWAP_Z="0" COORD3D_TRANS_Z="0" EXTERNAL_CALIB_FILE="/usr/nfs/fs1/ped/experiments/2014.09.09_Juelich_Rotunde_TestFuerWuppertal/raw/cam5/3D_calib_images/3d_calib.3dc;3D_calib_images/3d_calib.3dc" SHOW_CALIB_POINTS="1" SCALE="1" TRANS_X="0" ALTITUDE="535" TRANS_Y="0"/> + <ALIGNMENT_GRID FIX="0" GRID3D_TRANS_X="0" GRID3D_TRANS_Y="0" GRID3D_RESOLUTION="60" GRID3D_TRANS_Z="0" SCALE="1" TRANS_X="0" TRANS_Y="0" GRID_DIMENSION="0" SHOW="1" ROTATE="0"/> + </CALIBRATION> + <RECOGNITION> + <PERFORM METHOD="1" ENABLED="0" STEP="5"/> + <REGION_OF_INTEREST FIX="0" WIDTH="1920" X="0" Y="0" HEIGHT="1080" SHOW="0"/> + <MARKER BRIGHTNESS="50" IGNORE_WITHOUT="1"/> + <SIZE_COLOR SYMBOL_SIZE="10" AUTO_WB="0" X="0" Y="1" MODEL="0" Z="255" GREY_LEVEL="50" MAP_NUMBER="0" DEFAULT_HEIGHT="180" SHOW="1"> + <MAP WIDTH="0" X="0" Y="0" MAP_HEIGHT="180" HEIGHT="0" COLORED="1"/> + </SIZE_COLOR> + </RECOGNITION> + <TRACKING> + <ONLINE_CALCULATION ENABLED="0"/> + <REPEAT_BELOW QUALITY="50" ENABLED="1"/> + <EXTRAPOLATION ENABLED="1"/> + <MERGE ENABLED="0"/> + <ONLY_VISIBLE ENABLED="1"/> + <SEARCH_MISSING_FRAMES ENABLED="1"/> + <RECALCULATE_MEDIAN_HEIGHT ENABLED="1"/> + <ALLOW_ALTERNATE_HEIGHT ENABLED="0"/> + <EXPORT_ELIMINATE_TRACKPOINT_WITHOUT_HEIGHT ENABLED="0"/> + <EXPORT_ELIMINATE_TRAJECTORY_WITHOUT_HEIGHT ENABLED="0"/> + <EXPORT_SMOOTH ENABLED="1"/> + <EXPORT_VIEWING_DIRECTION ENABLED="0"/> + <TEST_EQUAL ENABLED="1"/> + <TEST_VELOCITY ENABLED="1"/> + <TEST_INSIDE ENABLED="1"/> + <TEST_LENGTH ENABLED="1"/> + <TRACK_FILE FILENAME=""/> + <SEARCH_REGION LEVELS="3" SCALE="16" SHOW="0"/> + <PATH SHOW="1" NUMBER_SIZE="14" ONLY_PEOPLE="0" SHOW_CURRENT_POINT="1" AFTER="15" FIX="0" PATH_SIZE="2" ONLY_VISIBLE="0" COLOR_MARKER_SIZE="14" SHOW_COLLECTIVE_COLOR="1" NUMBER_BOLD="1" CURRENT_POINT_SIZE="60" ONLY_PEOPLE_NR="1" POINTS_COLORED="1" SHOW_POINTS="0" BEFORE="15" SHOW_COLOR_MARKER="1" SHOW_PATH="1" HEAD_SIZE="1" COLLECTIVE_COLOR_SIZE="11" SHOW_NUMBER="1" POINTS_SIZE="7"/> + </TRACKING> + <ANALYSIS> + <SEARCH_MISSING_FRAMES ENABLED="1"/> + <MARK_ACTUAL ENABLED="0"/> + <CALCULATION STEP_SIZE="25" CONSIDER_X="0" ABSOLUTE="0" CONSIDER_Y="1" REVERSE="0"/> + </ANALYSIS> + </CONTROL> + <STEREO> + <DISPARITY OPACITY="100" ALGO="0" HIDE_INVALID="1" SHOW="0" COLOR="0"> + <VALUES MIN="0" MAX="100"/> + <MASK USE_EDGE="0" SIZE="7" EDGE_SIZE="5"/> + <USE CALIB_CENTER="1" HEIGHT_EVER="1" EXPORT="0" HEIGHT="0" RECO="0"/> + </DISPARITY> + </STEREO> + <COLOR_MARKER> + <MASK OPACITY="100" SHOW="0" MASK="1"/> + <FROM_COLOR HUE="0" SATURATION="0" VALUE="0"/> + <TO_COLOR HUE="359" SATURATION="255" VALUE="255"/> + <PARAM CLOSE_RADIUS="2" INVERS_HUE="0" CLOSE_USED="1" MAX_AREA="5000" MIN_AREA="1000" OPEN_USED="1" MAX_RATIO="2" OPEN_RADIUS="5"/> + </COLOR_MARKER> + <PLAYER FRAME="0"/> + <VIEW SAVE_TRANSFORMED="0" TRANSFORMATION="215 0 0 0" CAMERA="2" ANTIALIAS="0" OPENGL="0"/> +</PETRACK> diff --git a/tests/regression_test/data/old_pet_files/2015.pet b/tests/regression_test/data/old_pet_files/2015.pet new file mode 100644 index 000000000..56b9f3bb6 --- /dev/null +++ b/tests/regression_test/data/old_pet_files/2015.pet @@ -0,0 +1,71 @@ +<?xml version="1.0" ?> +<!DOCTYPE PETRACK> +<PETRACK VERSION="0.8"> + <MAIN SRC="C:/Ped_Experiment_6_3_2015/Extracted Videos and Frames/Day 2_Afternoon/6_Three exits (b=90cm, Block exit 2)_Half participants_Free speed/Framers/6000.jpg;../../Extracted Videos and Frames/Day 2_Afternoon/6_Three exits (b=90cm, Block exit 2)_Half participants_Free speed/Framers/6000.jpg" STATUS_HEIGHT="0"/> + <CONTROL TAB="2"> + <CALIBRATION> + <BRIGHTNESS ENABLED="0" VALUE="0"/> + <CONTRAST ENABLED="0" VALUE="0"/> + <BORDER ENABLED="0" VALUE="52" COLOR="#000000"/> + <SWAP VERTICALLY="0" ENABLED="0" HORIZONTALLY="0"/> + <BG_SUB ENABLED="0" UPDATE="0" FILE="" DELETE="1" SHOW="0" DELETE_NUMBER="3"/> + <PATTERN BOARD_SIZE_X="6" BOARD_SIZE_Y="8" SQUARE_SIZE="3"/> + <INTRINSIC_PARAMETERS FX="843.63" FY="844.03" R2="-0.248841" TANG_DIST="1" CALIB_FILES="O:\calibration\gopro\frames\GOPR0027.MP4.05_19_38_49.Standbild001.png, O:\calibration\gopro\frames\GOPR0027.MP4.05_19_40_41.Standbild002.png, O:\calibration\gopro\frames\GOPR0027.MP4.05_19_49_30.Standbild003.png, O:\calibration\gopro\frames\GOPR0027.MP4.05_19_52_04.Standbild004.png, O:\calibration\gopro\frames\GOPR0027.MP4.05_19_53_48.Standbild005.png, O:\calibration\gopro\frames\GOPR0027.MP4.05_19_57_36.Standbild006.png, O:\calibration\gopro\frames\GOPR0027.MP4.05_20_00_18.Standbild007.png, O:\calibration\gopro\frames\GOPR0027.MP4.05_20_38_49.Standbild008.png, O:\calibration\gopro\frames\GOPR0027.MP4.05_20_41_03.Standbild009.png, O:\calibration\gopro\frames\GOPR0027.MP4.05_20_42_34.Standbild010.png, O:\calibration\gopro\frames\GOPR0027.MP4.05_20_51_16.Standbild011.png, O:\calibration\gopro\frames\GOPR0027.MP4.05_21_00_44.Standbild012.png, O:\calibration\gopro\frames\GOPR0027.MP4.05_21_05_39.Standbild013.png, O:\calibration\gopro\frames\GOPR0027.MP4.05_21_14_01.Standbild014.png, O:\calibration\gopro\frames\GOPR0027.MP4.05_21_16_25.Standbild015.png, O:\calibration\gopro\frames\GOPR0027.MP4.05_21_18_43.Standbild016.png, O:\calibration\gopro\frames\GOPR0027.MP4.05_21_20_39.Standbild017.png, O:\calibration\gopro\frames\GOPR0027.MP4.05_21_23_44.Standbild018.png, O:\calibration\gopro\frames\GOPR0027.MP4.05_21_25_05.Standbild019.png, O:\calibration\gopro\frames\GOPR0027.MP4.05_21_27_22.Standbild020.png, O:\calibration\gopro\frames\GOPR0027.MP4.05_21_28_24.Standbild023.png, O:\calibration\gopro\frames\GOPR0027.MP4.05_21_32_44.Standbild021.png, O:\calibration\gopro\frames\GOPR0027.MP4.05_21_33_41.Standbild022.png" CX="947.11" R4="0.07615" TX="-0.000462" CY="719.09" TY="0.000548" R6="-0.011373" ENABLED="1" K4="0" FIX_CENTER="0" K5="0" QUAD_ASPECT_RATIO="0" K6="0"/> + <EXTRINSIC_PARAMETERS SHOW="1" COORD3D_AXIS_LEN="500" UNIT="100" FIX="1" COORD_DIMENSION="0" ROTATE="0" EXTR_TRANS_1="-27.37763" USE_INTRINSIC_CENTER="0" EXTR_ROT_1="3.08211" EXTR_TRANS_2="39.23102" EXTR_ROT_2="0.08334999999999999" EXTR_TRANS_3="-907.97292" EXTR_ROT_3="-0.07198" COORD3D_SWAP_X="0" COORD3D_TRANS_X="0" COORD3D_SWAP_Y="0" COORD3D_TRANS_Y="0" COORD3D_SWAP_Z="0" COORD3D_TRANS_Z="0" EXTERNAL_CALIB_FILE="C:/Ped_Experiment_6_3_2015/day2_afternoon/trajectories/../../calibration/gopro/external/day2_afternoon/day2_afternoon_external.3dc;../../calibration/gopro/external/day2_afternoon/day2_afternoon_external.3dc" SHOW_CALIB_POINTS="0" SCALE="1" TRANS_X="0" ALTITUDE="835" TRANS_Y="0"/> + <ALIGNMENT_GRID FIX="1" GRID3D_TRANS_X="0" GRID3D_TRANS_Y="0" GRID3D_RESOLUTION="100" GRID3D_TRANS_Z="0" SCALE="1" TRANS_X="0" TRANS_Y="0" GRID_DIMENSION="0" SHOW="1" ROTATE="0"/> + </CALIBRATION> + <RECOGNITION> + <PERFORM METHOD="3" ENABLED="1" STEP="1"/> + <REGION_OF_INTEREST FIX="1" WIDTH="1281" X="313" Y="0" HEIGHT="1149" SHOW="1"/> + <MARKER BRIGHTNESS="50" IGNORE_WITHOUT="1"/> + <SIZE_COLOR SYMBOL_SIZE="10" AUTO_WB="0" X="0" Y="1" MODEL="0" Z="255" GREY_LEVEL="50" MAP_NUMBER="0" DEFAULT_HEIGHT="170" SHOW="1"> + <MAP WIDTH="58" TO_SAT="255" X="101" FROM_SAT="64" INV_HUE="0" Y="64" MAP_HEIGHT="170" HEIGHT="191" TO_HUE="159" COLORED="1" FROM_HUE="101" FROM_VAL="138" TO_VAL="255"/> + </SIZE_COLOR> + </RECOGNITION> + <TRACKING> + <ONLINE_CALCULATION ENABLED="1"/> + <REPEAT_BELOW QUALITY="50" ENABLED="0"/> + <EXTRAPOLATION ENABLED="0"/> + <MERGE ENABLED="0"/> + <ONLY_VISIBLE ENABLED="1"/> + <SEARCH_MISSING_FRAMES ENABLED="0"/> + <RECALCULATE_MEDIAN_HEIGHT ENABLED="0"/> + <ALLOW_ALTERNATE_HEIGHT ENABLED="0"/> + <EXPORT_ELIMINATE_TRACKPOINT_WITHOUT_HEIGHT ENABLED="0"/> + <EXPORT_ELIMINATE_TRAJECTORY_WITHOUT_HEIGHT ENABLED="0"/> + <EXPORT_SMOOTH ENABLED="0"/> + <EXPORT_VIEWING_DIRECTION ENABLED="0"/> + <TEST_EQUAL ENABLED="1"/> + <TEST_VELOCITY ENABLED="1"/> + <TEST_INSIDE ENABLED="1"/> + <TEST_LENGTH ENABLED="1"/> + <TRACK_FILE FILENAME="C:/Ped_Experiment_6_3_2015/day2_afternoon/trajectories/1.trc;1.trc"/> + <SEARCH_REGION LEVELS="3" SCALE="16" SHOW="0"/> + <PATH SHOW="1" NUMBER_SIZE="20" ONLY_PEOPLE="1" SHOW_CURRENT_POINT="1" AFTER="-1" FIX="0" PATH_SIZE="2" ONLY_VISIBLE="0" COLOR_MARKER_SIZE="14" SHOW_COLLECTIVE_COLOR="0" NUMBER_BOLD="1" CURRENT_POINT_SIZE="6" ONLY_PEOPLE_NR="28" POINTS_COLORED="1" SHOW_POINTS="1" BEFORE="-1" SHOW_COLOR_MARKER="0" SHOW_PATH="1" HEAD_SIZE="0" COLLECTIVE_COLOR_SIZE="11" SHOW_NUMBER="1" POINTS_SIZE="6"/> + </TRACKING> + <ANALYSIS> + <SEARCH_MISSING_FRAMES ENABLED="1"/> + <MARK_ACTUAL ENABLED="0"/> + <CALCULATION STEP_SIZE="25" CONSIDER_X="0" ABSOLUTE="0" CONSIDER_Y="1" REVERSE="0"/> + </ANALYSIS> + </CONTROL> + <STEREO> + <DISPARITY OPACITY="100" ALGO="0" HIDE_INVALID="1" SHOW="0" COLOR="0"> + <VALUES MIN="0" MAX="100"/> + <MASK USE_EDGE="0" SIZE="7" EDGE_SIZE="5"/> + <USE CALIB_CENTER="1" HEIGHT_EVER="1" EXPORT="0" HEIGHT="0" RECO="0"/> + </DISPARITY> + </STEREO> + <COLOR_MARKER> + <MASK OPACITY="60" SHOW="1" MASK="1"/> + <FROM_COLOR HUE="100" SATURATION="34" VALUE="147"/> + <TO_COLOR HUE="188" SATURATION="255" VALUE="255"/> + <PARAM CLOSE_RADIUS="4" INVERS_HUE="0" CLOSE_USED="1" MAX_AREA="1000" MIN_AREA="200" OPEN_USED="1" MAX_RATIO="2" OPEN_RADIUS="4"/> + </COLOR_MARKER> + <MULTI_COLOR_MARKER> + <MASK OPACITY="60" SHOW="0" MASK="1"/> + <PARAM CLOSE_RADIUS="5" CLOSE_USED="1" MAX_AREA="2000" MIN_AREA="500" OPEN_USED="1" MAX_RATIO="2" OPEN_RADIUS="5"/> + </MULTI_COLOR_MARKER> + <PLAYER FRAME="704"/> + <VIEW SAVE_TRANSFORMED="0" TRANSFORMATION="224 0 0 0" CAMERA="2" ANTIALIAS="0" OPENGL="0"/> +</PETRACK> diff --git a/tests/regression_test/data/old_pet_files/2016.pet b/tests/regression_test/data/old_pet_files/2016.pet new file mode 100644 index 000000000..880b6a4ee --- /dev/null +++ b/tests/regression_test/data/old_pet_files/2016.pet @@ -0,0 +1,76 @@ +<?xml version="1.0" ?> +<!DOCTYPE PETRACK> +<PETRACK VERSION="0.8"> + <MAIN SRC="P:/ped/experiments/2016.05.12_Juelich_Rotunde_SensorFusionInertialSensor/export/chair/chair_circle_1.wmv;chair_circle_1.wmv" STATUS_HEIGHT="0"/> + <CONTROL TAB="1"> + <CALIBRATION> + <BRIGHTNESS VALUE="0" ENABLED="0"/> + <CONTRAST VALUE="0" ENABLED="0"/> + <BORDER VALUE="102" COLOR="#000000" ENABLED="1"/> + <SWAP VERTICALLY="0" ENABLED="0" HORIZONTALLY="0"/> + <BG_SUB FILE="" SHOW="0" DELETE="1" UPDATE="0" ENABLED="0" DELETE_NUMBER="3"/> + <PATTERN BOARD_SIZE_Y="8" SQUARE_SIZE="4.6" BOARD_SIZE_X="6"/> + <INTRINSIC_PARAMETERS K4="0" FY="850.22" R2="-0.247709" K5="0" FX="849.98" R6="-0.009362000000000001" CY="910.39" K6="0" R4="0.07044400000000001" FIX_CENTER="0" QUAD_ASPECT_RATIO="0" TX="0.000302" TANG_DIST="1" ENABLED="1" CX="1167.03" TY="0.000569" CALIB_FILES="P:/ped/cameras/gopro_4/calibration/6x8_4.6cm/gopro_4.2/calib_frames/GOPR3531.00_00_04_18.Standbild002.png, P:/ped/cameras/gopro_4/calibration/6x8_4.6cm/gopro_4.2/calib_frames/GOPR3531.00_00_05_02.Standbild001.png, P:/ped/cameras/gopro_4/calibration/6x8_4.6cm/gopro_4.2/calib_frames/GOPR3531.00_00_07_23.Standbild003.png, P:/ped/cameras/gopro_4/calibration/6x8_4.6cm/gopro_4.2/calib_frames/GOPR3531.00_00_08_12.Standbild004.png, P:/ped/cameras/gopro_4/calibration/6x8_4.6cm/gopro_4.2/calib_frames/GOPR3531.00_00_12_14.Standbild006.png, P:/ped/cameras/gopro_4/calibration/6x8_4.6cm/gopro_4.2/calib_frames/GOPR3531.00_00_14_23.Standbild005.png, P:/ped/cameras/gopro_4/calibration/6x8_4.6cm/gopro_4.2/calib_frames/GOPR3531.00_00_19_06.Standbild007.png, P:/ped/cameras/gopro_4/calibration/6x8_4.6cm/gopro_4.2/calib_frames/GOPR3531.00_00_19_21.Standbild008.png, P:/ped/cameras/gopro_4/calibration/6x8_4.6cm/gopro_4.2/calib_frames/GOPR3531.00_00_22_09.Standbild009.png, P:/ped/cameras/gopro_4/calibration/6x8_4.6cm/gopro_4.2/calib_frames/GOPR3531.00_00_24_17.Standbild010.png, P:/ped/cameras/gopro_4/calibration/6x8_4.6cm/gopro_4.2/calib_frames/GOPR3531.00_00_25_17.Standbild011.png, P:/ped/cameras/gopro_4/calibration/6x8_4.6cm/gopro_4.2/calib_frames/GOPR3531.00_00_27_17.Standbild012.png, P:/ped/cameras/gopro_4/calibration/6x8_4.6cm/gopro_4.2/calib_frames/GOPR3531.00_00_28_00.Standbild013.png, P:/ped/cameras/gopro_4/calibration/6x8_4.6cm/gopro_4.2/calib_frames/GOPR3531.00_00_28_11.Standbild014.png, P:/ped/cameras/gopro_4/calibration/6x8_4.6cm/gopro_4.2/calib_frames/GOPR3531.00_00_31_12.Standbild015.png, P:/ped/cameras/gopro_4/calibration/6x8_4.6cm/gopro_4.2/calib_frames/GOPR3531.00_00_32_16.Standbild016.png, P:/ped/cameras/gopro_4/calibration/6x8_4.6cm/gopro_4.2/calib_frames/GOPR3531.00_00_39_00.Standbild017.png, P:/ped/cameras/gopro_4/calibration/6x8_4.6cm/gopro_4.2/calib_frames/GOPR3531.00_00_45_15.Standbild018.png, P:/ped/cameras/gopro_4/calibration/6x8_4.6cm/gopro_4.2/calib_frames/GOPR3531.00_00_51_24.Standbild019.png, P:/ped/cameras/gopro_4/calibration/6x8_4.6cm/gopro_4.2/calib_frames/GOPR3531.00_00_56_04.Standbild020.png"/> + <EXTRINSIC_PARAMETERS EXTR_TRANS_2="-17.34664" EXTR_ROT_1="-0.05002" COORD3D_SWAP_X="0" ALTITUDE="535" TRANS_Y="0" COORD3D_SWAP_Z="0" COORD3D_TRANS_X="0" EXTR_TRANS_3="-376.53916" EXTERNAL_CALIB_FILE="P:/ped/experiments/2016.05.12_Juelich_Rotunde_SensorFusionInertialSensor/data/calibration/gopro_part1/extrinsic/gopro_part1_extrinsic_calib.3dc;../../data/calibration/gopro_part1/extrinsic/gopro_part1_extrinsic_calib.3dc" UNIT="100" COORD3D_TRANS_Y="0" SHOW="0" TRANS_X="0" FIX="0" COORD3D_AXIS_LEN="200" USE_INTRINSIC_CENTER="0" SHOW_CALIB_POINTS="0" SCALE="100" COORD_DIMENSION="0" EXTR_TRANS_1="-16.12053" ROTATE="0" COORD3D_SWAP_Y="0" EXTR_ROT_2="-0.0412" EXTR_ROT_3="0.28595" COORD3D_TRANS_Z="0"/> + <ALIGNMENT_GRID GRID3D_TRANS_Z="0" GRID_DIMENSION="0" SHOW="0" TRANS_Y="0" SCALE="100" TRANS_X="0" ROTATE="0" GRID3D_RESOLUTION="60" GRID3D_TRANS_Y="0" FIX="0" GRID3D_TRANS_X="0"/> + </CALIBRATION> + <RECOGNITION> + <PERFORM METHOD="5" STEP="1" ENABLED="0"/> + <REGION_OF_INTEREST SHOW="0" WIDTH="2224" X="-164" Y="-78" HEIGHT="1518" FIX="0"/> + <MARKER IGNORE_WITHOUT="1" BRIGHTNESS="50"/> + <SIZE_COLOR SHOW="1" MAP_NUMBER="0" X="0" GREY_LEVEL="50" AUTO_WB="0" SYMBOL_SIZE="10" MODEL="0" Y="1" Z="255" DEFAULT_HEIGHT="180"> + <MAP TO_HUE="41" WIDTH="22" MAP_HEIGHT="137" X="19" INV_HUE="0" FROM_HUE="19" FROM_SAT="185" FROM_VAL="171" Y="185" HEIGHT="59" TO_SAT="244" TO_VAL="236" COLORED="1"/> + </SIZE_COLOR> + </RECOGNITION> + <TRACKING> + <ONLINE_CALCULATION ENABLED="0"/> + <REPEAT_BELOW QUALITY="50" ENABLED="1"/> + <EXTRAPOLATION ENABLED="1"/> + <MERGE ENABLED="0"/> + <ONLY_VISIBLE ENABLED="1"/> + <SEARCH_MISSING_FRAMES ENABLED="1"/> + <RECALCULATE_MEDIAN_HEIGHT ENABLED="1"/> + <ALLOW_ALTERNATE_HEIGHT ENABLED="0"/> + <EXPORT_ELIMINATE_TRACKPOINT_WITHOUT_HEIGHT ENABLED="0"/> + <EXPORT_ELIMINATE_TRAJECTORY_WITHOUT_HEIGHT ENABLED="0"/> + <EXPORT_SMOOTH ENABLED="1"/> + <EXPORT_VIEWING_DIRECTION ENABLED="0"/> + <EXPORT_ANGLE_OF_VIEW ENABLED="0"/> + <EXPORT_USE_METER ENABLED="0"/> + <TEST_EQUAL ENABLED="1"/> + <TEST_VELOCITY ENABLED="1"/> + <TEST_INSIDE ENABLED="1"/> + <TEST_LENGTH ENABLED="1"/> + <TRACK_FILE FILENAME="P:/ped/experiments/2016.05.12_Juelich_Rotunde_SensorFusionInertialSensor/export/chair/chair_circle_1.trc;chair_circle_1.trc"/> + <SEARCH_REGION MAX_ERROR="0" SHOW="0" SCALE="16" LEVELS="3"/> + <PATH ONLY_VISIBLE="0" ONLY_PEOPLE_NR="1" NUMBER_BOLD="1" CURRENT_POINT_SIZE="31" NUMBER_SIZE="14" PATH_SIZE="2" HEAD_SIZE="1" BEFORE="25" SHOW_GROUND_PATH="1" TRACK_GROUND_PATH_COLOR="#00ff00" POINTS_COLORED="1" SHOW="1" COLLECTIVE_COLOR_SIZE="11" SHOW_GROUND_POSITION="1" SHOW_COLLECTIVE_COLOR="1" SHOW_POINTS="0" FIX="0" SHOW_NUMBER="1" POINTS_SIZE="7" TRACK_PATH_COLOR="#ff0000" COLOR_MARKER_SIZE="14" GROUND_PATH_SIZE="1" SHOW_COLOR_MARKER="1" GROUND_POSITION_SIZE="1" SHOW_CURRENT_POINT="1" AFTER="25" SHOW_PATH="1" ONLY_PEOPLE="0"/> + </TRACKING> + <ANALYSIS> + <SEARCH_MISSING_FRAMES ENABLED="1"/> + <MARK_ACTUAL ENABLED="0"/> + <CALCULATION REVERSE="0" CONSIDER_X="0" STEP_SIZE="25" ABSOLUTE="0" CONSIDER_Y="1"/> + </ANALYSIS> + </CONTROL> + <STEREO> + <DISPARITY ALGO="0" SHOW="0" HIDE_INVALID="1" COLOR="0" OPACITY="100"> + <VALUES MAX="100" MIN="0"/> + <MASK EDGE_SIZE="5" SIZE="7" USE_EDGE="0"/> + <USE CALIB_CENTER="1" EXPORT="0" RECO="0" HEIGHT_EVER="1" HEIGHT="0"/> + </DISPARITY> + </STEREO> + <COLOR_MARKER> + <MASK SHOW="0" OPACITY="100" MASK="1"/> + <FROM_COLOR HUE="0" VALUE="0" SATURATION="0"/> + <TO_COLOR HUE="359" VALUE="255" SATURATION="255"/> + <PARAM MAX_RATIO="2" MAX_AREA="5000" MIN_AREA="1000" OPEN_RADIUS="5" OPEN_USED="1" CLOSE_USED="1" CLOSE_RADIUS="2" INVERS_HUE="0"/> + </COLOR_MARKER> + <MULTI_COLOR_MARKER> + <BLACK_DOT USE="0" RESTRICT_POSITION="0" IGNORE_WITHOUT="1" SIZE="5" USE_COLOR="0"/> + <AUTO_CORRECT USE="1"/> + <MASK SHOW="0" OPACITY="75" MASK="1"/> + <PARAM MAX_RATIO="2" MAX_AREA="6500" MIN_AREA="1900" USE_HEAD_SIZE="0" OPEN_RADIUS="5" OPEN_USED="1" CLOSE_USED="1" CLOSE_RADIUS="2"/> + </MULTI_COLOR_MARKER> + <PLAYER FRAME="0" SOURCE_FRAME_OUT="2870" SOURCE_FRAME_IN="0" FPS="25"/> + <VIEW CAMERA="2" SAVE_TRANSFORMED="0" ANTIALIAS="0" TRANSFORMATION="214 0 0 -124" OPENGL="0"/> + <AUTO_TRACK OPTIMZE_COLOR="0" BACK_TRACK="1"/> +</PETRACK> diff --git a/tests/regression_test/data/old_pet_files/2017.pet b/tests/regression_test/data/old_pet_files/2017.pet new file mode 100644 index 000000000..021eada10 --- /dev/null +++ b/tests/regression_test/data/old_pet_files/2017.pet @@ -0,0 +1,83 @@ +<?xml version="1.0" ?> +<!DOCTYPE PETRACK> +<PETRACK VERSION="0.8"> + <MAIN SRC="/Volumes/ExFAT2TB/day1_morning/gopro4_2/100GOPRO/GP013623.MP4;100GOPRO/GP013623.MP4" STATUS_HEIGHT="0"/> + <CONTROL TAB="2"> + <CALIBRATION> + <BRIGHTNESS ENABLED="0" VALUE="0"/> + <CONTRAST ENABLED="0" VALUE="0"/> + <BORDER ENABLED="1" VALUE="215" COLOR="#000000"/> + <SWAP ENABLED="0" VERTICALLY="0" HORIZONTALLY="0"/> + <BG_SUB UPDATE="0" DELETE="1" ENABLED="0" FILE="" SHOW="0" DELETE_NUMBER="3"/> + <PATTERN BOARD_SIZE_X="6" BOARD_SIZE_Y="8" SQUARE_SIZE="4.6"/> + <INTRINSIC_PARAMETERS FX="835.66" K4="0" FY="835.76" K5="0" FIX_CENTER="0" K6="0" CALIB_FILES="" ENABLED="1" CX="1397.98" TX="0.000337" QUAD_ASPECT_RATIO="0" CY="1138.93" TY="7e-06" TANG_DIST="1" R2="-0.246701" R4="0.07269200000000001" R6="-0.010224"/> + <EXTRINSIC_PARAMETERS COORD3D_TRANS_Z="0" COORD3D_SWAP_X="0" COORD3D_SWAP_Y="0" COORD3D_SWAP_Z="0" SHOW_CALIB_POINTS="0" COORD_DIMENSION="1" COORD3D_AXIS_LEN="200" EXTR_ROT_1="0" EXTR_ROT_2="0" EXTR_ROT_3="0" EXTR_TRANS_1="0" EXTERNAL_CALIB_FILE="" EXTR_TRANS_2="0" EXTR_TRANS_3="-500" FIX="0" TRANS_X="0" TRANS_Y="0" SHOW="1" UNIT="100" ALTITUDE="535" ROTATE="0" USE_INTRINSIC_CENTER="0" SCALE="100" COORD3D_TRANS_X="0" COORD3D_TRANS_Y="0"/> + <ALIGNMENT_GRID FIX="0" GRID3D_RESOLUTION="100" TRANS_X="0" TRANS_Y="0" GRID_DIMENSION="0" SHOW="0" GRID3D_TRANS_X="0" SCALE="100" GRID3D_TRANS_Y="0" ROTATE="0" GRID3D_TRANS_Z="0"/> + </CALIBRATION> + <RECOGNITION> + <PERFORM METHOD="5" ENABLED="1" STEP="1"/> + <REGION_OF_INTEREST FIX="1" SHOW="1" WIDTH="2345" HEIGHT="1551" X="-148" Y="-141"/> + <MARKER BRIGHTNESS="50" IGNORE_WITHOUT="1"/> + <SIZE_COLOR Z="255" AUTO_WB="0" DEFAULT_HEIGHT="180" MODEL="0" SHOW="1" SYMBOL_SIZE="10" MAP_NUMBER="1" GREY_LEVEL="50" X="0" Y="1"> + <MAP COLORED="1" FROM_SAT="53" TO_HUE="110" FROM_VAL="193" TO_SAT="255" WIDTH="50" TO_VAL="255" HEIGHT="202" MAP_HEIGHT="180" INV_HUE="0" X="60" Y="53" FROM_HUE="60"/> + <MAP COLORED="1" FROM_SAT="67" TO_HUE="182" FROM_VAL="160" TO_SAT="255" WIDTH="36" TO_VAL="255" HEIGHT="188" MAP_HEIGHT="180" INV_HUE="0" X="146" Y="67" FROM_HUE="146"/> + </SIZE_COLOR> + </RECOGNITION> + <TRACKING> + <ONLINE_CALCULATION ENABLED="1"/> + <REPEAT_BELOW ENABLED="1" QUALITY="50"/> + <EXTRAPOLATION ENABLED="1"/> + <MERGE ENABLED="0"/> + <ONLY_VISIBLE ENABLED="1"/> + <SEARCH_MISSING_FRAMES ENABLED="0"/> + <RECALCULATE_MEDIAN_HEIGHT ENABLED="0"/> + <ALLOW_ALTERNATE_HEIGHT ENABLED="0"/> + <EXPORT_ELIMINATE_TRACKPOINT_WITHOUT_HEIGHT ENABLED="0"/> + <EXPORT_ELIMINATE_TRAJECTORY_WITHOUT_HEIGHT ENABLED="0"/> + <EXPORT_SMOOTH ENABLED="0"/> + <EXPORT_VIEWING_DIRECTION ENABLED="0"/> + <EXPORT_ANGLE_OF_VIEW ENABLED="0"/> + <EXPORT_USE_METER ENABLED="0"/> + <EXPORT_COMMENT ENABLED="0"/> + <EXPORT_MARKERID ENABLED="0"/> + <TEST_EQUAL ENABLED="1"/> + <TEST_VELOCITY ENABLED="1"/> + <TEST_INSIDE ENABLED="1"/> + <TEST_LENGTH ENABLED="1"/> + <TRACK_FILE FILENAME="/Volumes/ExFAT2TB/day1_morning/gopro4_2/1.trc;1.trc"/> + <SEARCH_REGION LEVELS="2" SHOW="1" MAX_ERROR="0" SCALE="11"/> + <PATH GROUND_PATH_SIZE="1" SHOW_COLOR_MARKER="0" ONLY_PEOPLE_NR="1" NUMBER_SIZE="14" TRACK_GROUND_PATH_COLOR="#00ff00" SHOW_GROUND_POSITION="0" SHOW_GROUND_PATH="0" FIX="0" COLOR_MARKER_SIZE="14" TRACK_PATH_COLOR="#ff0000" NUMBER_BOLD="1" POINTS_COLORED="1" CURRENT_POINT_SIZE="60" ONLY_PEOPLE="0" SHOW_PATH="1" POINTS_SIZE="7" SHOW_CURRENT_POINT="1" SHOW="1" BEFORE="50" SHOW_NUMBER="0" SHOW_COLLECTIVE_COLOR="0" PATH_SIZE="2" GROUND_POSITION_SIZE="1" ONLY_VISIBLE="0" COLLECTIVE_COLOR_SIZE="11" HEAD_SIZE="1" AFTER="0" SHOW_POINTS="0"/> + </TRACKING> + <ANALYSIS> + <SEARCH_MISSING_FRAMES ENABLED="1"/> + <MARK_ACTUAL ENABLED="0"/> + <CALCULATION REVERSE="0" STEP_SIZE="25" CONSIDER_X="0" ABSOLUTE="0" CONSIDER_Y="1"/> + </ANALYSIS> + </CONTROL> + <STEREO> + <DISPARITY HIDE_INVALID="1" ALGO="0" COLOR="0" SHOW="0" OPACITY="100"> + <VALUES MIN="0" MAX="100"/> + <MASK SIZE="7" EDGE_SIZE="5" USE_EDGE="0"/> + <USE RECO="0" HEIGHT_EVER="1" EXPORT="0" HEIGHT="0" CALIB_CENTER="1"/> + </DISPARITY> + </STEREO> + <COLOR_MARKER> + <MASK MASK="1" SHOW="0" OPACITY="100"/> + <FROM_COLOR SATURATION="0" VALUE="0" HUE="0"/> + <TO_COLOR SATURATION="255" VALUE="255" HUE="359"/> + <PARAM CLOSE_USED="1" INVERS_HUE="0" CLOSE_RADIUS="5" MIN_AREA="1000" MAX_RATIO="2" MAX_AREA="5000" OPEN_RADIUS="5" OPEN_USED="1"/> + </COLOR_MARKER> + <CODE_MARKER> + <DICTIONARY ID="16"/> + <PARAM CORNER_REFINEMENT="0" MIN_MARKER_DISTANCE="0.05" ADAPTIVE_THRESH_WIN_SIZE_STEP="10" ERROR_CORRECTION_RATE="0.6" CORNER_REFINEMENT_MAX_ITERATIONS="30" MARKER_BORDER_BITS="1" CORNER_REFINEMENT_MIN_ACCURACY="0.1" ADAPTIVE_THRESH_WIN_SIZE_MAX="23" MIN_DISTANCE_TO_BORDER="3" MIN_MARKER_PERIMETER="5" SHOW_DETECTED_CANDIDATES="0" PERSPECTIVE_REMOVE_IGNORED_MARGIN_PER_CELL="0.13" PERSPECTIVE_REMOVE_PIXEL_PER_CELL="4" CORNER_REFINEMENT_WIN_SIZE="5" ADAPTIVE_THRESH_CONSTANT="7" MAX_RATIO_ERROR="0.03" MIN_CORNER_DISTANCE="0.05" MAX_MARKER_PERIMETER="15" ADAPTIVE_THRESH_WIN_SIZE_MIN="3" MAX_ERRONEOUS_BITS_IN_BORDER_RATE="0.35" MIN_OTSU_STD_DEV="5"/> + </CODE_MARKER> + <MULTI_COLOR_MARKER> + <BLACK_DOT USE="0" SIZE="5" RESTRICT_POSITION="0" IGNORE_WITHOUT="1" USE_COLOR="0"/> + <AUTO_CORRECT USE="1"/> + <MASK MASK="1" SHOW="0" OPACITY="60"/> + <PARAM CLOSE_USED="1" CLOSE_RADIUS="5" MIN_AREA="200" MAX_RATIO="2" MAX_AREA="800" OPEN_RADIUS="5" OPEN_USED="1" USE_HEAD_SIZE="0"/> + </MULTI_COLOR_MARKER> + <PLAYER SOURCE_FRAME_IN="19900" SOURCE_FRAME_OUT="25800" FPS="50" FRAME="20609"/> + <VIEW ANTIALIAS="0" TRANSFORMATION="241 0 853 380" HIDE_CONTROLS="0" SAVE_TRANSFORMED="0" OPENGL="0" CAMERA="2"/> + <AUTO_TRACK BACK_TRACK="1" OPTIMZE_COLOR="0"/> +</PETRACK> diff --git a/tests/regression_test/data/old_pet_files/2018.pet b/tests/regression_test/data/old_pet_files/2018.pet new file mode 100644 index 000000000..67d8202de --- /dev/null +++ b/tests/regression_test/data/old_pet_files/2018.pet @@ -0,0 +1,83 @@ +<?xml version="1.0" ?> +<!DOCTYPE PETRACK> +<PETRACK VERSION="0.8"> + <MAIN SRC="P:/ped/experiments/2018.01.23_Wuppertal_Entrance/export/gp2/02_Mittwoch/110_c_12_h0.mp4;110_c_12_h0.mp4" STATUS_HEIGHT="176"/> + <CONTROL TAB="2"> + <CALIBRATION> + <BRIGHTNESS ENABLED="0" VALUE="0"/> + <CONTRAST ENABLED="0" VALUE="0"/> + <BORDER COLOR="#000000" ENABLED="1" VALUE="50"/> + <SWAP VERTICALLY="0" HORIZONTALLY="0" ENABLED="0"/> + <BG_SUB UPDATE="0" SHOW="0" FILE="" DELETE_NUMBER="3" ENABLED="0" DELETE="1"/> + <PATTERN SQUARE_SIZE="4.6" BOARD_SIZE_X="6" BOARD_SIZE_Y="8"/> + <INTRINSIC_PARAMETERS TY="0.00057" CALIB_FILES="P:/ped/cameras/gopro_4/calibration/1440p/6x8_4.6cm/gopro_4.2/calib_frames/GOPR3531.00_00_04_18.Standbild002.png, P:/ped/cameras/gopro_4/calibration/1440p/6x8_4.6cm/gopro_4.2/calib_frames/GOPR3531.00_00_05_02.Standbild001.png, P:/ped/cameras/gopro_4/calibration/1440p/6x8_4.6cm/gopro_4.2/calib_frames/GOPR3531.00_00_07_23.Standbild003.png, P:/ped/cameras/gopro_4/calibration/1440p/6x8_4.6cm/gopro_4.2/calib_frames/GOPR3531.00_00_08_12.Standbild004.png, P:/ped/cameras/gopro_4/calibration/1440p/6x8_4.6cm/gopro_4.2/calib_frames/GOPR3531.00_00_12_14.Standbild006.png, P:/ped/cameras/gopro_4/calibration/1440p/6x8_4.6cm/gopro_4.2/calib_frames/GOPR3531.00_00_14_23.Standbild005.png, P:/ped/cameras/gopro_4/calibration/1440p/6x8_4.6cm/gopro_4.2/calib_frames/GOPR3531.00_00_19_06.Standbild007.png, P:/ped/cameras/gopro_4/calibration/1440p/6x8_4.6cm/gopro_4.2/calib_frames/GOPR3531.00_00_19_21.Standbild008.png, P:/ped/cameras/gopro_4/calibration/1440p/6x8_4.6cm/gopro_4.2/calib_frames/GOPR3531.00_00_22_09.Standbild009.png, P:/ped/cameras/gopro_4/calibration/1440p/6x8_4.6cm/gopro_4.2/calib_frames/GOPR3531.00_00_24_17.Standbild010.png, P:/ped/cameras/gopro_4/calibration/1440p/6x8_4.6cm/gopro_4.2/calib_frames/GOPR3531.00_00_25_17.Standbild011.png, P:/ped/cameras/gopro_4/calibration/1440p/6x8_4.6cm/gopro_4.2/calib_frames/GOPR3531.00_00_27_17.Standbild012.png, P:/ped/cameras/gopro_4/calibration/1440p/6x8_4.6cm/gopro_4.2/calib_frames/GOPR3531.00_00_28_00.Standbild013.png, P:/ped/cameras/gopro_4/calibration/1440p/6x8_4.6cm/gopro_4.2/calib_frames/GOPR3531.00_00_28_11.Standbild014.png, P:/ped/cameras/gopro_4/calibration/1440p/6x8_4.6cm/gopro_4.2/calib_frames/GOPR3531.00_00_31_12.Standbild015.png, P:/ped/cameras/gopro_4/calibration/1440p/6x8_4.6cm/gopro_4.2/calib_frames/GOPR3531.00_00_32_16.Standbild016.png, P:/ped/cameras/gopro_4/calibration/1440p/6x8_4.6cm/gopro_4.2/calib_frames/GOPR3531.00_00_39_00.Standbild017.png, P:/ped/cameras/gopro_4/calibration/1440p/6x8_4.6cm/gopro_4.2/calib_frames/GOPR3531.00_00_45_15.Standbild018.png, P:/ped/cameras/gopro_4/calibration/1440p/6x8_4.6cm/gopro_4.2/calib_frames/GOPR3531.00_00_51_24.Standbild019.png, P:/ped/cameras/gopro_4/calibration/1440p/6x8_4.6cm/gopro_4.2/calib_frames/GOPR3531.00_00_56_04.Standbild020.png" K5="0" QUAD_ASPECT_RATIO="0" FIX_CENTER="0" R4="0.070421" R2="-0.247671" ENABLED="1" TANG_DIST="1" K6="0" R6="-0.009357000000000001" CY="806.4" TX="0.000302" K4="0" FX="849.92" FY="850.16" CX="1063.04"/> + <EXTRINSIC_PARAMETERS COORD3D_TRANS_X="-3" ALTITUDE="535" COORD_DIMENSION="0" COORD3D_TRANS_Z="0" ROTATE="0" COORD3D_SWAP_X="0" COORD3D_SWAP_Y="0" SCALE="100" TRANS_X="0" EXTR_ROT_1="2.064" SHOW="0" EXTR_ROT_3="-0.3" TRANS_Y="0" USE_INTRINSIC_CENTER="0" COORD3D_SWAP_Z="0" EXTR_ROT_2="-2.08" EXTERNAL_CALIB_FILE="P:/ped/experiments/2018.01.23_Wuppertal_Entrance/export/gp2/02_Mittwoch/extrinsic_calib_9p.3dc;extrinsic_calib_9p.3dc" SHOW_CALIB_POINTS="0" EXTR_TRANS_2="-50.46" EXTR_TRANS_3="-497.046" COORD3D_AXIS_LEN="200" UNIT="100" COORD3D_TRANS_Y="3" FIX="0" EXTR_TRANS_1="-0.943"/> + <ALIGNMENT_GRID SCALE="100" SHOW="0" ROTATE="0" GRID3D_TRANS_Y="0" GRID3D_TRANS_Z="0" GRID3D_TRANS_X="-4" GRID_DIMENSION="0" GRID3D_RESOLUTION="100" FIX="1" TRANS_Y="0" TRANS_X="0"/> + </CALIBRATION> + <RECOGNITION> + <PERFORM METHOD="5" ENABLED="0" STEP="1"/> + <REGION_OF_INTEREST WIDTH="1313" X="219" HEIGHT="1328" SHOW="1" Y="38" FIX="1"/> + <MARKER IGNORE_WITHOUT="1" BRIGHTNESS="50"/> + <SIZE_COLOR X="0" MAP_NUMBER="0" SHOW="1" Y="1" AUTO_WB="0" MODEL="0" SYMBOL_SIZE="10" Z="255" DEFAULT_HEIGHT="176" GREY_LEVEL="50"> + <MAP WIDTH="322" X="28" COLORED="1" FROM_SAT="125" HEIGHT="130" Y="125" TO_VAL="255" TO_SAT="255" MAP_HEIGHT="176" TO_HUE="28" INV_HUE="1" FROM_HUE="350" FROM_VAL="124"/> + </SIZE_COLOR> + </RECOGNITION> + <TRACKING> + <ONLINE_CALCULATION ENABLED="0"/> + <REPEAT_BELOW QUALITY="50" ENABLED="1"/> + <EXTRAPOLATION ENABLED="1"/> + <MERGE ENABLED="0"/> + <ONLY_VISIBLE ENABLED="1"/> + <REGION_OF_INTEREST WIDTH="1958" X="62" HEIGHT="1399" SHOW="1" Y="7" FIX="1"/> + <SEARCH_MISSING_FRAMES ENABLED="0"/> + <RECALCULATE_MEDIAN_HEIGHT ENABLED="0"/> + <ALLOW_ALTERNATE_HEIGHT ENABLED="0"/> + <EXPORT_ELIMINATE_TRACKPOINT_WITHOUT_HEIGHT ENABLED="0"/> + <EXPORT_ELIMINATE_TRAJECTORY_WITHOUT_HEIGHT ENABLED="0"/> + <EXPORT_SMOOTH ENABLED="0"/> + <EXPORT_VIEWING_DIRECTION ENABLED="0"/> + <EXPORT_ANGLE_OF_VIEW ENABLED="0"/> + <EXPORT_USE_METER ENABLED="1"/> + <EXPORT_COMMENT ENABLED="0"/> + <EXPORT_MARKERID ENABLED="0"/> + <TEST_EQUAL ENABLED="1"/> + <TEST_VELOCITY ENABLED="1"/> + <TEST_INSIDE ENABLED="1"/> + <TEST_LENGTH ENABLED="1"/> + <TRACK_FILE FILENAME="P:/ped/experiments/2018.01.23_Wuppertal_Entrance/export/gp2/02_Mittwoch/110_c_12_h0.trc;110_c_12_h0.trc"/> + <SEARCH_REGION SCALE="12" MAX_ERROR="0" SHOW="1" LEVELS="1"/> + <PATH GROUND_PATH_SIZE="1" NUMBER_BOLD="1" POINTS_SIZE="7" POINTS_COLORED="1" ONLY_PEOPLE_NR_LIST="1" NUMBER_SIZE="14" ONLY_VISIBLE="0" SHOW="1" COLLECTIVE_COLOR_SIZE="11" SHOW_GROUND_PATH="0" BEFORE="10" TRACK_PATH_COLOR="#ff0000" SHOW_NUMBER="1" SHOW_PATH="1" AFTER="10" CURRENT_POINT_SIZE="31" SHOW_POINTS="1" SHOW_GROUND_POSITION="0" ONLY_PEOPLE_LIST="0" SHOW_COLLECTIVE_COLOR="0" PATH_SIZE="2" HEAD_SIZE="1" TRACK_GROUND_PATH_COLOR="#00ff00" SHOW_COLOR_MARKER="0" ONLY_PEOPLE="0" ONLY_PEOPLE_NR="1" FIX="0" COLOR_MARKER_SIZE="14" SHOW_CURRENT_POINT="1" GROUND_POSITION_SIZE="1"/> + </TRACKING> + <ANALYSIS> + <SEARCH_MISSING_FRAMES ENABLED="1"/> + <MARK_ACTUAL ENABLED="0"/> + <CALCULATION STEP_SIZE="25" REVERSE="0" SHOW_VORONOI="0" ABSOLUTE="0" CONSIDER_X="0" CONSIDER_Y="1"/> + </ANALYSIS> + </CONTROL> + <STEREO> + <DISPARITY COLOR="0" SHOW="0" OPACITY="100" HIDE_INVALID="1" ALGO="0"> + <VALUES MAX="100" MIN="0"/> + <MASK SIZE="7" EDGE_SIZE="5" USE_EDGE="0"/> + <USE HEIGHT="0" HEIGHT_EVER="1" CALIB_CENTER="1" EXPORT="0" RECO="0"/> + </DISPARITY> + </STEREO> + <COLOR_MARKER> + <MASK MASK="1" SHOW="0" OPACITY="100"/> + <FROM_COLOR HUE="0" SATURATION="0" VALUE="0"/> + <TO_COLOR HUE="359" SATURATION="255" VALUE="255"/> + <PARAM CLOSE_USED="1" INVERS_HUE="0" MAX_AREA="5000" CLOSE_RADIUS="5" OPEN_RADIUS="5" OPEN_USED="1" MIN_AREA="1000" MAX_RATIO="2"/> + </COLOR_MARKER> + <CODE_MARKER> + <DICTIONARY ID="16"/> + <PARAM ADAPTIVE_THRESH_WIN_SIZE_MIN="3" CORNER_REFINEMENT="0" ADAPTIVE_THRESH_WIN_SIZE_STEP="10" MIN_MARKER_DISTANCE="0.05" MIN_OTSU_STD_DEV="5" CORNER_REFINEMENT_MIN_ACCURACY="0.1" MIN_CORNER_DISTANCE="0.05" MARKER_BORDER_BITS="1" ADAPTIVE_THRESH_WIN_SIZE_MAX="23" CORNER_REFINEMENT_MAX_ITERATIONS="30" ERROR_CORRECTION_RATE="0.6" SHOW_DETECTED_CANDIDATES="0" MAX_ERRONEOUS_BITS_IN_BORDER_RATE="0.35" PERSPECTIVE_REMOVE_IGNORED_MARGIN_PER_CELL="0.13" MIN_MARKER_PERIMETER="5" ADAPTIVE_THRESH_CONSTANT="7" CORNER_REFINEMENT_WIN_SIZE="5" PERSPECTIVE_REMOVE_PIXEL_PER_CELL="4" MAX_RATIO_ERROR="0.03" MIN_DISTANCE_TO_BORDER="3" MAX_MARKER_PERIMETER="15"/> + </CODE_MARKER> + <MULTI_COLOR_MARKER> + <BLACK_DOT IGNORE_WITHOUT="1" RESTRICT_POSITION="0" USE="0" SIZE="5" USE_COLOR="0"/> + <AUTO_CORRECT USE="1" ONLY_EXPORT="1"/> + <MASK MASK="1" SHOW="0" OPACITY="60"/> + <PARAM CLOSE_USED="1" MAX_AREA="4000" USE_HEAD_SIZE="0" CLOSE_RADIUS="3" OPEN_RADIUS="3" OPEN_USED="1" MIN_AREA="700" MAX_RATIO="1.8"/> + </MULTI_COLOR_MARKER> + <PLAYER SOURCE_FRAME_IN="0" FPS="25" SOURCE_FRAME_OUT="1326" FRAME="1326" PLAYER_SPEED_FIXED="0"/> + <VIEW OPENGL="0" SAVE_TRANSFORMED="0" CAMERA="2" HIDE_CONTROLS="0" TRANSFORMATION="241 0 305 80" ANTIALIAS="0"/> + <AUTO_TRACK OPTIMZE_COLOR="0" BACK_TRACK="1"/> +</PETRACK> diff --git a/tests/regression_test/data/old_pet_files/2019.pet b/tests/regression_test/data/old_pet_files/2019.pet new file mode 100644 index 000000000..6f266a0ec --- /dev/null +++ b/tests/regression_test/data/old_pet_files/2019.pet @@ -0,0 +1,83 @@ +<?xml version="1.0" ?> +<!DOCTYPE PETRACK> +<PETRACK VERSION="0.8"> + <MAIN SRC="O:/experiments/2019.07.07_Juelich_TagDerNeugier/export/gp7_2/bottleneck/bn_060_013_h-_bag0.mp4;bn_060_013_h-_bag0.mp4" STATUS_HEIGHT="0"/> + <CONTROL TAB="2"> + <CALIBRATION> + <BRIGHTNESS ENABLED="0" VALUE="0"/> + <CONTRAST ENABLED="0" VALUE="0"/> + <BORDER COLOR="#000000" ENABLED="1" VALUE="200"/> + <SWAP VERTICALLY="0" HORIZONTALLY="0" ENABLED="0"/> + <BG_SUB UPDATE="0" SHOW="0" FILE="" DELETE_NUMBER="3" ENABLED="0" DELETE="1"/> + <PATTERN SQUARE_SIZE="4.6" BOARD_SIZE_X="6" BOARD_SIZE_Y="8"/> + <INTRINSIC_PARAMETERS TY="0.000465" CALIB_FILES="O:/hardware/cameras/gopro_7_2/pattern/1.png, O:/hardware/cameras/gopro_7_2/pattern/2.png, O:/hardware/cameras/gopro_7_2/pattern/3.png, O:/hardware/cameras/gopro_7_2/pattern/4.png, O:/hardware/cameras/gopro_7_2/pattern/5.png, O:/hardware/cameras/gopro_7_2/pattern/6.png, O:/hardware/cameras/gopro_7_2/pattern/7.png, O:/hardware/cameras/gopro_7_2/pattern/8.png, O:/hardware/cameras/gopro_7_2/pattern/9.png, O:/hardware/cameras/gopro_7_2/pattern/10.png, O:/hardware/cameras/gopro_7_2/pattern/11.png, O:/hardware/cameras/gopro_7_2/pattern/12.png" K5="0" QUAD_ASPECT_RATIO="0" FIX_CENTER="0" R4="0.060733" R2="-0.231471" ENABLED="1" TANG_DIST="1" K6="0" R6="-0.007264" CY="1911.87" TX="0.000106" K4="0" FX="1716.13" FY="1716.62" CX="2380.06"/> + <EXTRINSIC_PARAMETERS COORD3D_TRANS_X="0" ALTITUDE="535" COORD_DIMENSION="0" COORD3D_TRANS_Z="0" ROTATE="0" COORD3D_SWAP_X="0" COORD3D_SWAP_Y="0" SCALE="100" TRANS_X="0" EXTR_ROT_1="3.122" SHOW="0" EXTR_ROT_3="0.051" TRANS_Y="0" USE_INTRINSIC_CENTER="0" COORD3D_SWAP_Z="0" EXTR_ROT_2="0.041" EXTERNAL_CALIB_FILE="O:/experiments/2019.07.07_Juelich_TagDerNeugier/export/gp7_2/ext_calib_raw.3dc;../ext_calib_raw.3dc" SHOW_CALIB_POINTS="0" EXTR_TRANS_2="6.544" EXTR_TRANS_3="-423.565" COORD3D_AXIS_LEN="200" UNIT="100" COORD3D_TRANS_Y="0" FIX="0" EXTR_TRANS_1="-1.297"/> + <ALIGNMENT_GRID SCALE="100" SHOW="0" ROTATE="0" GRID3D_TRANS_Y="0" GRID3D_TRANS_Z="0" GRID3D_TRANS_X="0" GRID_DIMENSION="0" GRID3D_RESOLUTION="100" FIX="0" TRANS_Y="0" TRANS_X="0"/> + </CALIBRATION> + <RECOGNITION> + <PERFORM METHOD="5" ENABLED="1" STEP="1"/> + <REGION_OF_INTEREST WIDTH="4074" X="-400" HEIGHT="2925" SHOW="1" Y="75" FIX="0"/> + <MARKER IGNORE_WITHOUT="1" BRIGHTNESS="50"/> + <SIZE_COLOR X="0" MAP_NUMBER="0" SHOW="1" Y="1" AUTO_WB="0" MODEL="0" SYMBOL_SIZE="10" Z="255" DEFAULT_HEIGHT="180" GREY_LEVEL="50"> + <MAP WIDTH="7" X="5" COLORED="1" FROM_SAT="129" HEIGHT="126" Y="129" TO_VAL="254" TO_SAT="255" MAP_HEIGHT="180" TO_HUE="12" INV_HUE="0" FROM_HUE="5" FROM_VAL="154"/> + </SIZE_COLOR> + </RECOGNITION> + <TRACKING> + <ONLINE_CALCULATION ENABLED="1"/> + <REPEAT_BELOW QUALITY="50" ENABLED="1"/> + <EXTRAPOLATION ENABLED="1"/> + <MERGE ENABLED="0"/> + <ONLY_VISIBLE ENABLED="1"/> + <REGION_OF_INTEREST WIDTH="4000" X="0" HEIGHT="3000" SHOW="0" Y="0" FIX="0"/> + <SEARCH_MISSING_FRAMES ENABLED="0"/> + <RECALCULATE_MEDIAN_HEIGHT ENABLED="0"/> + <ALLOW_ALTERNATE_HEIGHT ENABLED="0"/> + <EXPORT_ELIMINATE_TRACKPOINT_WITHOUT_HEIGHT ENABLED="0"/> + <EXPORT_ELIMINATE_TRAJECTORY_WITHOUT_HEIGHT ENABLED="0"/> + <EXPORT_SMOOTH ENABLED="0"/> + <EXPORT_VIEWING_DIRECTION ENABLED="1"/> + <EXPORT_ANGLE_OF_VIEW ENABLED="0"/> + <EXPORT_USE_METER ENABLED="1"/> + <EXPORT_COMMENT ENABLED="0"/> + <EXPORT_MARKERID ENABLED="1"/> + <TEST_EQUAL ENABLED="1"/> + <TEST_VELOCITY ENABLED="1"/> + <TEST_INSIDE ENABLED="1"/> + <TEST_LENGTH ENABLED="1"/> + <TRACK_FILE FILENAME=""/> + <SEARCH_REGION SCALE="16" MAX_ERROR="0" SHOW="0" LEVELS="3"/> + <PATH GROUND_PATH_SIZE="1" NUMBER_BOLD="1" POINTS_SIZE="7" POINTS_COLORED="1" ONLY_PEOPLE_NR_LIST="1" NUMBER_SIZE="14" ONLY_VISIBLE="0" SHOW="1" COLLECTIVE_COLOR_SIZE="11" SHOW_GROUND_PATH="0" BEFORE="15" TRACK_PATH_COLOR="#ff0000" SHOW_NUMBER="0" SHOW_PATH="1" AFTER="15" CURRENT_POINT_SIZE="60" SHOW_POINTS="0" SHOW_GROUND_POSITION="0" ONLY_PEOPLE_LIST="0" SHOW_COLLECTIVE_COLOR="0" PATH_SIZE="5" HEAD_SIZE="1" TRACK_GROUND_PATH_COLOR="#00ff00" SHOW_COLOR_MARKER="0" ONLY_PEOPLE="0" ONLY_PEOPLE_NR="1" FIX="0" COLOR_MARKER_SIZE="14" SHOW_CURRENT_POINT="1" GROUND_POSITION_SIZE="1"/> + </TRACKING> + <ANALYSIS> + <SEARCH_MISSING_FRAMES ENABLED="1"/> + <MARK_ACTUAL ENABLED="0"/> + <CALCULATION STEP_SIZE="25" REVERSE="0" SHOW_VORONOI="0" ABSOLUTE="0" CONSIDER_X="0" CONSIDER_Y="1"/> + </ANALYSIS> + </CONTROL> + <STEREO> + <DISPARITY COLOR="0" SHOW="0" OPACITY="100" HIDE_INVALID="1" ALGO="0"> + <VALUES MAX="100" MIN="0"/> + <MASK SIZE="7" EDGE_SIZE="5" USE_EDGE="0"/> + <USE HEIGHT="0" HEIGHT_EVER="1" CALIB_CENTER="1" EXPORT="0" RECO="0"/> + </DISPARITY> + </STEREO> + <COLOR_MARKER> + <MASK MASK="1" SHOW="0" OPACITY="100"/> + <FROM_COLOR HUE="0" SATURATION="0" VALUE="0"/> + <TO_COLOR HUE="359" SATURATION="255" VALUE="255"/> + <PARAM CLOSE_USED="1" INVERS_HUE="0" MAX_AREA="5000" CLOSE_RADIUS="5" OPEN_RADIUS="5" OPEN_USED="1" MIN_AREA="1000" MAX_RATIO="2"/> + </COLOR_MARKER> + <CODE_MARKER> + <DICTIONARY ID="16"/> + <PARAM ADAPTIVE_THRESH_WIN_SIZE_MIN="3" CORNER_REFINEMENT="0" ADAPTIVE_THRESH_WIN_SIZE_STEP="10" MIN_MARKER_DISTANCE="0.05" MIN_OTSU_STD_DEV="5" CORNER_REFINEMENT_MIN_ACCURACY="0.1" MIN_CORNER_DISTANCE="0.05" MARKER_BORDER_BITS="1" ADAPTIVE_THRESH_WIN_SIZE_MAX="23" CORNER_REFINEMENT_MAX_ITERATIONS="30" ERROR_CORRECTION_RATE="0.6" SHOW_DETECTED_CANDIDATES="0" MAX_ERRONEOUS_BITS_IN_BORDER_RATE="0.35" PERSPECTIVE_REMOVE_IGNORED_MARGIN_PER_CELL="0.13" MIN_MARKER_PERIMETER="5" ADAPTIVE_THRESH_CONSTANT="7" CORNER_REFINEMENT_WIN_SIZE="5" PERSPECTIVE_REMOVE_PIXEL_PER_CELL="4" MAX_RATIO_ERROR="0.03" MIN_DISTANCE_TO_BORDER="3" MAX_MARKER_PERIMETER="15"/> + </CODE_MARKER> + <MULTI_COLOR_MARKER> + <BLACK_DOT IGNORE_WITHOUT="1" RESTRICT_POSITION="0" USE="0" SIZE="5" USE_COLOR="0"/> + <AUTO_CORRECT USE="0" ONLY_EXPORT="0"/> + <MASK MASK="1" SHOW="1" OPACITY="100"/> + <PARAM CLOSE_USED="1" MAX_AREA="28166" USE_HEAD_SIZE="1" CLOSE_RADIUS="5" OPEN_RADIUS="5" OPEN_USED="1" MIN_AREA="8450" MAX_RATIO="2"/> + </MULTI_COLOR_MARKER> + <PLAYER SOURCE_FRAME_IN="0" FPS="25" SOURCE_FRAME_OUT="692" FRAME="64" PLAYER_SPEED_FIXED="0"/> + <VIEW OPENGL="0" SAVE_TRANSFORMED="0" CAMERA="2" HIDE_CONTROLS="0" TRANSFORMATION="129 0 0 0" ANTIALIAS="0"/> + <AUTO_TRACK OPTIMZE_COLOR="0" BACK_TRACK="1"/> +</PETRACK> diff --git a/tests/regression_test/tests/test_oldPetFiles.py b/tests/regression_test/tests/test_oldPetFiles.py new file mode 100644 index 000000000..a5e7bed33 --- /dev/null +++ b/tests/regression_test/tests/test_oldPetFiles.py @@ -0,0 +1,74 @@ +# +# PeTrack - Software for tracking pedestrians movement in videos +# Copyright (C) 2024 Forschungszentrum Jülich GmbH, IAS-7 +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <https://www.gnu.org/licenses/>. +# +import pytest +import subprocess +import xml.etree.ElementTree as ET +from test_pet import compare_xml + + +def pytest_addoption(parser): + parser.addoption("--path", action="store", default="../../../build/petrack.exe") + + +@pytest.fixture( + params=[ + "2006", + "2008", + "2009", + "2012", + "2013", + "2014", + "2015", + "2016", + "2017", + "2018", + "2019" + ], + scope="session", +) +def load_old_pet_files(request, pytestconfig): + petrack_path = pytestconfig.getoption("path") + + """Does load old pet files and expects them not to crash.""" + + project = "../data/old_pet_files/" + request.param + ".pet" + output = "test_oldPet.pet" + empty_pet = "../../../demo/00_files/00_empty.pet" + subprocess.run( + [ + petrack_path, + "-project", + project, + "-autosave", + output, + "-platform", + "offscreen", + ], + check=True, + ) + yield output, empty_pet + + +def test_old_pet_files(load_old_pet_files): + # TODO check if values are correct + test_pet = ET.parse(load_old_pet_files[0]) + truth_pet = ET.parse(load_old_pet_files[1]) + + # comparing with empty pet file should fail when pet file is loaded correctly + with pytest.raises(AssertionError): + compare_xml(test_pet, truth_pet) diff --git a/tests/unit_test/calibration/tst_extrCalibration.cpp b/tests/unit_test/calibration/tst_extrCalibration.cpp index 44991fad7..e13a0868b 100644 --- a/tests/unit_test/calibration/tst_extrCalibration.cpp +++ b/tests/unit_test/calibration/tst_extrCalibration.cpp @@ -35,7 +35,7 @@ TEST_CASE("src/extrCalibration/camToWorldRotation", "[extrCalibration]") const QString testConfig{ R"(<CONTROL> <CALIBRATION> - <EXTRINSIC_PARAMETERS EXTR_ROT_1="%1" EXTR_ROT_2="%2" EXTR_ROT_3="%3" EXTR_TRANS_1="0" EXTR_TRANS_2="0" EXTR_TRANS_3="0" /> + <EXTRINSIC_PARAMETERS COORD3D_SWAP_Y="0" COORD3D_SWAP_Z="0" EXTR_ROT_1="%1" EXTR_ROT_2="%2" EXTR_ROT_3="%3" EXTR_TRANS_1="0" EXTR_TRANS_2="0" EXTR_TRANS_3="0" /> </CALIBRATION> </CONTROL>)"}; diff --git a/tests/unit_test/ui/main-windows/tst_control.cpp b/tests/unit_test/ui/main-windows/tst_control.cpp index e047d57c0..1819e211f 100644 --- a/tests/unit_test/ui/main-windows/tst_control.cpp +++ b/tests/unit_test/ui/main-windows/tst_control.cpp @@ -267,7 +267,7 @@ SCENARIO("Open PeTrack check defaults", "[ui][config]") TEST_CASE("Loading from and saving to XML node", "[config]") { - Petrack pet{"0.9.1"}; + Petrack pet{"0.10.4"}; Control *control = pet.getControlWidget(); QDomDocument doc; QDomElement save = doc.createElement("CONTROL"); -- GitLab