diff --git a/CMakeLists.txt b/CMakeLists.txt index 3034c5b3effcf5e37a8707c470572890a2e61be4..54348f6be35057c50288957f0511a895483df8f2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -18,7 +18,7 @@ # Project setup ################################################################################ cmake_minimum_required(VERSION 3.16 FATAL_ERROR) -project(petrack LANGUAGES CXX VERSION 0.10.2) +project(petrack LANGUAGES CXX VERSION 0.10.3) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) diff --git a/demo/00_files/00_empty.pet b/demo/00_files/00_empty.pet index 629db10d11002be8e2490c5ef5bf68f3371fcb57..b7b25506c25a8444edc241a36581779ad089fa78 100644 --- a/demo/00_files/00_empty.pet +++ b/demo/00_files/00_empty.pet @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE PETRACK> -<PETRACK VERSION="0.10.2"> +<PETRACK VERSION="0.10.3"> <MAIN SRC="" STATUS_HEIGHT="0"/> <CONTROL TAB="0"> <CALIBRATION> @@ -11,7 +11,10 @@ <SWAP ENABLED="0" HORIZONTALLY="0" VERTICALLY="0"/> <BG_SUB DELETE="1" DELETE_NUMBER="3" ENABLED="0" FILE="" SHOW="0" UPDATE="0"/> <PATTERN BOARD_SIZE_X="6" BOARD_SIZE_Y="8" SQUARE_SIZE="4.5999999"/> - <INTRINSIC_PARAMETERS CALIB_FILES="" CX="511.5" CY="383.5" ENABLED="0" EXT_MODEL_ENABLED="1" FIX_CENTER="0" FX="881" FY="881" IMMUTABLE="0" K4="0" K5="0" K6="0" QUAD_ASPECT_RATIO="0" R2="0" R4="0" R6="0" ReprError="nan" S1="0" S2="0" S3="0" S4="0" TANG_DIST="1" TAUX="0" TAUY="0" TX="0" TY="0"/> + <INTRINSIC_PARAMETERS CALIB_FILES="" ENABLED="0" EXT_MODEL_ENABLED="1" FIX_CENTER="0" IMMUTABLE="0" QUAD_ASPECT_RATIO="0" TANG_DIST="1"> + <OLD_MODEL CX="551.5" CY="383.5" FX="881" FY="881" K4="0" K5="0" K6="0" R2="0" R4="0" R6="0" ReprError="nan" S1="0" S2="0" S3="0" S4="0" TAUX="0" TAUY="0" TX="0" TY="0"/> + <EXT_MODEL CX="551.5" CY="383.5" FX="881" FY="881" K4="0" K5="0" K6="0" R2="0" R4="0" R6="0" ReprError="nan" S1="0" S2="0" S3="0" S4="0" TAUX="0" TAUY="0" TX="0" TY="0"/> + </INTRINSIC_PARAMETERS> <EXTRINSIC_PARAMETERS ALTITUDE="535" COORD3D_AXIS_LEN="200" COORD3D_SWAP_X="0" COORD3D_SWAP_Y="0" COORD3D_SWAP_Z="0" COORD3D_TRANS_X="0" COORD3D_TRANS_Y="0" COORD3D_TRANS_Z="0" COORD_DIMENSION="0" EXTERNAL_CALIB_FILE="" EXTR_ROT_1="0" EXTR_ROT_2="0" EXTR_ROT_3="0" EXTR_TRANS_1="0" EXTR_TRANS_2="0" EXTR_TRANS_3="-500" FIX="0" IMMUTABLE_COORD_BOX="0" IMMUTABLE_EXTRINSIC_BOX="0" ROTATE="0" SCALE="100" SHOW="0" SHOW_CALIB_POINTS="0" TRANS_X="0" TRANS_Y="0" UNIT="100" USE_INTRINSIC_CENTER="0"/> <ALIGNMENT_GRID FIX="0" GRID3D_RESOLUTION="100" GRID3D_TRANS_X="0" GRID3D_TRANS_Y="0" GRID3D_TRANS_Z="0" GRID_DIMENSION="0" IMMUTABLE="0" ROTATE="0" SCALE="100" SHOW="0" TRANS_X="0" TRANS_Y="0"/> </CALIBRATION> diff --git a/demo/01_calibration/01_intrinsic.pet b/demo/01_calibration/01_intrinsic.pet index 78fe55296d1484e0387301421ac8607762ccb0b3..8abea774a1de5a417b104d0225d4d8a13a42ec90 100644 --- a/demo/01_calibration/01_intrinsic.pet +++ b/demo/01_calibration/01_intrinsic.pet @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE PETRACK> -<PETRACK VERSION="0.10.2"> +<PETRACK VERSION="0.10.3"> <MAIN SRC="" STATUS_HEIGHT="0"/> <CONTROL TAB="0"> <CALIBRATION> @@ -11,7 +11,10 @@ <SWAP ENABLED="0" HORIZONTALLY="0" VERTICALLY="0"/> <BG_SUB DELETE="1" DELETE_NUMBER="3" ENABLED="0" FILE="" SHOW="0" UPDATE="0"/> <PATTERN BOARD_SIZE_X="6" BOARD_SIZE_Y="8" SQUARE_SIZE="4.5999999"/> - <INTRINSIC_PARAMETERS CALIB_FILES="" CX="947.47000000000003" CY="698.44000000000005" ENABLED="1" EXT_MODEL_ENABLED="1" FIX_CENTER="0" FX="857.12" FY="857.50999999999999" IMMUTABLE="0" K4="1.7398640000000001" K5="0.399007" K6="-0.013342" QUAD_ASPECT_RATIO="0" R2="1.358914" R4="0.123435" R6="-0.0091129999999999996" ReprError="0.52066329210560447" S1="0.001026" S2="-6.6000000000000005e-05" S3="-0.00019000000000000001" S4="-9.7999999999999997e-05" TANG_DIST="1" TAUX="-3.0000000000000001e-05" TAUY="-5.0000000000000002e-05" TX="0.000184" TY="-0.000388"/> + <INTRINSIC_PARAMETERS CALIB_FILES="" ENABLED="0" EXT_MODEL_ENABLED="1" FIX_CENTER="0" IMMUTABLE="0" QUAD_ASPECT_RATIO="0" TANG_DIST="1"> + <OLD_MODEL CX="952.04445892782496" CY="698.71746765411331" FX="842.57112155626476" FY="842.69028289943685" K4="0" K5="0" K6="0" R2="-0.2766259" R4="0.093288489" R6="-0.014229562" ReprError="1.1930548" S1="0" S2="0" S3="0" S4="0" TAUX="0" TAUY="0" TX="-0.0002467561" TY="5.5423141e-05"/> + <EXT_MODEL CX="947.46961721777984" CY="698.44056337756024" FX="857.12444927931074" FY="857.51289718746045" K4="1.7399007" K5="0.39904982" K6="-0.013336699" R2="1.3589505" R4="0.12346415" R6="-0.0091119213" ReprError="0.52066356" S1="0.001025668" S2="-6.6003791e-05" S3="-0.00018953315" S4="-9.7617914e-05" TAUX="-2.980377e-05" TAUY="-5.050141e-05" TX="0.00018436424" TY="-0.00038751212"/> + </INTRINSIC_PARAMETERS> <EXTRINSIC_PARAMETERS ALTITUDE="535" COORD3D_AXIS_LEN="200" COORD3D_SWAP_X="0" COORD3D_SWAP_Y="0" COORD3D_SWAP_Z="0" COORD3D_TRANS_X="0" COORD3D_TRANS_Y="0" COORD3D_TRANS_Z="0" COORD_DIMENSION="0" EXTERNAL_CALIB_FILE="" EXTR_ROT_1="0" EXTR_ROT_2="0" EXTR_ROT_3="0" EXTR_TRANS_1="0" EXTR_TRANS_2="0" EXTR_TRANS_3="-500" FIX="0" IMMUTABLE_COORD_BOX="0" IMMUTABLE_EXTRINSIC_BOX="0" ROTATE="0" SCALE="100" SHOW="0" SHOW_CALIB_POINTS="0" TRANS_X="0" TRANS_Y="0" UNIT="100" USE_INTRINSIC_CENTER="0"/> <ALIGNMENT_GRID FIX="0" GRID3D_RESOLUTION="100" GRID3D_TRANS_X="0" GRID3D_TRANS_Y="0" GRID3D_TRANS_Z="0" GRID_DIMENSION="0" IMMUTABLE="0" ROTATE="0" SCALE="100" SHOW="0" TRANS_X="0" TRANS_Y="0"/> </CALIBRATION> diff --git a/demo/01_calibration/02_extrinsic.pet b/demo/01_calibration/02_extrinsic.pet index a73fb2ab44118028058a3a43307a69da9f14b6ea..f3b9b566761fb766ce87ef0fc30d065c7b8e306a 100644 --- a/demo/01_calibration/02_extrinsic.pet +++ b/demo/01_calibration/02_extrinsic.pet @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE PETRACK> -<PETRACK VERSION="0.10.2"> +<PETRACK VERSION="0.10.3"> <MAIN SRC="../00_files/calibration/extrinsic/00_all.jpg" STATUS_HEIGHT="0"/> <CONTROL TAB="0"> <CALIBRATION> @@ -11,7 +11,10 @@ <SWAP ENABLED="0" HORIZONTALLY="0" VERTICALLY="0"/> <BG_SUB DELETE="1" DELETE_NUMBER="3" ENABLED="0" FILE="" SHOW="0" UPDATE="0"/> <PATTERN BOARD_SIZE_X="6" BOARD_SIZE_Y="8" SQUARE_SIZE="4.5999999"/> - <INTRINSIC_PARAMETERS CALIB_FILES="" CX="947.47000000000003" CY="698.44000000000005" ENABLED="1" EXT_MODEL_ENABLED="1" FIX_CENTER="0" FX="857.12" FY="857.50999999999999" IMMUTABLE="0" K4="1.7398640000000001" K5="0.399007" K6="-0.013342" QUAD_ASPECT_RATIO="0" R2="1.358914" R4="0.123435" R6="-0.0091129999999999996" ReprError="0.52066329210560447" S1="0.001026" S2="-6.6000000000000005e-05" S3="-0.00019000000000000001" S4="-9.7999999999999997e-05" TANG_DIST="1" TAUX="-3.0000000000000001e-05" TAUY="-5.0000000000000002e-05" TX="0.000184" TY="-0.000388"/> + <INTRINSIC_PARAMETERS CALIB_FILES="" ENABLED="1" EXT_MODEL_ENABLED="1" FIX_CENTER="0" IMMUTABLE="0" QUAD_ASPECT_RATIO="0" TANG_DIST="1"> + <OLD_MODEL CX="551.5" CY="383.5" FX="881" FY="881" K4="0" K5="0" K6="0" R2="0" R4="0" R6="0" ReprError="nan" S1="0" S2="0" S3="0" S4="0" TAUX="0" TAUY="0" TX="0" TY="0"/> + <EXT_MODEL CX="947.47000000000003" CY="698.44000000000005" FX="857.12" FY="857.50999999999999" K4="1.739864" K5="0.39900699" K6="-0.013342" R2="1.358914" R4="0.123435" R6="-0.0091129998" ReprError="0.52066332" S1="0.001026" S2="-6.6000001e-05" S3="-0.00019000001" S4="-9.7999997e-05" TAUX="-2.9999999e-05" TAUY="-4.9999999e-05" TX="0.000184" TY="-0.00038799999"/> + </INTRINSIC_PARAMETERS> <EXTRINSIC_PARAMETERS ALTITUDE="535" COORD3D_AXIS_LEN="200" COORD3D_SWAP_X="0" COORD3D_SWAP_Y="0" COORD3D_SWAP_Z="0" COORD3D_TRANS_X="0" COORD3D_TRANS_Y="0" COORD3D_TRANS_Z="0" COORD_DIMENSION="0" EXTERNAL_CALIB_FILE="before.3dc" EXTR_ROT_1="-2.1949999999999998" EXTR_ROT_2="-2.1869999999999998" EXTR_ROT_3="0.029999999999999999" EXTR_TRANS_1="-1047.981" EXTR_TRANS_2="15.172000000000001" EXTR_TRANS_3="-634.48599999999999" FIX="0" IMMUTABLE_COORD_BOX="0" IMMUTABLE_EXTRINSIC_BOX="0" ROTATE="0" SCALE="100" SHOW="1" SHOW_CALIB_POINTS="1" TRANS_X="0" TRANS_Y="0" UNIT="100" USE_INTRINSIC_CENTER="0"/> <ALIGNMENT_GRID FIX="0" GRID3D_RESOLUTION="100" GRID3D_TRANS_X="0" GRID3D_TRANS_Y="0" GRID3D_TRANS_Z="0" GRID_DIMENSION="0" IMMUTABLE="0" ROTATE="0" SCALE="100" SHOW="0" TRANS_X="0" TRANS_Y="0"/> </CALIBRATION> diff --git a/demo/01_calibration/03_calibrated_with_video.pet b/demo/01_calibration/03_calibrated_with_video.pet index 368947e988bce196fbd9e90eaa7ab3faf1350d35..039a4099193ffce843ed20c97ab999dbfb300565 100644 --- a/demo/01_calibration/03_calibrated_with_video.pet +++ b/demo/01_calibration/03_calibrated_with_video.pet @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE PETRACK> -<PETRACK VERSION="0.10.2"> +<PETRACK VERSION="0.10.3"> <MAIN SRC="../00_files/video/video.mp4" STATUS_HEIGHT="0"/> <CONTROL TAB="0"> <CALIBRATION> @@ -11,7 +11,10 @@ <SWAP ENABLED="0" HORIZONTALLY="0" VERTICALLY="0"/> <BG_SUB DELETE="1" DELETE_NUMBER="3" ENABLED="0" FILE="" SHOW="0" UPDATE="0"/> <PATTERN BOARD_SIZE_X="6" BOARD_SIZE_Y="8" SQUARE_SIZE="4.5999999"/> - <INTRINSIC_PARAMETERS CALIB_FILES="" CX="947.47000000000003" CY="698.44000000000005" ENABLED="1" EXT_MODEL_ENABLED="1" FIX_CENTER="0" FX="857.12" FY="857.50999999999999" IMMUTABLE="0" K4="1.7398640000000001" K5="0.399007" K6="-0.013342" QUAD_ASPECT_RATIO="0" R2="1.358914" R4="0.123435" R6="-0.0091129999999999996" ReprError="0.52066329210560447" S1="0.001026" S2="-6.6000000000000005e-05" S3="-0.00019000000000000001" S4="-9.7999999999999997e-05" TANG_DIST="1" TAUX="-3.0000000000000001e-05" TAUY="-5.0000000000000002e-05" TX="0.000184" TY="-0.000388"/> + <INTRINSIC_PARAMETERS CALIB_FILES="" ENABLED="1" EXT_MODEL_ENABLED="1" FIX_CENTER="0" IMMUTABLE="0" QUAD_ASPECT_RATIO="0" TANG_DIST="1"> + <OLD_MODEL CX="551.5" CY="383.5" FX="881" FY="881" K4="0" K5="0" K6="0" R2="0" R4="0" R6="0" ReprError="nan" S1="0" S2="0" S3="0" S4="0" TAUX="0" TAUY="0" TX="0" TY="0"/> + <EXT_MODEL CX="947.47000000000003" CY="698.44000000000005" FX="857.12" FY="857.50999999999999" K4="1.739864" K5="0.39900699" K6="-0.013342" R2="1.358914" R4="0.123435" R6="-0.0091129998" ReprError="0.52066332" S1="0.001026" S2="-6.6000001e-05" S3="-0.00019000001" S4="-9.7999997e-05" TAUX="-2.9999999e-05" TAUY="-4.9999999e-05" TX="0.000184" TY="-0.00038799999"/> + </INTRINSIC_PARAMETERS> <EXTRINSIC_PARAMETERS ALTITUDE="535" COORD3D_AXIS_LEN="200" COORD3D_SWAP_X="0" COORD3D_SWAP_Y="0" COORD3D_SWAP_Z="0" COORD3D_TRANS_X="0" COORD3D_TRANS_Y="0" COORD3D_TRANS_Z="0" COORD_DIMENSION="0" EXTERNAL_CALIB_FILE="before.3dc" EXTR_ROT_1="-2.1949999999999998" EXTR_ROT_2="-2.1869999999999998" EXTR_ROT_3="0.029999999999999999" EXTR_TRANS_1="-1047.981" EXTR_TRANS_2="15.172000000000001" EXTR_TRANS_3="-634.48599999999999" FIX="0" IMMUTABLE_COORD_BOX="0" IMMUTABLE_EXTRINSIC_BOX="0" ROTATE="0" SCALE="100" SHOW="0" SHOW_CALIB_POINTS="0" TRANS_X="0" TRANS_Y="0" UNIT="100" USE_INTRINSIC_CENTER="0"/> <ALIGNMENT_GRID FIX="0" GRID3D_RESOLUTION="100" GRID3D_TRANS_X="0" GRID3D_TRANS_Y="0" GRID3D_TRANS_Z="0" GRID_DIMENSION="0" IMMUTABLE="0" ROTATE="0" SCALE="100" SHOW="0" TRANS_X="0" TRANS_Y="0"/> </CALIBRATION> diff --git a/demo/02_recognition/04_recognition.pet b/demo/02_recognition/04_recognition.pet index 1f1778342494a07df1d3f36b4926f1b2ee074521..a63bda2b98ef67703b2cf266d3a1d5b44bf8e716 100644 --- a/demo/02_recognition/04_recognition.pet +++ b/demo/02_recognition/04_recognition.pet @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE PETRACK> -<PETRACK VERSION="0.10.2"> +<PETRACK VERSION="0.10.3"> <MAIN SRC="../00_files/video/video.mp4" STATUS_HEIGHT="0"/> <CONTROL TAB="1"> <CALIBRATION> @@ -11,7 +11,10 @@ <SWAP ENABLED="0" HORIZONTALLY="0" VERTICALLY="0"/> <BG_SUB DELETE="1" DELETE_NUMBER="3" ENABLED="0" FILE="" SHOW="0" UPDATE="0"/> <PATTERN BOARD_SIZE_X="6" BOARD_SIZE_Y="8" SQUARE_SIZE="4.5999999"/> - <INTRINSIC_PARAMETERS CALIB_FILES="" CX="947.47000000000003" CY="698.44000000000005" ENABLED="1" EXT_MODEL_ENABLED="1" FIX_CENTER="0" FX="857.12" FY="857.50999999999999" IMMUTABLE="0" K4="1.7398640000000001" K5="0.399007" K6="-0.013342" QUAD_ASPECT_RATIO="0" R2="1.358914" R4="0.123435" R6="-0.0091129999999999996" ReprError="0.52066329210560447" S1="0.001026" S2="-6.6000000000000005e-05" S3="-0.00019000000000000001" S4="-9.7999999999999997e-05" TANG_DIST="1" TAUX="-3.0000000000000001e-05" TAUY="-5.0000000000000002e-05" TX="0.000184" TY="-0.000388"/> + <INTRINSIC_PARAMETERS CALIB_FILES="" ENABLED="1" EXT_MODEL_ENABLED="1" FIX_CENTER="0" IMMUTABLE="0" QUAD_ASPECT_RATIO="0" TANG_DIST="1"> + <OLD_MODEL CX="551.5" CY="383.5" FX="881" FY="881" K4="0" K5="0" K6="0" R2="0" R4="0" R6="0" ReprError="nan" S1="0" S2="0" S3="0" S4="0" TAUX="0" TAUY="0" TX="0" TY="0"/> + <EXT_MODEL CX="947.47000000000003" CY="698.44000000000005" FX="857.12" FY="857.50999999999999" K4="1.739864" K5="0.39900699" K6="-0.013342" R2="1.358914" R4="0.123435" R6="-0.0091129998" ReprError="0.52066332" S1="0.001026" S2="-6.6000001e-05" S3="-0.00019000001" S4="-9.7999997e-05" TAUX="-2.9999999e-05" TAUY="-4.9999999e-05" TX="0.000184" TY="-0.00038799999"/> + </INTRINSIC_PARAMETERS> <EXTRINSIC_PARAMETERS ALTITUDE="535" COORD3D_AXIS_LEN="200" COORD3D_SWAP_X="0" COORD3D_SWAP_Y="0" COORD3D_SWAP_Z="0" COORD3D_TRANS_X="0" COORD3D_TRANS_Y="0" COORD3D_TRANS_Z="0" COORD_DIMENSION="0" EXTERNAL_CALIB_FILE="../01_calibration/before.3dc" EXTR_ROT_1="-2.1949999999999998" EXTR_ROT_2="-2.1869999999999998" EXTR_ROT_3="0.029999999999999999" EXTR_TRANS_1="-1047.981" EXTR_TRANS_2="15.172000000000001" EXTR_TRANS_3="-634.48599999999999" FIX="0" IMMUTABLE_COORD_BOX="0" IMMUTABLE_EXTRINSIC_BOX="0" ROTATE="0" SCALE="100" SHOW="0" SHOW_CALIB_POINTS="0" TRANS_X="0" TRANS_Y="0" UNIT="100" USE_INTRINSIC_CENTER="0"/> <ALIGNMENT_GRID FIX="0" GRID3D_RESOLUTION="100" GRID3D_TRANS_X="0" GRID3D_TRANS_Y="0" GRID3D_TRANS_Z="0" GRID_DIMENSION="0" IMMUTABLE="0" ROTATE="0" SCALE="100" SHOW="0" TRANS_X="0" TRANS_Y="0"/> </CALIBRATION> diff --git a/demo/03_tracking/05_tracking.pet b/demo/03_tracking/05_tracking.pet index 21357d06142b83f6bb310a3c006a8f4b7dbcb4ca..6413308b24b204d1f63785207264c5924df23f52 100644 --- a/demo/03_tracking/05_tracking.pet +++ b/demo/03_tracking/05_tracking.pet @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE PETRACK> -<PETRACK VERSION="0.10.2"> +<PETRACK VERSION="0.10.3"> <MAIN SRC="../00_files/video/video.mp4" STATUS_HEIGHT="0"/> <CONTROL TAB="2"> <CALIBRATION> @@ -11,7 +11,10 @@ <SWAP ENABLED="0" HORIZONTALLY="0" VERTICALLY="0"/> <BG_SUB DELETE="1" DELETE_NUMBER="3" ENABLED="0" FILE="" SHOW="0" UPDATE="0"/> <PATTERN BOARD_SIZE_X="6" BOARD_SIZE_Y="8" SQUARE_SIZE="4.5999999"/> - <INTRINSIC_PARAMETERS CALIB_FILES="" CX="947.47000000000003" CY="698.44000000000005" ENABLED="1" EXT_MODEL_ENABLED="1" FIX_CENTER="0" FX="857.12" FY="857.50999999999999" IMMUTABLE="0" K4="1.7398640000000001" K5="0.399007" K6="-0.013342" QUAD_ASPECT_RATIO="0" R2="1.358914" R4="0.123435" R6="-0.0091129999999999996" ReprError="0.52066329210560447" S1="0.001026" S2="-6.6000000000000005e-05" S3="-0.00019000000000000001" S4="-9.7999999999999997e-05" TANG_DIST="1" TAUX="-3.0000000000000001e-05" TAUY="-5.0000000000000002e-05" TX="0.000184" TY="-0.000388"/> + <INTRINSIC_PARAMETERS CALIB_FILES="" ENABLED="1" EXT_MODEL_ENABLED="1" FIX_CENTER="0" IMMUTABLE="0" QUAD_ASPECT_RATIO="0" TANG_DIST="1"> + <OLD_MODEL CX="551.5" CY="383.5" FX="881" FY="881" K4="0" K5="0" K6="0" R2="0" R4="0" R6="0" ReprError="nan" S1="0" S2="0" S3="0" S4="0" TAUX="0" TAUY="0" TX="0" TY="0"/> + <EXT_MODEL CX="947.47000000000003" CY="698.44000000000005" FX="857.12" FY="857.50999999999999" K4="1.739864" K5="0.39900699" K6="-0.013342" R2="1.358914" R4="0.123435" R6="-0.0091129998" ReprError="0.52066332" S1="0.001026" S2="-6.6000001e-05" S3="-0.00019000001" S4="-9.7999997e-05" TAUX="-2.9999999e-05" TAUY="-4.9999999e-05" TX="0.000184" TY="-0.00038799999"/> + </INTRINSIC_PARAMETERS> <EXTRINSIC_PARAMETERS ALTITUDE="535" COORD3D_AXIS_LEN="200" COORD3D_SWAP_X="0" COORD3D_SWAP_Y="0" COORD3D_SWAP_Z="0" COORD3D_TRANS_X="0" COORD3D_TRANS_Y="0" COORD3D_TRANS_Z="0" COORD_DIMENSION="0" EXTERNAL_CALIB_FILE="../01_calibration/before.3dc" EXTR_ROT_1="-2.1949999999999998" EXTR_ROT_2="-2.1869999999999998" EXTR_ROT_3="0.029999999999999999" EXTR_TRANS_1="-1047.981" EXTR_TRANS_2="15.172000000000001" EXTR_TRANS_3="-634.48599999999999" FIX="0" IMMUTABLE_COORD_BOX="0" IMMUTABLE_EXTRINSIC_BOX="0" ROTATE="0" SCALE="100" SHOW="0" SHOW_CALIB_POINTS="0" TRANS_X="0" TRANS_Y="0" UNIT="100" USE_INTRINSIC_CENTER="0"/> <ALIGNMENT_GRID FIX="0" GRID3D_RESOLUTION="100" GRID3D_TRANS_X="0" GRID3D_TRANS_Y="0" GRID3D_TRANS_Z="0" GRID_DIMENSION="0" IMMUTABLE="0" ROTATE="0" SCALE="100" SHOW="0" TRANS_X="0" TRANS_Y="0"/> </CALIBRATION> diff --git a/demo/03_tracking/06_tracking_with_trajectories.pet b/demo/03_tracking/06_tracking_with_trajectories.pet index f37aa9205b7aba3ec0111b2d682a8aebc0554dbc..f9a8886d22066ff96438001196138fa6b0f330db 100644 --- a/demo/03_tracking/06_tracking_with_trajectories.pet +++ b/demo/03_tracking/06_tracking_with_trajectories.pet @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE PETRACK> -<PETRACK VERSION="0.10.2"> +<PETRACK VERSION="0.10.3"> <MAIN SRC="../00_files/video/video.mp4" STATUS_HEIGHT="0"/> <CONTROL TAB="2"> <CALIBRATION> @@ -11,7 +11,10 @@ <SWAP ENABLED="0" HORIZONTALLY="0" VERTICALLY="0"/> <BG_SUB DELETE="1" DELETE_NUMBER="3" ENABLED="0" FILE="" SHOW="0" UPDATE="0"/> <PATTERN BOARD_SIZE_X="6" BOARD_SIZE_Y="8" SQUARE_SIZE="4.5999999"/> - <INTRINSIC_PARAMETERS CALIB_FILES="" CX="947.47000000000003" CY="698.44000000000005" ENABLED="1" EXT_MODEL_ENABLED="1" FIX_CENTER="0" FX="857.12" FY="857.50999999999999" IMMUTABLE="0" K4="1.7398640000000001" K5="0.399007" K6="-0.013342" QUAD_ASPECT_RATIO="0" R2="1.358914" R4="0.123435" R6="-0.0091129999999999996" ReprError="0.52066329210560447" S1="0.001026" S2="-6.6000000000000005e-05" S3="-0.00019000000000000001" S4="-9.7999999999999997e-05" TANG_DIST="1" TAUX="-3.0000000000000001e-05" TAUY="-5.0000000000000002e-05" TX="0.000184" TY="-0.000388"/> + <INTRINSIC_PARAMETERS CALIB_FILES="" ENABLED="1" EXT_MODEL_ENABLED="1" FIX_CENTER="0" IMMUTABLE="0" QUAD_ASPECT_RATIO="0" TANG_DIST="1"> + <OLD_MODEL CX="551.5" CY="383.5" FX="881" FY="881" K4="0" K5="0" K6="0" R2="0" R4="0" R6="0" ReprError="nan" S1="0" S2="0" S3="0" S4="0" TAUX="0" TAUY="0" TX="0" TY="0"/> + <EXT_MODEL CX="947.47000000000003" CY="698.44000000000005" FX="857.12" FY="857.50999999999999" K4="1.739864" K5="0.39900699" K6="-0.013342" R2="1.358914" R4="0.123435" R6="-0.0091129998" ReprError="0.52066332" S1="0.001026" S2="-6.6000001e-05" S3="-0.00019000001" S4="-9.7999997e-05" TAUX="-2.9999999e-05" TAUY="-4.9999999e-05" TX="0.000184" TY="-0.00038799999"/> + </INTRINSIC_PARAMETERS> <EXTRINSIC_PARAMETERS ALTITUDE="535" COORD3D_AXIS_LEN="200" COORD3D_SWAP_X="0" COORD3D_SWAP_Y="0" COORD3D_SWAP_Z="0" COORD3D_TRANS_X="0" COORD3D_TRANS_Y="0" COORD3D_TRANS_Z="0" COORD_DIMENSION="0" EXTERNAL_CALIB_FILE="../01_calibration/before.3dc" EXTR_ROT_1="-2.1949999999999998" EXTR_ROT_2="-2.1869999999999998" EXTR_ROT_3="0.029999999999999999" EXTR_TRANS_1="-1047.981" EXTR_TRANS_2="15.172000000000001" EXTR_TRANS_3="-634.48599999999999" FIX="0" IMMUTABLE_COORD_BOX="0" IMMUTABLE_EXTRINSIC_BOX="0" ROTATE="0" SCALE="100" SHOW="0" SHOW_CALIB_POINTS="0" TRANS_X="0" TRANS_Y="0" UNIT="100" USE_INTRINSIC_CENTER="0"/> <ALIGNMENT_GRID FIX="0" GRID3D_RESOLUTION="100" GRID3D_TRANS_X="0" GRID3D_TRANS_Y="0" GRID3D_TRANS_Z="0" GRID_DIMENSION="0" IMMUTABLE="0" ROTATE="0" SCALE="100" SHOW="0" TRANS_X="0" TRANS_Y="0"/> </CALIBRATION> diff --git a/demo/04_correcting/07_corrected.pet b/demo/04_correcting/07_corrected.pet index 0b1df104e5b8790413fc0eb8a932935e4572be5e..00dac46391a9ab419c59adf018e49e6e687f5983 100644 --- a/demo/04_correcting/07_corrected.pet +++ b/demo/04_correcting/07_corrected.pet @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE PETRACK> -<PETRACK VERSION="0.10.2"> +<PETRACK VERSION="0.10.3"> <MAIN SRC="../00_files/video/video.mp4" STATUS_HEIGHT="0"/> <CONTROL TAB="2"> <CALIBRATION> @@ -11,7 +11,10 @@ <SWAP ENABLED="0" HORIZONTALLY="0" VERTICALLY="0"/> <BG_SUB DELETE="1" DELETE_NUMBER="3" ENABLED="0" FILE="" SHOW="0" UPDATE="0"/> <PATTERN BOARD_SIZE_X="6" BOARD_SIZE_Y="8" SQUARE_SIZE="4.5999999"/> - <INTRINSIC_PARAMETERS CALIB_FILES="" CX="947.47000000000003" CY="698.44000000000005" ENABLED="1" EXT_MODEL_ENABLED="1" FIX_CENTER="0" FX="857.12" FY="857.50999999999999" IMMUTABLE="0" K4="1.7398640000000001" K5="0.399007" K6="-0.013342" QUAD_ASPECT_RATIO="0" R2="1.358914" R4="0.123435" R6="-0.0091129999999999996" ReprError="0.52066329210560447" S1="0.001026" S2="-6.6000000000000005e-05" S3="-0.00019000000000000001" S4="-9.7999999999999997e-05" TANG_DIST="1" TAUX="-3.0000000000000001e-05" TAUY="-5.0000000000000002e-05" TX="0.000184" TY="-0.000388"/> + <INTRINSIC_PARAMETERS CALIB_FILES="" ENABLED="1" EXT_MODEL_ENABLED="1" FIX_CENTER="0" IMMUTABLE="0" QUAD_ASPECT_RATIO="0" TANG_DIST="1"> + <OLD_MODEL CX="551.5" CY="383.5" FX="881" FY="881" K4="0" K5="0" K6="0" R2="0" R4="0" R6="0" ReprError="nan" S1="0" S2="0" S3="0" S4="0" TAUX="0" TAUY="0" TX="0" TY="0"/> + <EXT_MODEL CX="947.47000000000003" CY="698.44000000000005" FX="857.12" FY="857.50999999999999" K4="1.739864" K5="0.39900699" K6="-0.013342" R2="1.358914" R4="0.123435" R6="-0.0091129998" ReprError="0.52066332" S1="0.001026" S2="-6.6000001e-05" S3="-0.00019000001" S4="-9.7999997e-05" TAUX="-2.9999999e-05" TAUY="-4.9999999e-05" TX="0.000184" TY="-0.00038799999"/> + </INTRINSIC_PARAMETERS> <EXTRINSIC_PARAMETERS ALTITUDE="535" COORD3D_AXIS_LEN="200" COORD3D_SWAP_X="0" COORD3D_SWAP_Y="0" COORD3D_SWAP_Z="0" COORD3D_TRANS_X="0" COORD3D_TRANS_Y="0" COORD3D_TRANS_Z="0" COORD_DIMENSION="0" EXTERNAL_CALIB_FILE="../01_calibration/before.3dc" EXTR_ROT_1="-2.1949999999999998" EXTR_ROT_2="-2.1869999999999998" EXTR_ROT_3="0.029999999999999999" EXTR_TRANS_1="-1047.981" EXTR_TRANS_2="15.172000000000001" EXTR_TRANS_3="-634.48599999999999" FIX="0" IMMUTABLE_COORD_BOX="0" IMMUTABLE_EXTRINSIC_BOX="0" ROTATE="0" SCALE="100" SHOW="0" SHOW_CALIB_POINTS="0" TRANS_X="0" TRANS_Y="0" UNIT="100" USE_INTRINSIC_CENTER="0"/> <ALIGNMENT_GRID FIX="0" GRID3D_RESOLUTION="100" GRID3D_TRANS_X="0" GRID3D_TRANS_Y="0" GRID3D_TRANS_Z="0" GRID_DIMENSION="0" IMMUTABLE="0" ROTATE="0" SCALE="100" SHOW="0" TRANS_X="0" TRANS_Y="0"/> </CALIBRATION> diff --git a/src/calibration/autoCalib.cpp b/src/calibration/autoCalib.cpp index c215e938a8721bd1aa65f58205ed9b1b76a388bd..08c26331ff294e200790950a133e99d15cb2b2c9 100644 --- a/src/calibration/autoCalib.cpp +++ b/src/calibration/autoCalib.cpp @@ -116,12 +116,10 @@ bool AutoCalib::openCalibFiles() * @param quadAspectRatio whether to fix the aspect ratio * @param fixCenter whether to fix the center/focal point * @param tangDist whether to use non-zero tangential distortion - * @param extModel whether to use "extended" calibration model * * @return new parameters or std::nullopt, if no calibration could be done */ -std::optional<IntrinsicCameraParams> -AutoCalib::autoCalib(bool quadAspectRatio, bool fixCenter, bool tangDist, bool extModel) +std::optional<IntrinsicModelsParameters> AutoCalib::autoCalib(bool quadAspectRatio, bool fixCenter, bool tangDist) { if(mMainWindow) { @@ -139,10 +137,13 @@ AutoCalib::autoCalib(bool quadAspectRatio, bool fixCenter, bool tangDist, bool e int flags = 0; std::vector<cv::Point2f> corners; std::vector<std::vector<cv::Point2f>> image_points; - cv::Mat camera_matrix = cv::Mat::eye(3, 3, CV_64F); - cv::Mat dist_coeffs = cv::Mat::zeros(1, 14, CV_64F); + cv::Mat camera_matrix = cv::Mat::eye(3, 3, CV_64F); + cv::Mat distortion_coeffs = cv::Mat::zeros(1, 14, CV_64F); + cv::Mat camera_matrix_ext = cv::Mat::eye(3, 3, CV_64F); + cv::Mat distortion_coeffs_ext = cv::Mat::zeros(1, 14, CV_64F); cv::Mat extr_params; double reproj_errs; + double reproj_errs_ext; cv::Mat view, view_gray; bool found = false; cv::Mat origImg; @@ -259,10 +260,6 @@ AutoCalib::autoCalib(bool quadAspectRatio, bool fixCenter, bool tangDist, bool e { flags |= CV_CALIB_ZERO_TANGENT_DIST; } - if(extModel) - { - flags |= CV_CALIB_RATIONAL_MODEL + CV_CALIB_THIN_PRISM_MODEL + CV_CALIB_TILTED_MODEL; - } bool ok = runCalibration( image_points, @@ -272,10 +269,10 @@ AutoCalib::autoCalib(bool quadAspectRatio, bool fixCenter, bool tangDist, bool e aspect_ratio, flags, camera_matrix, - dist_coeffs, + distortion_coeffs, &reproj_errs); - + SPDLOG_INFO("OLD MODEL CALIBRATION"); SPDLOG_INFO("{}", ok ? "Calibration succeeded." : "Calibration failed."); SPDLOG_INFO("Intrinsic reprojection error is: {:f}", reproj_errs); @@ -286,23 +283,68 @@ AutoCalib::autoCalib(bool quadAspectRatio, bool fixCenter, bool tangDist, bool e SPDLOG_INFO("distortion coefficients:"); SPDLOG_INFO( "r2: {} r4: {} r6: {}", - dist_coeffs.at<double>(0, 0), - dist_coeffs.at<double>(0, 1), - dist_coeffs.at<double>(0, 4)); - SPDLOG_INFO("tx: {} ty: {}", dist_coeffs.at<double>(0, 2), dist_coeffs.at<double>(0, 3)); + distortion_coeffs.at<double>(0, 0), + distortion_coeffs.at<double>(0, 1), + distortion_coeffs.at<double>(0, 4)); + SPDLOG_INFO("tx: {} ty: {}", distortion_coeffs.at<double>(0, 2), distortion_coeffs.at<double>(0, 3)); + SPDLOG_INFO( + "k4: {} k5: {} k6: {}", + distortion_coeffs.at<double>(0, 5), + distortion_coeffs.at<double>(0, 6), + distortion_coeffs.at<double>(0, 7)); + + SPDLOG_INFO( + "s1: {} s2: {} s3: {} s4: {}", + distortion_coeffs.at<double>(0, 8), + distortion_coeffs.at<double>(0, 9), + distortion_coeffs.at<double>(0, 10), + distortion_coeffs.at<double>(0, 11)); + SPDLOG_INFO("taux: {} tauy: {}", distortion_coeffs.at<double>(0, 12), distortion_coeffs.at<double>(0, 13)); + + + flags |= CV_CALIB_RATIONAL_MODEL + CV_CALIB_THIN_PRISM_MODEL + CV_CALIB_TILTED_MODEL; + + bool ok_ext = runCalibration( + image_points, + view.size(), + board_size, + square_size, + aspect_ratio, + flags, + camera_matrix_ext, + distortion_coeffs_ext, + &reproj_errs_ext); + + SPDLOG_INFO("NEW MODEL CALIBRATION"); + SPDLOG_INFO("{}", ok_ext ? "Calibration succeeded." : "Calibration failed."); + SPDLOG_INFO("Intrinsic reprojection error is: {:f}", reproj_errs_ext); + + progress.setValue(mCalibFiles.size()); + + SPDLOG_INFO("camera matrix:\n{}", camera_matrix_ext); + + SPDLOG_INFO("distortion coefficients:"); + SPDLOG_INFO( + "r2: {} r4: {} r6: {}", + distortion_coeffs_ext.at<double>(0, 0), + distortion_coeffs_ext.at<double>(0, 1), + distortion_coeffs_ext.at<double>(0, 4)); + SPDLOG_INFO("tx: {} ty: {}", distortion_coeffs_ext.at<double>(0, 2), distortion_coeffs_ext.at<double>(0, 3)); SPDLOG_INFO( "k4: {} k5: {} k6: {}", - dist_coeffs.at<double>(0, 5), - dist_coeffs.at<double>(0, 6), - dist_coeffs.at<double>(0, 7)); + distortion_coeffs_ext.at<double>(0, 5), + distortion_coeffs_ext.at<double>(0, 6), + distortion_coeffs_ext.at<double>(0, 7)); SPDLOG_INFO( "s1: {} s2: {} s3: {} s4: {}", - dist_coeffs.at<double>(0, 8), - dist_coeffs.at<double>(0, 9), - dist_coeffs.at<double>(0, 10), - dist_coeffs.at<double>(0, 11)); - SPDLOG_INFO("taux: {} tauy: {}", dist_coeffs.at<double>(0, 12), dist_coeffs.at<double>(0, 13)); + distortion_coeffs_ext.at<double>(0, 8), + distortion_coeffs_ext.at<double>(0, 9), + distortion_coeffs_ext.at<double>(0, 10), + distortion_coeffs_ext.at<double>(0, 11)); + SPDLOG_INFO( + "taux: {} tauy: {}", distortion_coeffs_ext.at<double>(0, 12), distortion_coeffs_ext.at<double>(0, 13)); + #ifdef SHOW_CALIB_MAINWINDOW // reset view to animation image @@ -313,13 +355,22 @@ AutoCalib::autoCalib(bool quadAspectRatio, bool fixCenter, bool tangDist, bool e #endif // set calibration values - IntrinsicCameraParams params; - params.cameraMatrix = camera_matrix; - params.cameraMatrix.at<double>(0, 2) += mMainWindow->getImageBorderSize(); - params.cameraMatrix.at<double>(1, 2) += mMainWindow->getImageBorderSize(); - dist_coeffs.convertTo(params.distortionCoeffs, CV_32F); - params.reprojectionError = reproj_errs; - checkParamPlausibility(params); + IntrinsicModelsParameters params; + + params.oldModelParams.cameraMatrix = camera_matrix; + params.oldModelParams.cameraMatrix.at<double>(0, 2) += mMainWindow->getImageBorderSize(); + params.oldModelParams.cameraMatrix.at<double>(1, 2) += mMainWindow->getImageBorderSize(); + distortion_coeffs.convertTo(params.oldModelParams.distortionCoeffs, CV_32F); + params.oldModelParams.reprojectionError = reproj_errs; + checkParamPlausibility(params.oldModelParams); + + params.extModelParams.cameraMatrix = camera_matrix_ext; + params.extModelParams.cameraMatrix.at<double>(0, 2) += mMainWindow->getImageBorderSize(); + params.extModelParams.cameraMatrix.at<double>(1, 2) += mMainWindow->getImageBorderSize(); + distortion_coeffs_ext.convertTo(params.extModelParams.distortionCoeffs, CV_32F); + params.extModelParams.reprojectionError = reproj_errs_ext; + checkParamPlausibility(params.extModelParams); + return params; } return std::nullopt; @@ -337,7 +388,7 @@ AutoCalib::autoCalib(bool quadAspectRatio, bool fixCenter, bool tangDist, bool e * @param aspect_ratio * @param flags[in] Flags for calibration; user input assembled in autoCalib() * @param camera_matrix[out] - * @param dist_coeffs[out] distortion coefficients + * @param distortion_coeffs[out] distortion coefficients * @param reproj_errs[out] * @return */ @@ -349,7 +400,7 @@ int AutoCalib::runCalibration( float aspect_ratio, int flags, cv::Mat &camera_matrix, - cv::Mat &dist_coeffs, + cv::Mat &distortion_coeffs, double *reproj_errs) { int code; @@ -384,7 +435,7 @@ int AutoCalib::runCalibration( // (some methods generate less coefficients than others/ normal vs. extended model) for(int i = 0; i < dist_coeffs_out.cols; ++i) { - dist_coeffs.at<double>(i) = dist_coeffs_out.at<double>(i); + distortion_coeffs.at<double>(i) = dist_coeffs_out.at<double>(i); } code = 1; diff --git a/src/calibration/autoCalib.h b/src/calibration/autoCalib.h index 4c9dcea4c03997575610b7404ad06c17708de98e..7d0256c3a69de8120dec36fd82c24c934424e569 100644 --- a/src/calibration/autoCalib.h +++ b/src/calibration/autoCalib.h @@ -28,6 +28,7 @@ class Petrack; + /** * @brief Class for intrinsic calibration * @@ -82,8 +83,8 @@ public: inline void setLastDir(QString path) { mLastDir = path; } inline QString getLastDir() const { return mLastDir; } - std::optional<IntrinsicCameraParams> autoCalib(bool quadAspectRatio, bool fixCenter, bool tangDist, bool extModel); - void checkParamPlausibility(IntrinsicCameraParams &modelParams); + virtual std::optional<IntrinsicModelsParameters> autoCalib(bool quadAspectRatio, bool fixCenter, bool tangDist); + void checkParamPlausibility(IntrinsicCameraParams &modelParams); private: int runCalibration( @@ -94,7 +95,7 @@ private: float aspect_ratio, int flags, cv::Mat &camera_matrix, - cv::Mat &dist_coeffs, + cv::Mat &distortion_coeffs, double *reproj_errs); Petrack *mMainWindow; diff --git a/src/calibration/extrinsicParameters.h b/src/calibration/extrinsicParameters.h index 6d2175cfa3679547385f389f824b8c2095d4fb79..06dfe517515e82745a0658368a8f6bcc9cda6351 100644 --- a/src/calibration/extrinsicParameters.h +++ b/src/calibration/extrinsicParameters.h @@ -34,6 +34,7 @@ struct ExtrinsicParameters return lhs.rot1 == rhs.rot1 && lhs.rot2 == rhs.rot2 && lhs.rot3 == rhs.rot3 && lhs.trans1 == rhs.trans1 && lhs.trans2 == rhs.trans2 && lhs.trans3 == rhs.trans3; } + friend bool operator!=(const ExtrinsicParameters &lhs, const ExtrinsicParameters &rhs) { return !(lhs == rhs); } }; #endif // EXTRINSICPARAMETERS_H diff --git a/src/calibration/intrinsicCameraParams.h b/src/calibration/intrinsicCameraParams.h index 0144cdea24536f1fc86991440781f8d9401c858b..8a16bea1fd78d13af10acf718298663fa61653a9 100644 --- a/src/calibration/intrinsicCameraParams.h +++ b/src/calibration/intrinsicCameraParams.h @@ -19,6 +19,7 @@ #ifndef INTRINSICCAMERAPARAMS_H #define INTRINSICCAMERAPARAMS_H + #include <QMetaType> #include <opencv2/core.hpp> @@ -42,7 +43,18 @@ */ struct IntrinsicCameraParams { - IntrinsicCameraParams() {} + IntrinsicCameraParams() + { + constexpr double defaultFocalLength = 881; + constexpr double defaultCx = 551.5; + constexpr double defaultCy = 383.5; + setFx(defaultFocalLength); + setFy(defaultFocalLength); + setCx(defaultCx); + setCy(defaultCy); + + // distortionCoeffs already 0-initalized + } IntrinsicCameraParams(const IntrinsicCameraParams &other); IntrinsicCameraParams(IntrinsicCameraParams &&other) = default; IntrinsicCameraParams &operator=(const IntrinsicCameraParams &other); @@ -65,16 +77,107 @@ struct IntrinsicCameraParams double getFy() const { return cameraMatrix.at<double>(1, 1); } void setFy(double val) { cameraMatrix.at<double>(1, 1) = val; } + float getR2() const { return distortionCoeffs.at<float>(0); } + void setR2(float val) { distortionCoeffs.at<float>(0) = val; } + + float getR4() const { return distortionCoeffs.at<float>(1); } + void setR4(float val) { distortionCoeffs.at<float>(1) = val; } + + float getR6() const { return distortionCoeffs.at<float>(4); } + void setR6(float val) { distortionCoeffs.at<float>(4) = val; } + + float getTx() const { return distortionCoeffs.at<float>(2); } + void setTx(float val) { distortionCoeffs.at<float>(2) = val; } + + float getTy() const { return distortionCoeffs.at<float>(3); } + void setTy(float val) { distortionCoeffs.at<float>(3) = val; } + + float getK4() const { return distortionCoeffs.at<float>(5); } + void setK4(float val) { distortionCoeffs.at<float>(5) = val; } + + float getK5() const { return distortionCoeffs.at<float>(6); } + void setK5(float val) { distortionCoeffs.at<float>(6) = val; } + + float getK6() const { return distortionCoeffs.at<float>(7); } + void setK6(float val) { distortionCoeffs.at<float>(7) = val; } + + float getS1() const { return distortionCoeffs.at<float>(8); } + void setS1(float val) { distortionCoeffs.at<float>(8) = val; } + + float getS2() const { return distortionCoeffs.at<float>(9); } + void setS2(float val) { distortionCoeffs.at<float>(9) = val; } + + float getS3() const { return distortionCoeffs.at<float>(10); } + void setS3(float val) { distortionCoeffs.at<float>(10) = val; } + + float getS4() const { return distortionCoeffs.at<float>(11); } + void setS4(float val) { distortionCoeffs.at<float>(11) = val; } + + float getTaux() const { return distortionCoeffs.at<float>(12); } + void setTaux(float val) { distortionCoeffs.at<float>(12) = val; } + + float getTauy() const { return distortionCoeffs.at<float>(13); } + void setTauy(float val) { distortionCoeffs.at<float>(13) = val; } + + float getReprojectionError() const { return reprojectionError; } + void setReprojectionError(float val) { reprojectionError = val; } friend bool operator==(const IntrinsicCameraParams &lhs, const IntrinsicCameraParams &rhs) { const bool eqCamMat = cv::countNonZero(lhs.cameraMatrix != rhs.cameraMatrix) == 0; const bool eqDist = cv::countNonZero(lhs.distortionCoeffs != rhs.distortionCoeffs) == 0; - - return eqCamMat && eqDist && (lhs.reprojectionError == rhs.reprojectionError); + bool eqReprError; + if(qIsNaN(lhs.reprojectionError) && qIsNaN(rhs.reprojectionError)) + { + eqReprError = true; + } + else if(!qIsNaN(lhs.reprojectionError) && !qIsNaN(rhs.reprojectionError)) + { + eqReprError = lhs.reprojectionError == rhs.reprojectionError; + } + else + { + return false; + } + return eqCamMat && eqDist && eqReprError; } friend bool operator!=(const IntrinsicCameraParams &lhs, const IntrinsicCameraParams &rhs) { return !(lhs == rhs); } + + friend std::ostream &operator<<(std::ostream &os, IntrinsicCameraParams params) + { + os << "Camera params: " << std::endl; + os << params.getFx() << " " << params.cameraMatrix.at<double>(0, 1) << " " << params.getCx() << std::endl; + os << params.cameraMatrix.at<double>(1, 0) << " " << params.getFy() << " " << params.getCy() << std::endl; + os << params.cameraMatrix.at<double>(2, 0) << " " << params.cameraMatrix.at<double>(2, 1) << " " + << params.cameraMatrix.at<double>(2, 2) << std::endl; + + os << "Distortion params: " << std::endl; + os << params.getR2() << " " << params.getR4() << " " << params.getTx() << " " << params.getTy() << " " + << params.getR6() << " " << params.getK4() << " " << params.getK5() << " " << params.getK6() << " " + << params.getS1() << " " << params.getS2() << " " << params.getS3() << " " << params.getS4() << " " + << params.getTaux() << " " << params.getTauy() << std::endl; + os << "Reprojection Error: " << params.reprojectionError << std::endl; + return os; + } +}; + +struct IntrinsicModelsParameters +{ + IntrinsicCameraParams oldModelParams; + IntrinsicCameraParams extModelParams; + + friend bool operator==(const IntrinsicModelsParameters &lhs, const IntrinsicModelsParameters &rhs) + { + bool eqOldModel = lhs.oldModelParams == rhs.oldModelParams; + bool eqExtModel = lhs.extModelParams == rhs.extModelParams; + return eqOldModel && eqExtModel; + } + + friend bool operator!=(const IntrinsicModelsParameters &lhs, const IntrinsicModelsParameters &rhs) + { + return !(lhs == rhs); + } }; Q_DECLARE_METATYPE(IntrinsicCameraParams) diff --git a/src/petrack.cpp b/src/petrack.cpp index e77d2f22e2dd7c07a026622418cee43247de4ac9..447547b4137c2fe0c8f40065f550952dd2f6960a 100644 --- a/src/petrack.cpp +++ b/src/petrack.cpp @@ -142,8 +142,8 @@ Petrack::Petrack(QString petrackVersion) : *getSwapFilter(), updateImageCallback); - auto *intrinsicBox = new IntrinsicBox(this, *getAutoCalib(), *getCalibFilter(), updateImageCallback); auto *extrinsicBox = new ExtrinsicBox(this, *getExtrCalibration()); + auto *intrinsicBox = new IntrinsicBox(this, *getAutoCalib(), *getCalibFilter(), *extrinsicBox, updateImageCallback); mImageItem = new ImageItem(this, nullptr); auto *coordSysBox = new CoordinateSystemBox( this, @@ -812,7 +812,6 @@ void Petrack::openProject(QString fileName, bool openSeq) // default fileName="" return; } mLastTrackerExport = mTrcFileName; - updateWindowTitle(); } } diff --git a/src/ui/main-windows/control.cpp b/src/ui/main-windows/control.cpp index 1b0e059d402cd38b656815ed89083c4294117484..0274dda615d8b8e91648ae5dcadcdecaf344b22d 100644 --- a/src/ui/main-windows/control.cpp +++ b/src/ui/main-windows/control.cpp @@ -151,7 +151,6 @@ Control::Control( auto *gridPBox = new PGroupBox(this, "alignment grid", mGrid); ui->verticalLayout_13->insertWidget(4, gridPBox); - // integrate new widgets in tabbing order QWidget::setTabOrder(mFilterBefore, mIntr); QWidget::setTabOrder(mIntr, mExtr); diff --git a/src/ui/main-windows/intrinsicBox.cpp b/src/ui/main-windows/intrinsicBox.cpp index 59ca0de97490014e6bc51b10db6e8422024aeea2..b9c260970e1906988c2db87cc287fc56193b3085 100644 --- a/src/ui/main-windows/intrinsicBox.cpp +++ b/src/ui/main-windows/intrinsicBox.cpp @@ -20,6 +20,7 @@ #include "autoCalib.h" #include "calibFilter.h" +#include "extrinsicBox.h" #include "helper.h" #include "pGroupBox.h" #include "pMessageBox.h" @@ -32,8 +33,9 @@ IntrinsicBox::IntrinsicBox( QWidget *parent, AutoCalib &autoCalib, CalibFilter &calibFilter, + ExtrinsicBox &extrBox, std::function<void()> updateImageCallback) : - IntrinsicBox(parent, new Ui::IntrinsicBox(), autoCalib, calibFilter, updateImageCallback) + IntrinsicBox(parent, new Ui::IntrinsicBox(), autoCalib, calibFilter, extrBox, updateImageCallback) { } @@ -42,15 +44,16 @@ IntrinsicBox::IntrinsicBox( Ui::IntrinsicBox *ui, AutoCalib &autoCalib, CalibFilter &calibFilter, + ExtrinsicBox &extrBox, std::function<void()> updateImageCallback) : QWidget(parent), mUi(ui), mAutoCalib(autoCalib), mCalibFilter(calibFilter), + mExtrBox(extrBox), mUpdateImageCallback(std::move(updateImageCallback)) { mUi->setupUi(this); - connect(mUi->extModelCheckBox, &QCheckBox::stateChanged, this, &IntrinsicBox::on_extModelCheckBox_stateChanged); connect(mUi->autoCalib, &QPushButton::clicked, this, &IntrinsicBox::runAutoCalib); connect(mUi->quadAspectRatio, &QCheckBox::clicked, this, &IntrinsicBox::showRecalibrationDialog); connect(mUi->fixCenter, &QCheckBox::clicked, this, &IntrinsicBox::showRecalibrationDialog); @@ -58,7 +61,9 @@ IntrinsicBox::IntrinsicBox( // apply intrinsic mUi->apply->setCheckState(mCalibFilter.getEnabled() ? Qt::Checked : Qt::Unchecked); - setIntrinsicCameraParams(mCalibFilter.getCamParams().getValue()); + mModelsParams.oldModelParams = IntrinsicCameraParams{}; + mModelsParams.extModelParams = IntrinsicCameraParams{}; + applyCurrentModelParamsToUi(); setCalibSettings(); // FocusPolicy: TabFocus and first ui-element as proxy are needed for tab order setFocusProxy(mUi->apply); @@ -69,71 +74,54 @@ IntrinsicBox::~IntrinsicBox() delete mUi; } -void IntrinsicBox::setIntrinsicCameraParams(const IntrinsicCameraParams ¶ms) +void IntrinsicBox::setIntrinsicCameraParams(const IntrinsicModelsParameters params) { - if(params == mParams) + if(params == mModelsParams) { - // do not send signal if value hasn't changed return; } + mModelsParams = params; + applyCurrentModelParamsToUi(); +} +void IntrinsicBox::setCurrentIntrinsicCameraParameters(const IntrinsicCameraParams params) +{ + if(mUi->extModelCheckBox->isChecked()) { - // don't want to send signals for intermediate params - const QSignalBlocker blocker(this); - - setValue(mUi->fx, params.getFx()); - setValue(mUi->fy, params.getFy()); - setValue(mUi->cx, params.getCx()); - setValue(mUi->cy, params.getCy()); - setValue(mUi->r2, static_cast<double>(params.distortionCoeffs.at<float>(0))); - setValue(mUi->r4, static_cast<double>(params.distortionCoeffs.at<float>(1))); - setValue(mUi->tx, static_cast<double>(params.distortionCoeffs.at<float>(2))); - setValue(mUi->ty, static_cast<double>(params.distortionCoeffs.at<float>(3))); - setValue(mUi->r6, static_cast<double>(params.distortionCoeffs.at<float>(4))); - setValue(mUi->k4, static_cast<double>(params.distortionCoeffs.at<float>(5))); - setValue(mUi->k5, static_cast<double>(params.distortionCoeffs.at<float>(6))); - setValue(mUi->k6, static_cast<double>(params.distortionCoeffs.at<float>(7))); - setValue(mUi->s1, static_cast<double>(params.distortionCoeffs.at<float>(8))); - setValue(mUi->s2, static_cast<double>(params.distortionCoeffs.at<float>(9))); - setValue(mUi->s3, static_cast<double>(params.distortionCoeffs.at<float>(10))); - setValue(mUi->s4, static_cast<double>(params.distortionCoeffs.at<float>(11))); - setValue(mUi->taux, static_cast<double>(params.distortionCoeffs.at<float>(12))); - setValue(mUi->tauy, static_cast<double>(params.distortionCoeffs.at<float>(13))); - - if(params.reprojectionError == std::numeric_limits<float>::quiet_NaN()) - { - mUi->intrError->setText(QString("invalid")); - } - else - { - mUi->intrError->setText(QString("%1").arg(params.reprojectionError)); - } - - // needed here because I surpress signals - mParams = params; + mModelsParams.extModelParams = params; + } + else + { + mModelsParams.oldModelParams = params; } - emit paramsChanged(mParams); + applyCurrentModelParamsToUi(); } void IntrinsicBox::imageSizeChanged(int width, int height, int borderDiff) { - const double cX = mParams.getCx(); - const double cY = mParams.getCy(); + IntrinsicCameraParams params = getIntrinsicCameraParams(); mCxFixed = (width - 1) / 2.; mCyFixed = (height - 1) / 2.; - if(mUi->fixCenter->isChecked()) { - mUi->cx->setValue(mCxFixed); - mUi->cy->setValue(mCyFixed); + mModelsParams.oldModelParams.setCx(mCxFixed); + mModelsParams.oldModelParams.setCy(mCyFixed); + mModelsParams.extModelParams.setCx(mCxFixed); + mModelsParams.extModelParams.setCy(mCyFixed); + setValueBlocked(mUi->cx, mCxFixed); + setValueBlocked(mUi->cy, mCyFixed); } else { try { - setValue(mUi->cx, cX + borderDiff); - setValue(mUi->cy, cY + borderDiff); + mModelsParams.oldModelParams.setCx(mModelsParams.oldModelParams.getCx() + borderDiff); + mModelsParams.oldModelParams.setCy(mModelsParams.oldModelParams.getCy() + borderDiff); + mModelsParams.extModelParams.setCx(mModelsParams.extModelParams.getCx() + borderDiff); + mModelsParams.extModelParams.setCy(mModelsParams.extModelParams.getCy() + borderDiff); + setValueBlocked(mUi->cx, params.getCx() + borderDiff); + setValueBlocked(mUi->cy, params.getCy() + borderDiff); } catch(std::domain_error &) { @@ -143,6 +131,125 @@ void IntrinsicBox::imageSizeChanged(int width, int height, int borderDiff) "The image has a different size for which the current values for cx and cy are not valid anymore."); } } + emit paramsChanged(getIntrinsicCameraParams()); +} + +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(); + } + } + return params; +} + +void IntrinsicBox::loadCalibFiles(QDomElement &subSubElem) +{ + if(subSubElem.hasAttribute("CALIB_FILES")) + { + QStringList fl = (subSubElem.attribute("CALIB_FILES")).split(","); + QString tmpStr; + for(int i = 0; i < fl.size(); ++i) + { + if((fl[i] = fl[i].trimmed()) == "") + { + fl.removeAt(i); + } + else + { + tmpStr = getExistingFile(fl[i]); + if(tmpStr != "") + { + fl[i] = tmpStr; + } + } + } + // auch setzen, wenn leer, vielleicht ist das ja gewuenscht + mAutoCalib.setCalibFiles(fl); + if(!fl.isEmpty()) + { + mUi->autoCalib->setEnabled(true); + } + } } bool IntrinsicBox::getXml(QDomElement &subSubElem) @@ -164,135 +271,39 @@ bool IntrinsicBox::getXml(QDomElement &subSubElem) } else if(subSubElem.tagName() == "INTRINSIC_PARAMETERS") { - IntrinsicCameraParams params; - if(subSubElem.hasAttribute("ENABLED")) - { - mUi->apply->setChecked(subSubElem.attribute("ENABLED").toInt()); - } - if(subSubElem.hasAttribute("FX")) - { - params.setFx(subSubElem.attribute("FX").toDouble()); - } - if(subSubElem.hasAttribute("FY")) - { - params.setFy(subSubElem.attribute("FY").toDouble()); - } - if(subSubElem.hasAttribute("CX")) - { - params.setCx(subSubElem.attribute("CX").toDouble()); - } - if(subSubElem.hasAttribute("CY")) - { - params.setCy(subSubElem.attribute("CY").toDouble()); - } - if(subSubElem.hasAttribute("R2")) - { - params.distortionCoeffs.at<float>(0) = subSubElem.attribute("R2").toDouble(); - } - if(subSubElem.hasAttribute("R4")) - { - params.distortionCoeffs.at<float>(1) = subSubElem.attribute("R4").toDouble(); - } - if(subSubElem.hasAttribute("R6")) - { - params.distortionCoeffs.at<float>(4) = subSubElem.attribute("R6").toDouble(); - } - if(subSubElem.hasAttribute("TX")) - { - params.distortionCoeffs.at<float>(2) = subSubElem.attribute("TX").toDouble(); - } - if(subSubElem.hasAttribute("TY")) - { - params.distortionCoeffs.at<float>(3) = subSubElem.attribute("TY").toDouble(); - } - if(subSubElem.hasAttribute("K4")) - { - params.distortionCoeffs.at<float>(5) = subSubElem.attribute("K4").toDouble(); - } - if(subSubElem.hasAttribute("K5")) - { - params.distortionCoeffs.at<float>(6) = subSubElem.attribute("K5").toDouble(); - } - if(subSubElem.hasAttribute("K6")) - { - params.distortionCoeffs.at<float>(7) = subSubElem.attribute("K6").toDouble(); - } - if(subSubElem.hasAttribute("S1")) - { - params.distortionCoeffs.at<float>(8) = subSubElem.attribute("S1").toDouble(); - } - if(subSubElem.hasAttribute("S2")) - { - params.distortionCoeffs.at<float>(9) = subSubElem.attribute("S2").toDouble(); - } - if(subSubElem.hasAttribute("S3")) - { - params.distortionCoeffs.at<float>(10) = subSubElem.attribute("S3").toDouble(); - } - if(subSubElem.hasAttribute("S4")) - { - params.distortionCoeffs.at<float>(11) = subSubElem.attribute("S4").toDouble(); - } - if(subSubElem.hasAttribute("TAUX")) - { - params.distortionCoeffs.at<float>(12) = subSubElem.attribute("TAUX").toDouble(); - } - if(subSubElem.hasAttribute("TAUY")) - { - params.distortionCoeffs.at<float>(13) = subSubElem.attribute("TAUY").toDouble(); - } - if(subSubElem.hasAttribute("ReprError")) - { - bool conversionSuccessful; - params.reprojectionError = subSubElem.attribute("ReprError").toDouble(&conversionSuccessful); - if(!conversionSuccessful) - { - // Qt sets to inf instead of nan - params.reprojectionError = std::numeric_limits<double>::quiet_NaN(); - } - } - if(subSubElem.hasAttribute("QUAD_ASPECT_RATIO")) - { - mUi->quadAspectRatio->setChecked(subSubElem.attribute("QUAD_ASPECT_RATIO").toInt()); - } - if(subSubElem.hasAttribute("FIX_CENTER")) - { - mUi->fixCenter->setChecked(subSubElem.attribute("FIX_CENTER").toInt()); - } - if(subSubElem.hasAttribute("TANG_DIST")) - { - mUi->tangDist->setChecked(subSubElem.attribute("TANG_DIST").toInt()); - } - if(subSubElem.hasAttribute("EXT_MODEL_ENABLED")) - { - mUi->extModelCheckBox->setChecked(subSubElem.attribute("EXT_MODEL_ENABLED").toInt()); - } - if(subSubElem.hasAttribute("CALIB_FILES")) + loadValue(subSubElem, "ENABLED", mUi->apply); + // 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); + + if(subSubElem.elementsByTagName("OLD_MODEL").isEmpty()) { - QStringList fl = (subSubElem.attribute("CALIB_FILES")).split(","); - QString tmpStr; - for(int i = 0; i < fl.size(); ++i) + // old file with only one model + if(subSubElem.hasAttribute("EXT_MODEL_ENABLED") && subSubElem.attribute("EXT_MODEL_ENABLED").toInt()) { - if((fl[i] = fl[i].trimmed()) == "") - { - fl.removeAt(i); - } - else - { - tmpStr = getExistingFile(fl[i]); - if(tmpStr != "") - { - fl[i] = tmpStr; - } - } + mModelsParams.extModelParams = getXmlParams(subSubElem); + mModelsParams.oldModelParams = IntrinsicCameraParams{}; } - // auch setzen, wenn leer, vielleicht ist das ja gewuenscht - mAutoCalib.setCalibFiles(fl); - if(!fl.isEmpty()) + else { - mUi->autoCalib->setEnabled(true); + mModelsParams.oldModelParams = getXmlParams(subSubElem); + mModelsParams.extModelParams = IntrinsicCameraParams{}; } } + else + { + // new file with multiple models saved + mModelsParams.extModelParams = getXmlParams(subSubElem.firstChildElement("EXT_MODEL")); + mModelsParams.oldModelParams = getXmlParams(subSubElem.firstChildElement("OLD_MODEL")); + } + checkModelParams(mModelsParams.oldModelParams); + checkModelParams(mModelsParams.extModelParams); + + loadValue(subSubElem, "EXT_MODEL_ENABLED", mUi->extModelCheckBox); + + loadCalibFiles(subSubElem); const QDomElement root = subSubElem.ownerDocument().firstChildElement("PETRACK"); @@ -317,10 +328,20 @@ bool IntrinsicBox::getXml(QDomElement &subSubElem) mUi->extModelCheckBox->setChecked(true); } } - - setIntrinsicCameraParams(params); + if(newerThanVersion(QString("0.10.3"), root.attribute("VERSION"))) + { + IntrinsicCameraParams standardParams{}; + if(mModelsParams.oldModelParams == standardParams || mModelsParams.extModelParams == standardParams) + { + PWarning( + this, + tr("PeTrack"), + tr("You are using a project version that only uses one calibration model. To use both, you need to " + "recalibrate")); + } + } + applyCurrentModelParamsToUi(); setCalibSettings(); - if(subSubElem.hasAttribute("IMMUTABLE")) { if(this->parent()) @@ -350,26 +371,52 @@ void IntrinsicBox::setXml(QDomElement &subElem) const subSubElem = (subElem.ownerDocument()).createElement("INTRINSIC_PARAMETERS"); subSubElem.setAttribute("ENABLED", mUi->apply->isChecked()); - subSubElem.setAttribute("FX", mUi->fx->value()); - subSubElem.setAttribute("FY", mUi->fy->value()); - subSubElem.setAttribute("CX", mUi->cx->value()); - subSubElem.setAttribute("CY", mUi->cy->value()); - subSubElem.setAttribute("R2", mUi->r2->value()); - subSubElem.setAttribute("R4", mUi->r4->value()); - subSubElem.setAttribute("R6", mUi->r6->value()); - subSubElem.setAttribute("TX", mUi->tx->value()); - subSubElem.setAttribute("TY", mUi->ty->value()); - subSubElem.setAttribute("K4", mUi->k4->value()); - subSubElem.setAttribute("K5", mUi->k5->value()); - subSubElem.setAttribute("K6", mUi->k6->value()); - subSubElem.setAttribute("S1", mUi->s1->value()); - subSubElem.setAttribute("S2", mUi->s2->value()); - subSubElem.setAttribute("S3", mUi->s3->value()); - subSubElem.setAttribute("S4", mUi->s4->value()); - subSubElem.setAttribute("TAUX", mUi->taux->value()); - subSubElem.setAttribute("TAUY", mUi->tauy->value()); - subSubElem.setAttribute("ReprError", mParams.reprojectionError); + auto subSubSubElem = (subSubElem.ownerDocument()).createElement("OLD_MODEL"); + subSubSubElem.setAttribute("FX", mModelsParams.oldModelParams.getFx()); + subSubSubElem.setAttribute("FY", mModelsParams.oldModelParams.getFy()); + subSubSubElem.setAttribute("CX", mModelsParams.oldModelParams.getCx()); + subSubSubElem.setAttribute("CY", mModelsParams.oldModelParams.getCy()); + subSubSubElem.setAttribute("R2", mModelsParams.oldModelParams.getR2()); + subSubSubElem.setAttribute("R4", mModelsParams.oldModelParams.getR4()); + subSubSubElem.setAttribute("R6", mModelsParams.oldModelParams.getR6()); + subSubSubElem.setAttribute("TX", mModelsParams.oldModelParams.getTx()); + subSubSubElem.setAttribute("TY", mModelsParams.oldModelParams.getTy()); + subSubSubElem.setAttribute("K4", mModelsParams.oldModelParams.getK4()); + subSubSubElem.setAttribute("K5", mModelsParams.oldModelParams.getK5()); + subSubSubElem.setAttribute("K6", mModelsParams.oldModelParams.getK6()); + subSubSubElem.setAttribute("S1", mModelsParams.oldModelParams.getS1()); + subSubSubElem.setAttribute("S2", mModelsParams.oldModelParams.getS2()); + subSubSubElem.setAttribute("S3", mModelsParams.oldModelParams.getS3()); + subSubSubElem.setAttribute("S4", mModelsParams.oldModelParams.getS4()); + subSubSubElem.setAttribute("TAUX", mModelsParams.oldModelParams.getTaux()); + subSubSubElem.setAttribute("TAUY", mModelsParams.oldModelParams.getTauy()); + subSubSubElem.setAttribute("ReprError", mModelsParams.oldModelParams.getReprojectionError()); + + subSubElem.appendChild(subSubSubElem); + + subSubSubElem = (subSubElem.ownerDocument()).createElement("EXT_MODEL"); + subSubSubElem.setAttribute("FX", mModelsParams.extModelParams.getFx()); + subSubSubElem.setAttribute("FY", mModelsParams.extModelParams.getFy()); + subSubSubElem.setAttribute("CX", mModelsParams.extModelParams.getCx()); + subSubSubElem.setAttribute("CY", mModelsParams.extModelParams.getCy()); + subSubSubElem.setAttribute("R2", mModelsParams.extModelParams.getR2()); + subSubSubElem.setAttribute("R4", mModelsParams.extModelParams.getR4()); + subSubSubElem.setAttribute("R6", mModelsParams.extModelParams.getR6()); + subSubSubElem.setAttribute("TX", mModelsParams.extModelParams.getTx()); + subSubSubElem.setAttribute("TY", mModelsParams.extModelParams.getTy()); + subSubSubElem.setAttribute("K4", mModelsParams.extModelParams.getK4()); + subSubSubElem.setAttribute("K5", mModelsParams.extModelParams.getK5()); + subSubSubElem.setAttribute("K6", mModelsParams.extModelParams.getK6()); + subSubSubElem.setAttribute("S1", mModelsParams.extModelParams.getS1()); + subSubSubElem.setAttribute("S2", mModelsParams.extModelParams.getS2()); + subSubSubElem.setAttribute("S3", mModelsParams.extModelParams.getS3()); + subSubSubElem.setAttribute("S4", mModelsParams.extModelParams.getS4()); + subSubSubElem.setAttribute("TAUX", mModelsParams.extModelParams.getTaux()); + subSubSubElem.setAttribute("TAUY", mModelsParams.extModelParams.getTauy()); + subSubSubElem.setAttribute("ReprError", mModelsParams.extModelParams.getReprojectionError()); + + subSubElem.appendChild(subSubSubElem); subSubElem.setAttribute("QUAD_ASPECT_RATIO", mCalibSettings.quadAspectRatio); subSubElem.setAttribute("FIX_CENTER", mCalibSettings.fixCenter); subSubElem.setAttribute("TANG_DIST", mCalibSettings.tangDist); @@ -415,156 +462,172 @@ void IntrinsicBox::showRecalibrationDialog() void IntrinsicBox::on_fx_valueChanged(double d) { - mParams.setFx(d); + IntrinsicCameraParams params = getIntrinsicCameraParams(); + params.setFx(d); + params.reprojectionError = std::numeric_limits<double>::quiet_NaN(); mUi->intrError->setText(QString("invalid")); - mParams.reprojectionError = std::numeric_limits<double>::quiet_NaN(); - emit paramsChanged(mParams); + setCurrentIntrinsicCameraParameters(params); } void IntrinsicBox::on_fy_valueChanged(double d) { - mParams.setFy(d); + IntrinsicCameraParams params = getIntrinsicCameraParams(); + params.setFy(d); + params.reprojectionError = std::numeric_limits<double>::quiet_NaN(); mUi->intrError->setText(QString("invalid")); - mParams.reprojectionError = std::numeric_limits<double>::quiet_NaN(); - emit paramsChanged(mParams); + setCurrentIntrinsicCameraParameters(params); } void IntrinsicBox::on_cx_valueChanged(double d) { - mParams.setCx(d); + IntrinsicCameraParams params = getIntrinsicCameraParams(); + params.setCx(d); + params.reprojectionError = std::numeric_limits<double>::quiet_NaN(); mUi->intrError->setText(QString("invalid")); - mParams.reprojectionError = std::numeric_limits<double>::quiet_NaN(); - emit paramsChanged(mParams); + setCurrentIntrinsicCameraParameters(params); } void IntrinsicBox::on_cy_valueChanged(double d) { - mParams.setCy(d); + IntrinsicCameraParams params = getIntrinsicCameraParams(); + params.setCy(d); + params.reprojectionError = std::numeric_limits<double>::quiet_NaN(); mUi->intrError->setText(QString("invalid")); - mParams.reprojectionError = std::numeric_limits<double>::quiet_NaN(); - emit paramsChanged(mParams); + setCurrentIntrinsicCameraParameters(params); } void IntrinsicBox::on_r2_valueChanged(double d) { - mParams.distortionCoeffs.at<float>(0) = static_cast<float>(d); + IntrinsicCameraParams params = getIntrinsicCameraParams(); + params.setR2(d); + params.reprojectionError = std::numeric_limits<double>::quiet_NaN(); mUi->intrError->setText(QString("invalid")); - mParams.reprojectionError = std::numeric_limits<double>::quiet_NaN(); - emit paramsChanged(mParams); + setCurrentIntrinsicCameraParameters(params); } void IntrinsicBox::on_r4_valueChanged(double d) { - mParams.distortionCoeffs.at<float>(1) = static_cast<float>(d); + IntrinsicCameraParams params = getIntrinsicCameraParams(); + params.setR4(d); + params.reprojectionError = std::numeric_limits<double>::quiet_NaN(); mUi->intrError->setText(QString("invalid")); - mParams.reprojectionError = std::numeric_limits<double>::quiet_NaN(); - emit paramsChanged(mParams); + setCurrentIntrinsicCameraParameters(params); } void IntrinsicBox::on_r6_valueChanged(double d) { - mParams.distortionCoeffs.at<float>(4) = static_cast<float>(d); + IntrinsicCameraParams params = getIntrinsicCameraParams(); + params.setR6(d); + params.reprojectionError = std::numeric_limits<double>::quiet_NaN(); mUi->intrError->setText(QString("invalid")); - mParams.reprojectionError = std::numeric_limits<double>::quiet_NaN(); - emit paramsChanged(mParams); + setCurrentIntrinsicCameraParameters(params); } void IntrinsicBox::on_s1_valueChanged(double d) { - mParams.distortionCoeffs.at<float>(8) = static_cast<float>(d); + IntrinsicCameraParams params = getIntrinsicCameraParams(); + params.setS1(d); + params.reprojectionError = std::numeric_limits<double>::quiet_NaN(); mUi->intrError->setText(QString("invalid")); - mParams.reprojectionError = std::numeric_limits<double>::quiet_NaN(); - emit paramsChanged(mParams); + setCurrentIntrinsicCameraParameters(params); } void IntrinsicBox::on_s2_valueChanged(double d) { - mParams.distortionCoeffs.at<float>(9) = static_cast<float>(d); + IntrinsicCameraParams params = getIntrinsicCameraParams(); + params.setS2(d); + params.reprojectionError = std::numeric_limits<double>::quiet_NaN(); mUi->intrError->setText(QString("invalid")); - mParams.reprojectionError = std::numeric_limits<double>::quiet_NaN(); - emit paramsChanged(mParams); + setCurrentIntrinsicCameraParameters(params); } void IntrinsicBox::on_s3_valueChanged(double d) { - mParams.distortionCoeffs.at<float>(10) = static_cast<float>(d); + IntrinsicCameraParams params = getIntrinsicCameraParams(); + params.setS3(d); + params.reprojectionError = std::numeric_limits<double>::quiet_NaN(); mUi->intrError->setText(QString("invalid")); - mParams.reprojectionError = std::numeric_limits<double>::quiet_NaN(); - emit paramsChanged(mParams); + setCurrentIntrinsicCameraParameters(params); } void IntrinsicBox::on_s4_valueChanged(double d) { - mParams.distortionCoeffs.at<float>(11) = static_cast<float>(d); + IntrinsicCameraParams params = getIntrinsicCameraParams(); + params.setS4(d); + params.reprojectionError = std::numeric_limits<double>::quiet_NaN(); mUi->intrError->setText(QString("invalid")); - mParams.reprojectionError = std::numeric_limits<double>::quiet_NaN(); - emit paramsChanged(mParams); + setCurrentIntrinsicCameraParameters(params); } void IntrinsicBox::on_taux_valueChanged(double d) { - mParams.distortionCoeffs.at<float>(12) = static_cast<float>(d); + IntrinsicCameraParams params = getIntrinsicCameraParams(); + params.setTaux(d); + params.reprojectionError = std::numeric_limits<double>::quiet_NaN(); mUi->intrError->setText(QString("invalid")); - mParams.reprojectionError = std::numeric_limits<double>::quiet_NaN(); - emit paramsChanged(mParams); + setCurrentIntrinsicCameraParameters(params); } void IntrinsicBox::on_tauy_valueChanged(double d) { - mParams.distortionCoeffs.at<float>(13) = static_cast<float>(d); + IntrinsicCameraParams params = getIntrinsicCameraParams(); + params.setTauy(d); + params.reprojectionError = std::numeric_limits<double>::quiet_NaN(); mUi->intrError->setText(QString("invalid")); - mParams.reprojectionError = std::numeric_limits<double>::quiet_NaN(); - emit paramsChanged(mParams); + setCurrentIntrinsicCameraParameters(params); } - - void IntrinsicBox::on_tx_valueChanged(double d) { - mParams.distortionCoeffs.at<float>(2) = static_cast<float>(d); + IntrinsicCameraParams params = getIntrinsicCameraParams(); + params.setTx(d); + params.reprojectionError = std::numeric_limits<double>::quiet_NaN(); mUi->intrError->setText(QString("invalid")); - mParams.reprojectionError = std::numeric_limits<double>::quiet_NaN(); - emit paramsChanged(mParams); + setCurrentIntrinsicCameraParameters(params); } void IntrinsicBox::on_ty_valueChanged(double d) { - mParams.distortionCoeffs.at<float>(3) = static_cast<float>(d); + IntrinsicCameraParams params = getIntrinsicCameraParams(); + params.setTy(d); + params.reprojectionError = std::numeric_limits<double>::quiet_NaN(); mUi->intrError->setText(QString("invalid")); - mParams.reprojectionError = std::numeric_limits<double>::quiet_NaN(); - emit paramsChanged(mParams); + setCurrentIntrinsicCameraParameters(params); } void IntrinsicBox::on_k4_valueChanged(double d) { - mParams.distortionCoeffs.at<float>(5) = static_cast<float>(d); + IntrinsicCameraParams params = getIntrinsicCameraParams(); + params.setK4(d); + params.reprojectionError = std::numeric_limits<double>::quiet_NaN(); mUi->intrError->setText(QString("invalid")); - mParams.reprojectionError = std::numeric_limits<double>::quiet_NaN(); - emit paramsChanged(mParams); + setCurrentIntrinsicCameraParameters(params); } void IntrinsicBox::on_k5_valueChanged(double d) { - mParams.distortionCoeffs.at<float>(6) = static_cast<float>(d); + IntrinsicCameraParams params = getIntrinsicCameraParams(); + params.setK5(d); + params.reprojectionError = std::numeric_limits<double>::quiet_NaN(); mUi->intrError->setText(QString("invalid")); - mParams.reprojectionError = std::numeric_limits<double>::quiet_NaN(); - emit paramsChanged(mParams); + setCurrentIntrinsicCameraParameters(params); } void IntrinsicBox::on_k6_valueChanged(double d) { - mParams.distortionCoeffs.at<float>(7) = static_cast<float>(d); + IntrinsicCameraParams params = getIntrinsicCameraParams(); + params.setK6(d); + params.reprojectionError = std::numeric_limits<double>::quiet_NaN(); mUi->intrError->setText(QString("invalid")); - mParams.reprojectionError = std::numeric_limits<double>::quiet_NaN(); - emit paramsChanged(mParams); + setCurrentIntrinsicCameraParameters(params); } void IntrinsicBox::on_boardSizeX_valueChanged(int x) @@ -592,14 +655,14 @@ void IntrinsicBox::setCalibSettings() void IntrinsicBox::runAutoCalib() { auto params = mAutoCalib.autoCalib( - mUi->quadAspectRatio->isChecked(), - mUi->fixCenter->isChecked(), - mUi->tangDist->isChecked(), - mUi->extModelCheckBox->isChecked()); + mUi->quadAspectRatio->isChecked(), mUi->fixCenter->isChecked(), mUi->tangDist->isChecked()); if(params) { - setIntrinsicCameraParams(params.value()); setCalibSettings(); + IntrinsicModelsParameters validParams = std::move(*params); + mModelsParams.oldModelParams = validParams.oldModelParams; + mModelsParams.extModelParams = validParams.extModelParams; + applyCurrentModelParamsToUi(); } } void IntrinsicBox::on_calibFiles_clicked() @@ -610,34 +673,116 @@ void IntrinsicBox::on_calibFiles_clicked() } } -void IntrinsicBox::on_extModelCheckBox_stateChanged(int i) +void IntrinsicBox::on_extModelCheckBox_stateChanged(int) { - if(i == Qt::Checked) + bool checked = mUi->extModelCheckBox->isChecked(); + + mUi->k4->setEnabled(checked); + mUi->k5->setEnabled(checked); + mUi->k6->setEnabled(checked); + mUi->s1->setEnabled(checked); + mUi->s2->setEnabled(checked); + mUi->s3->setEnabled(checked); + mUi->s4->setEnabled(checked); + mUi->taux->setEnabled(checked); + mUi->tauy->setEnabled(checked); + + applyCurrentModelParamsToUi(); +} + +void IntrinsicBox::on_extModelCheckBox_clicked(bool checked) +{ + // clicked only called in user action + const ExtrinsicParameters standardExtParams{}; + if(standardExtParams != mExtrBox.getExtrinsicParameters()) { - mUi->k4->setEnabled(true); - mUi->k5->setEnabled(true); - mUi->k6->setEnabled(true); - mUi->s1->setEnabled(true); - mUi->s2->setEnabled(true); - mUi->s3->setEnabled(true); - mUi->s4->setEnabled(true); - mUi->taux->setEnabled(true); - mUi->tauy->setEnabled(true); + int ret = PCustom( + this, + tr("PeTrack"), + tr("Using different intrinsic calibration would result in a different extrinsic calibration"), + {"Delete extrinsic calibration", "Keep intrinsic calibration", "Keep invalid extrinsic calibration"}, + "Delete extrinsic calibration"); + if(ret == 0) + { + mExtrBox.setExtrinsicParameters(standardExtParams); + } + else if(ret == 1) + { + mUi->extModelCheckBox->setCheckState(checked ? Qt::Unchecked : Qt::Checked); + } } - else if(i == Qt::Unchecked) +} + +IntrinsicCameraParams IntrinsicBox::getIntrinsicCameraParams() const +{ + if(mUi->extModelCheckBox->isChecked()) { - mUi->k4->setDisabled(true); - mUi->k5->setDisabled(true); - mUi->k6->setDisabled(true); - mUi->s1->setDisabled(true); - mUi->s2->setDisabled(true); - mUi->s3->setDisabled(true); - mUi->s4->setDisabled(true); - mUi->taux->setDisabled(true); - mUi->tauy->setDisabled(true); + return mModelsParams.extModelParams; } - mUi->intrError->setText(QString("invalid")); - mParams.reprojectionError = std::numeric_limits<double>::quiet_NaN(); + else + { + return mModelsParams.oldModelParams; + } +} +IntrinsicModelsParameters IntrinsicBox::getBothIntrinsicCameraParams() const +{ + return mModelsParams; +} +void IntrinsicBox::applyCurrentModelParamsToUi() +{ + IntrinsicCameraParams modelParams = getIntrinsicCameraParams(); + + setValueBlocked(mUi->fx, modelParams.getFx()); + setValueBlocked(mUi->fy, modelParams.getFy()); + setValueBlocked(mUi->cx, modelParams.getCx()); + setValueBlocked(mUi->cy, modelParams.getCy()); + setValueBlocked(mUi->r2, static_cast<double>(modelParams.getR2())); + setValueBlocked(mUi->r4, static_cast<double>(modelParams.getR4())); + setValueBlocked(mUi->tx, static_cast<double>(modelParams.getTx())); + setValueBlocked(mUi->ty, static_cast<double>(modelParams.getTy())); + setValueBlocked(mUi->r6, static_cast<double>(modelParams.getR6())); + setValueBlocked(mUi->k4, static_cast<double>(modelParams.getK4())); + setValueBlocked(mUi->k5, static_cast<double>(modelParams.getK5())); + setValueBlocked(mUi->k6, static_cast<double>(modelParams.getK6())); + setValueBlocked(mUi->s1, static_cast<double>(modelParams.getS1())); + setValueBlocked(mUi->s2, static_cast<double>(modelParams.getS2())); + setValueBlocked(mUi->s3, static_cast<double>(modelParams.getS3())); + setValueBlocked(mUi->s4, static_cast<double>(modelParams.getS4())); + setValueBlocked(mUi->taux, static_cast<double>(modelParams.getTaux())); + setValueBlocked(mUi->tauy, static_cast<double>(modelParams.getTauy())); + + if(qIsNaN(modelParams.reprojectionError)) + { + mUi->intrError->setText(QString("invalid")); + } + else + { + mUi->intrError->setText(QString("%1").arg(modelParams.reprojectionError)); + } + + emit paramsChanged(modelParams); +} + +void IntrinsicBox::checkModelParams(const IntrinsicCameraParams &modelParams) +{ + checkValueValid(mUi->fx, modelParams.getFx()); + checkValueValid(mUi->fy, modelParams.getFy()); + checkValueValid(mUi->cx, modelParams.getCx()); + checkValueValid(mUi->cy, modelParams.getCy()); + checkValueValid(mUi->r2, static_cast<double>(modelParams.getR2())); + checkValueValid(mUi->r4, static_cast<double>(modelParams.getR4())); + checkValueValid(mUi->tx, static_cast<double>(modelParams.getTx())); + checkValueValid(mUi->ty, static_cast<double>(modelParams.getTy())); + checkValueValid(mUi->r6, static_cast<double>(modelParams.getR6())); + checkValueValid(mUi->k4, static_cast<double>(modelParams.getK4())); + checkValueValid(mUi->k5, static_cast<double>(modelParams.getK5())); + checkValueValid(mUi->k6, static_cast<double>(modelParams.getK6())); + checkValueValid(mUi->s1, static_cast<double>(modelParams.getS1())); + checkValueValid(mUi->s2, static_cast<double>(modelParams.getS2())); + checkValueValid(mUi->s3, static_cast<double>(modelParams.getS3())); + checkValueValid(mUi->s4, static_cast<double>(modelParams.getS4())); + checkValueValid(mUi->taux, static_cast<double>(modelParams.getTaux())); + checkValueValid(mUi->tauy, static_cast<double>(modelParams.getTauy())); } void IntrinsicBox::on_quadAspectRatio_stateChanged(int) diff --git a/src/ui/main-windows/intrinsicBox.h b/src/ui/main-windows/intrinsicBox.h index 673fed8e0c8a004b1d2bdd186633f5c2389c12dd..4d9e0a446041773e40b1a95130365c3a6cae6d65 100644 --- a/src/ui/main-windows/intrinsicBox.h +++ b/src/ui/main-windows/intrinsicBox.h @@ -32,6 +32,8 @@ class IntrinsicBox; class CalibFilter; class AutoCalib; class QDomElement; +class ExtrinsicBox; + struct CalibSettings { @@ -49,12 +51,14 @@ public: QWidget *parent, AutoCalib &autoCalib, CalibFilter &calibFilter, + ExtrinsicBox &extrBox, std::function<void()> updateImageCallback); explicit IntrinsicBox( QWidget *parent, Ui::IntrinsicBox *ui, AutoCalib &autoCalib, CalibFilter &calibFilter, + ExtrinsicBox &extrBox, std::function<void()> updateImageCallback); IntrinsicBox(const IntrinsicBox &) = delete; IntrinsicBox(IntrinsicBox &&) = delete; @@ -62,24 +66,30 @@ public: IntrinsicBox &operator=(IntrinsicBox &&) = delete; ~IntrinsicBox() override; - IntrinsicCameraParams getIntrinsicCameraParams() const { return mParams; } - void setIntrinsicCameraParams(const IntrinsicCameraParams ¶ms); - void imageSizeChanged(int width, int height, int borderDiff); - + IntrinsicCameraParams getIntrinsicCameraParams() const; + IntrinsicModelsParameters getBothIntrinsicCameraParams() const; + void setIntrinsicCameraParams(const IntrinsicModelsParameters params); + void setCurrentIntrinsicCameraParameters(IntrinsicCameraParams params); + void applyCurrentModelParamsToUi(); + void checkModelParams(const IntrinsicCameraParams ¶ms); + void imageSizeChanged(int width, int height, int borderDiff); - bool getXml(QDomElement &subSubElem); - void setXml(QDomElement &subSubElem) const; - void setCalibSettings(); + IntrinsicCameraParams getXmlParams(const QDomElement &elem); + bool getXml(QDomElement &subSubElem); + void setXml(QDomElement &subSubElem) const; + void setCalibSettings(); + void loadCalibFiles(QDomElement &subSubElem); signals: void paramsChanged(IntrinsicCameraParams newParams); private slots: void showRecalibrationDialog(); - void on_extModelCheckBox_stateChanged(int i); - void on_quadAspectRatio_stateChanged(int i); - void on_fixCenter_stateChanged(int i); - void on_tangDist_stateChanged(int i); + void on_extModelCheckBox_stateChanged(int); + void on_extModelCheckBox_clicked(bool); + void on_quadAspectRatio_stateChanged(int); + void on_fixCenter_stateChanged(int); + void on_tangDist_stateChanged(int); void on_fx_valueChanged(double d); void on_fy_valueChanged(double d); void on_cx_valueChanged(double d); @@ -109,12 +119,13 @@ public slots: private: - Ui::IntrinsicBox *mUi; - IntrinsicCameraParams mParams; - CalibSettings mCalibSettings; - AutoCalib &mAutoCalib; - CalibFilter &mCalibFilter; - std::function<void()> mUpdateImageCallback; + Ui::IntrinsicBox *mUi; + CalibSettings mCalibSettings; + AutoCalib &mAutoCalib; + CalibFilter &mCalibFilter; + ExtrinsicBox &mExtrBox; + std::function<void()> mUpdateImageCallback; + IntrinsicModelsParameters mModelsParams; double mCxFixed = 0; double mCyFixed = 0; diff --git a/src/util/helper.cpp b/src/util/helper.cpp index 6be9730f2fd02460e2da477fe9de981220473cc4..924e70a9fb203abc7eae5cb0bcc301e7b6e841b4 100644 --- a/src/util/helper.cpp +++ b/src/util/helper.cpp @@ -20,6 +20,7 @@ #include "logger.h" +#include <QCheckBox> #include <opencv2/opencv.hpp> QString proFileName; ///< Path to the project (.pet) file; used for saving relative paths via getFileList and @@ -255,3 +256,32 @@ 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 4ff51f20d908c8100bddc6f8ba9e2379508dba75..5bf460aa4acf945df55da7a99a5674b5f0126e25 100644 --- a/src/util/helper.h +++ b/src/util/helper.h @@ -23,6 +23,8 @@ #include <QString> #include <opencv2/opencv.hpp> +class QCheckBox; + extern const QString commandLineOptionsString; extern QString proFileName; ///< Path to the project (.pet) file; defined in helper.cpp @@ -288,6 +290,8 @@ 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) { @@ -300,4 +304,59 @@ void setValue(T widget, double value) } 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/tests/regression_test/data/00_empty.pet b/tests/regression_test/data/00_empty.pet index 7403a1e233a9f437faf1723113758fba6f07bb96..74e1a4ff6951a6bc21bcc2c2ec3c666712f882e2 100644 --- a/tests/regression_test/data/00_empty.pet +++ b/tests/regression_test/data/00_empty.pet @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE PETRACK> -<PETRACK VERSION="0.10.2"> +<PETRACK VERSION="0.10.3"> <MAIN SRC="" STATUS_HEIGHT="0"/> <CONTROL TAB="0"> <CALIBRATION> @@ -11,7 +11,10 @@ <SWAP ENABLED="0" HORIZONTALLY="0" VERTICALLY="0"/> <BG_SUB DELETE="1" DELETE_NUMBER="3" ENABLED="0" FILE="" SHOW="0" UPDATE="0"/> <PATTERN BOARD_SIZE_X="6" BOARD_SIZE_Y="8" SQUARE_SIZE="4.5999999"/> - <INTRINSIC_PARAMETERS CALIB_FILES="" CX="511.5" CY="383.5" ENABLED="0" EXT_MODEL_ENABLED="0" FIX_CENTER="0" FX="881" FY="881" IMMUTABLE="0" K4="0" K5="0" K6="0" QUAD_ASPECT_RATIO="0" R2="0" R4="0" R6="0" ReprError="nan" S1="0" S2="0" S3="0" S4="0" TANG_DIST="1" TAUX="0" TAUY="0" TX="0" TY="0"/> + <INTRINSIC_PARAMETERS CALIB_FILES="" ENABLED="0" EXT_MODEL_ENABLED="0" FIX_CENTER="0" IMMUTABLE="0" QUAD_ASPECT_RATIO="0" TANG_DIST="1"> + <OLD_MODEL CX="511.5" CY="383.5" FX="881" FY="881" K4="0" K5="0" K6="0" R2="0" R4="0" R6="0" ReprError="nan" S1="0" S2="0" S3="0" S4="0" TAUX="0" TAUY="0" TX="0" TY="0"/> + <EXT_MODEL CX="551.5" CY="383.5" FX="881" FY="881" K4="0" K5="0" K6="0" R2="0" R4="0" R6="0" ReprError="nan" S1="0" S2="0" S3="0" S4="0" TAUX="0" TAUY="0" TX="0" TY="0"/> + </INTRINSIC_PARAMETERS> <EXTRINSIC_PARAMETERS ALTITUDE="535" COORD3D_AXIS_LEN="200" COORD3D_SWAP_X="0" COORD3D_SWAP_Y="0" COORD3D_SWAP_Z="0" COORD3D_TRANS_X="0" COORD3D_TRANS_Y="0" COORD3D_TRANS_Z="0" COORD_DIMENSION="0" EXTERNAL_CALIB_FILE="" EXTR_ROT_1="0" EXTR_ROT_2="0" EXTR_ROT_3="0" EXTR_TRANS_1="0" EXTR_TRANS_2="0" EXTR_TRANS_3="-500" FIX="0" IMMUTABLE_COORD_BOX="0" IMMUTABLE_EXTRINSIC_BOX="0" ROTATE="0" SCALE="100" SHOW="0" SHOW_CALIB_POINTS="0" TRANS_X="0" TRANS_Y="0" UNIT="100" USE_INTRINSIC_CENTER="0"/> <ALIGNMENT_GRID FIX="0" GRID3D_RESOLUTION="100" GRID3D_TRANS_X="0" GRID3D_TRANS_Y="0" GRID3D_TRANS_Z="0" GRID_DIMENSION="0" IMMUTABLE="0" ROTATE="0" SCALE="100" SHOW="0" TRANS_X="0" TRANS_Y="0"/> </CALIBRATION> diff --git a/tests/regression_test/data/01_old_intrinsic_extModel.pet b/tests/regression_test/data/01_old_intrinsic_extModel.pet new file mode 100644 index 0000000000000000000000000000000000000000..ba1aeba83e854a71d3af144c59c060ce64e10596 --- /dev/null +++ b/tests/regression_test/data/01_old_intrinsic_extModel.pet @@ -0,0 +1,97 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE PETRACK> +<PETRACK VERSION="0.10.3"> + <MAIN SRC="" STATUS_HEIGHT="0"/> + <CONTROL TAB="0"> + <CALIBRATION> + <FILTER_BEFORE IMMUTABLE="0"/> + <BRIGHTNESS ENABLED="0" VALUE="0"/> + <CONTRAST ENABLED="0" VALUE="0"/> + <BORDER COLOR="#000000" ENABLED="0" VALUE="0"/> + <SWAP ENABLED="0" HORIZONTALLY="0" VERTICALLY="0"/> + <BG_SUB DELETE="1" DELETE_NUMBER="3" ENABLED="0" FILE="" SHOW="0" UPDATE="0"/> + <PATTERN BOARD_SIZE_X="6" BOARD_SIZE_Y="8" SQUARE_SIZE="4.5999999"/> + <INTRINSIC_PARAMETERS CALIB_FILES="" ENABLED="0" EXT_MODEL_ENABLED="1" FIX_CENTER="0" IMMUTABLE="0" QUAD_ASPECT_RATIO="0" TANG_DIST="1"> + <OLD_MODEL CX="551.5" CY="383.5" FX="881" FY="881" K4="0" K5="0" K6="0" R2="0" R4="0" R6="0" ReprError="nan" S1="0" S2="0" S3="0" S4="0" TAUX="0" TAUY="0" TX="0" TY="0"/> + <EXT_MODEL CX="947.47000000000003" CY="698.44000000000005" FX="857.12" FY="857.50999999999999" K4="1.7399009" K5="0.39905" K6="-0.013337" R2="1.35895" R4="0.123464" R6="-0.0091120005" ReprError="0.52066356" S1="0.001026" S2="-6.6000001e-05" S3="-0.00019000001" S4="-9.7999997e-05" TAUX="-2.9999999e-05" TAUY="-5.0999999e-05" TX="0.000184" TY="-0.00038799999"/> + </INTRINSIC_PARAMETERS> + <EXTRINSIC_PARAMETERS ALTITUDE="535" COORD3D_AXIS_LEN="200" COORD3D_SWAP_X="0" COORD3D_SWAP_Y="0" COORD3D_SWAP_Z="0" COORD3D_TRANS_X="0" COORD3D_TRANS_Y="0" COORD3D_TRANS_Z="0" COORD_DIMENSION="0" EXTERNAL_CALIB_FILE="" EXTR_ROT_1="0" EXTR_ROT_2="0" EXTR_ROT_3="0" EXTR_TRANS_1="0" EXTR_TRANS_2="0" EXTR_TRANS_3="-500" FIX="0" IMMUTABLE_COORD_BOX="0" IMMUTABLE_EXTRINSIC_BOX="0" ROTATE="0" SCALE="100" SHOW="0" SHOW_CALIB_POINTS="0" TRANS_X="0" TRANS_Y="0" UNIT="100" USE_INTRINSIC_CENTER="0"/> + <ALIGNMENT_GRID FIX="0" GRID3D_RESOLUTION="100" GRID3D_TRANS_X="0" GRID3D_TRANS_Y="0" GRID3D_TRANS_Z="0" GRID_DIMENSION="0" IMMUTABLE="0" ROTATE="0" SCALE="100" SHOW="0" TRANS_X="0" TRANS_Y="0"/> + </CALIBRATION> + <RECOGNITION> + <PERFORM ENABLED="0" METHOD="5" STEP="1"/> + <REGION_OF_INTEREST FIX="0" HEIGHT="0" SHOW="0" WIDTH="0" X="0" Y="0"/> + <MARKER BRIGHTNESS="50" IGNORE_WITHOUT="1"/> + <SIZE_COLOR AUTO_WB="0" DEFAULT_HEIGHT="180" GREY_LEVEL="50" MAP_NUMBER="0" MODEL="0" SHOW="1" SYMBOL_SIZE="10" X="0" Y="1" Z="255"> + <MAP COLORED="1" FROM_HUE="0" FROM_SAT="0" FROM_VAL="128" HEIGHT="255" INV_HUE="0" MAP_HEIGHT="180" TO_HUE="359" TO_SAT="255" TO_VAL="255" WIDTH="359" X="0" Y="0"/> + </SIZE_COLOR> + <READ_HEIGHTS HEIGHT_FILE=""/> + <READ_MARKER_IDS MARKER_FILE=""/> + </RECOGNITION> + <TRACKING> + <ONLINE_CALCULATION ENABLED="0"/> + <REPEAT_BELOW ENABLED="1" QUALITY="50"/> + <EXTRAPOLATION ENABLED="1"/> + <MERGE ENABLED="0"/> + <ONLY_VISIBLE ENABLED="1"/> + <REGION_OF_INTEREST FIX="0" HEIGHT="0" SHOW="0" WIDTH="0" X="0" Y="0"/> + <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"/> + <EXPORT_COMMENT ENABLED="0"/> + <EXPORT_MARKERID ENABLED="0"/> + <TRACK_FILE FILENAME=""/> + <SEARCH_REGION ADAPTIVE="0" LEVELS="3" MAX_ERROR="0" SCALE="16" SHOW="0"/> + <PATH AFTER="15" BEFORE="15" COLLECTIVE_COLOR_SIZE="11" COLOR_MARKER_LINE_WIDTH="1" COLOR_MARKER_SIZE="14" CURRENT_POINT_LINE_WIDTH="1" CURRENT_POINT_SIZE="60" FIX="0" GROUND_PATH_SIZE="1" GROUND_POSITION_SIZE="1" HEAD_SIZE="1" NUMBER_BOLD="1" NUMBER_SIZE="14" ONLY_PEOPLE="0" ONLY_PEOPLE_LIST="0" ONLY_PEOPLE_NR="1" ONLY_PEOPLE_NR_LIST="" ONLY_VISIBLE="0" PATH_SIZE="2" POINTS_COLORED="1" POINTS_SIZE="7" SHOW="1" SHOW_COLLECTIVE_COLOR="1" SHOW_COLOR_MARKER="1" SHOW_CURRENT_POINT="1" SHOW_GROUND_PATH="0" SHOW_GROUND_POSITION="0" SHOW_NUMBER="1" SHOW_PATH="1" SHOW_POINTS="0" SHOW_POINTS_LINE_WIDTH="1" TRACK_GROUND_PATH_COLOR="#00ff00" TRACK_PATH_COLOR="#ff0000"/> + </TRACKING> + <ANALYSIS> + <SEARCH_MISSING_FRAMES ENABLED="1"/> + <MARK_ACTUAL ENABLED="0"/> + <CALCULATION ABSOLUTE="0" CONSIDER_X="0" CONSIDER_Y="1" REVERSE="0" SHOW_VORONOI="0" STEP_SIZE="25"/> + </ANALYSIS> + <CORRECTION> + <EQUALITY DISTANCE="0.5" ENABLED="1"/> + <VELOCITY ENABLED="1"/> + <LENGTH ENABLED="1" MIN_LENGTH="10"/> + <INSIDE ENABLED="1" MARGIN="30"/> + </CORRECTION> + </CONTROL> + <EXTR_CALIBRATION> + <REPROJECTION_ERROR AVG_DH="0" AVG_PH="0" AVG_PX="0" MAX_DH="0" MAX_PH="0" MAX_PX="0" SD_DH="0" SD_PH="0" SD_PX="0" USED_HEIGHT="0"/> + </EXTR_CALIBRATION> + <STEREO> + <DISPARITY ALGO="0" COLOR="0" HIDE_INVALID="1" OPACITY="100" SHOW="0"> + <VALUES MAX="100" MIN="0"/> + <MASK EDGE_SIZE="5" SIZE="7" USE_EDGE="0"/> + <USE CALIB_CENTER="1" EXPORT="0" HEIGHT="0" HEIGHT_EVER="1" RECO="0"/> + </DISPARITY> + </STEREO> + <COLOR_MARKER> + <MASK MASK="1" OPACITY="100" SHOW="0"/> + <FROM_COLOR HUE="0" SATURATION="0" VALUE="128"/> + <TO_COLOR HUE="359" SATURATION="255" VALUE="255"/> + <PARAM CLOSE_RADIUS="5" CLOSE_USED="1" INVERS_HUE="0" MAX_AREA="5000" MAX_RATIO="2" MIN_AREA="1000" OPEN_RADIUS="5" OPEN_USED="1"/> + </COLOR_MARKER> + <CODE_MARKER> + <DICTIONARY ID="0"/> + <PARAM ADAPTIVE_THRESH_CONSTANT="7" ADAPTIVE_THRESH_WIN_SIZE_MAX="27" ADAPTIVE_THRESH_WIN_SIZE_MIN="3" ADAPTIVE_THRESH_WIN_SIZE_STEP="10" CORNER_REFINEMENT="0" CORNER_REFINEMENT_MAX_ITERATIONS="30" CORNER_REFINEMENT_MIN_ACCURACY="0.10000000000000001" CORNER_REFINEMENT_WIN_SIZE="5" ERROR_CORRECTION_RATE="0.59999999999999998" MARKER_BORDER_BITS="1" MAX_ERRONEOUS_BITS_IN_BORDER_RATE="0.34999999999999998" MAX_MARKER_PERIMETER="15" MAX_RATIO_ERROR="0.029999999999999999" MIN_CORNER_DISTANCE="0.050000000000000003" MIN_DISTANCE_TO_BORDER="3" MIN_MARKER_DISTANCE="0.050000000000000003" MIN_MARKER_PERIMETER="5" MIN_OTSU_STD_DEV="5" PERSPECTIVE_REMOVE_IGNORED_MARGIN_PER_CELL="0.13" PERSPECTIVE_REMOVE_PIXEL_PER_CELL="4" SHOW_DETECTED_CANDIDATES="0"/> + </CODE_MARKER> + <MULTI_COLOR_MARKER> + <BLACK_DOT IGNORE_WITHOUT="1" RESTRICT_POSITION="0" SIZE="5" USE="1" USE_COLOR="0"/> + <CODE_MARKER USE="0"/> + <AUTO_CORRECT ONLY_EXPORT="0" USE="0"/> + <MASK MASK="1" OPACITY="100" SHOW="0"/> + <PARAM CLOSE_RADIUS="5" CLOSE_USED="1" MAX_AREA="5000" MAX_RATIO="2" MIN_AREA="1000" OPEN_RADIUS="5" OPEN_USED="1" USE_HEAD_SIZE="0"/> + </MULTI_COLOR_MARKER> + <MOCAP COLOR="#ffff37" SHOW="0" SIZE="2"/> + <PLAYER FRAME="-1" PLAYBACK_FPS="-1" PLAYER_SPEED_FIXED="0" SEQUENCE_FPS="-1" SOURCE_FRAME_IN="-1" SOURCE_FRAME_OUT="-1"/> + <VIEW ANTIALIAS="0" CAMERA="2" HIDE_CONTROLS="0" OPENGL="0" SAVE_TRANSFORMED="0" TRANSFORMATION="250 0 0 0"/> + <AUTO_TRACK BACK_TRACK="1" OPTIMZE_COLOR="0"/> + <MISSING_FRAMES executed="0"/> +</PETRACK> diff --git a/tests/regression_test/data/01_old_intrinsic_extModel_truth.pet b/tests/regression_test/data/01_old_intrinsic_extModel_truth.pet new file mode 100644 index 0000000000000000000000000000000000000000..d178a73d6e32f02b7264ae8837fe091273df9679 --- /dev/null +++ b/tests/regression_test/data/01_old_intrinsic_extModel_truth.pet @@ -0,0 +1,97 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE PETRACK> +<PETRACK VERSION="0.10.3"> + <MAIN SRC="" STATUS_HEIGHT="0"/> + <CONTROL TAB="0"> + <CALIBRATION> + <FILTER_BEFORE IMMUTABLE="0"/> + <BRIGHTNESS ENABLED="0" VALUE="0"/> + <CONTRAST ENABLED="0" VALUE="0"/> + <BORDER COLOR="#000000" ENABLED="0" VALUE="0"/> + <SWAP ENABLED="0" HORIZONTALLY="0" VERTICALLY="0"/> + <BG_SUB DELETE="1" DELETE_NUMBER="3" ENABLED="0" FILE="" SHOW="0" UPDATE="0"/> + <PATTERN BOARD_SIZE_X="6" BOARD_SIZE_Y="8" SQUARE_SIZE="4.5999999"/> + <INTRINSIC_PARAMETERS CALIB_FILES="" ENABLED="0" EXT_MODEL_ENABLED="1" FIX_CENTER="0" IMMUTABLE="0" QUAD_ASPECT_RATIO="0" TANG_DIST="1"> + <OLD_MODEL CX="551.5" CY="383.5" FX="881" FY="881" K4="0" K5="0" K6="0" R2="0" R4="0" R6="0" ReprError="nan" S1="0" S2="0" S3="0" S4="0" TAUX="0" TAUY="0" TX="0" TY="0"/> + <EXT_MODEL CX="947.47000000000003" CY="698.44000000000005" FX="857.12" FY="857.50999999999999" K4="1.7399009" K5="0.39905" K6="-0.013337" R2="1.35895" R4="0.123464" R6="-0.0091120005" ReprError="0.52066356" S1="0.001026" S2="-6.6000001e-05" S3="-0.00019000001" S4="-9.7999997e-05" TAUX="-2.9999999e-05" TAUY="-5.0999999e-05" TX="0.000184" TY="-0.00038799999"/> + </INTRINSIC_PARAMETERS> + <EXTRINSIC_PARAMETERS ALTITUDE="535" COORD3D_AXIS_LEN="200" COORD3D_SWAP_X="0" COORD3D_SWAP_Y="0" COORD3D_SWAP_Z="0" COORD3D_TRANS_X="0" COORD3D_TRANS_Y="0" COORD3D_TRANS_Z="0" COORD_DIMENSION="0" EXTERNAL_CALIB_FILE="" EXTR_ROT_1="0" EXTR_ROT_2="0" EXTR_ROT_3="0" EXTR_TRANS_1="0" EXTR_TRANS_2="0" EXTR_TRANS_3="-500" FIX="0" IMMUTABLE_COORD_BOX="0" IMMUTABLE_EXTRINSIC_BOX="0" ROTATE="0" SCALE="100" SHOW="0" SHOW_CALIB_POINTS="0" TRANS_X="0" TRANS_Y="0" UNIT="100" USE_INTRINSIC_CENTER="0"/> + <ALIGNMENT_GRID FIX="0" GRID3D_RESOLUTION="100" GRID3D_TRANS_X="0" GRID3D_TRANS_Y="0" GRID3D_TRANS_Z="0" GRID_DIMENSION="0" IMMUTABLE="0" ROTATE="0" SCALE="100" SHOW="0" TRANS_X="0" TRANS_Y="0"/> + </CALIBRATION> + <RECOGNITION> + <PERFORM ENABLED="0" METHOD="5" STEP="1"/> + <REGION_OF_INTEREST FIX="0" HEIGHT="0" SHOW="0" WIDTH="0" X="0" Y="0"/> + <MARKER BRIGHTNESS="50" IGNORE_WITHOUT="1"/> + <SIZE_COLOR AUTO_WB="0" DEFAULT_HEIGHT="180" GREY_LEVEL="50" MAP_NUMBER="0" MODEL="0" SHOW="1" SYMBOL_SIZE="10" X="0" Y="1" Z="255"> + <MAP COLORED="1" FROM_HUE="0" FROM_SAT="0" FROM_VAL="128" HEIGHT="255" INV_HUE="0" MAP_HEIGHT="180" TO_HUE="359" TO_SAT="255" TO_VAL="255" WIDTH="359" X="0" Y="0"/> + </SIZE_COLOR> + <READ_HEIGHTS HEIGHT_FILE=""/> + <READ_MARKER_IDS MARKER_FILE=""/> + </RECOGNITION> + <TRACKING> + <ONLINE_CALCULATION ENABLED="0"/> + <REPEAT_BELOW ENABLED="1" QUALITY="50"/> + <EXTRAPOLATION ENABLED="1"/> + <MERGE ENABLED="0"/> + <ONLY_VISIBLE ENABLED="1"/> + <REGION_OF_INTEREST FIX="0" HEIGHT="0" SHOW="0" WIDTH="0" X="0" Y="0"/> + <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"/> + <EXPORT_COMMENT ENABLED="0"/> + <EXPORT_MARKERID ENABLED="0"/> + <TRACK_FILE FILENAME=""/> + <SEARCH_REGION ADAPTIVE="0" LEVELS="3" MAX_ERROR="0" SCALE="16" SHOW="0"/> + <PATH AFTER="15" BEFORE="15" COLLECTIVE_COLOR_SIZE="11" COLOR_MARKER_LINE_WIDTH="1" COLOR_MARKER_SIZE="14" CURRENT_POINT_LINE_WIDTH="1" CURRENT_POINT_SIZE="60" FIX="0" GROUND_PATH_SIZE="1" GROUND_POSITION_SIZE="1" HEAD_SIZE="1" NUMBER_BOLD="1" NUMBER_SIZE="14" ONLY_PEOPLE="0" ONLY_PEOPLE_LIST="0" ONLY_PEOPLE_NR="1" ONLY_PEOPLE_NR_LIST="" ONLY_VISIBLE="0" PATH_SIZE="2" POINTS_COLORED="1" POINTS_SIZE="7" SHOW="1" SHOW_COLLECTIVE_COLOR="1" SHOW_COLOR_MARKER="1" SHOW_CURRENT_POINT="1" SHOW_GROUND_PATH="0" SHOW_GROUND_POSITION="0" SHOW_NUMBER="1" SHOW_PATH="1" SHOW_POINTS="0" SHOW_POINTS_LINE_WIDTH="1" TRACK_GROUND_PATH_COLOR="#00ff00" TRACK_PATH_COLOR="#ff0000"/> + </TRACKING> + <ANALYSIS> + <SEARCH_MISSING_FRAMES ENABLED="1"/> + <MARK_ACTUAL ENABLED="0"/> + <CALCULATION ABSOLUTE="0" CONSIDER_X="0" CONSIDER_Y="1" REVERSE="0" SHOW_VORONOI="0" STEP_SIZE="25"/> + </ANALYSIS> + <CORRECTION> + <EQUALITY DISTANCE="0.5" ENABLED="1"/> + <VELOCITY ENABLED="1"/> + <LENGTH ENABLED="1" MIN_LENGTH="10"/> + <INSIDE ENABLED="1" MARGIN="30"/> + </CORRECTION> + </CONTROL> + <EXTR_CALIBRATION> + <REPROJECTION_ERROR AVG_DH="0" AVG_PH="0" AVG_PX="0" MAX_DH="0" MAX_PH="0" MAX_PX="0" SD_DH="0" SD_PH="0" SD_PX="0" USED_HEIGHT="0"/> + </EXTR_CALIBRATION> + <STEREO> + <DISPARITY ALGO="0" COLOR="0" HIDE_INVALID="1" OPACITY="100" SHOW="0"> + <VALUES MAX="100" MIN="0"/> + <MASK EDGE_SIZE="5" SIZE="7" USE_EDGE="0"/> + <USE CALIB_CENTER="1" EXPORT="0" HEIGHT="0" HEIGHT_EVER="1" RECO="0"/> + </DISPARITY> + </STEREO> + <COLOR_MARKER> + <MASK MASK="1" OPACITY="100" SHOW="0"/> + <FROM_COLOR HUE="0" SATURATION="0" VALUE="128"/> + <TO_COLOR HUE="359" SATURATION="255" VALUE="255"/> + <PARAM CLOSE_RADIUS="5" CLOSE_USED="1" INVERS_HUE="0" MAX_AREA="5000" MAX_RATIO="2" MIN_AREA="1000" OPEN_RADIUS="5" OPEN_USED="1"/> + </COLOR_MARKER> + <CODE_MARKER> + <DICTIONARY ID="0"/> + <PARAM ADAPTIVE_THRESH_CONSTANT="7" ADAPTIVE_THRESH_WIN_SIZE_MAX="27" ADAPTIVE_THRESH_WIN_SIZE_MIN="3" ADAPTIVE_THRESH_WIN_SIZE_STEP="10" CORNER_REFINEMENT="0" CORNER_REFINEMENT_MAX_ITERATIONS="30" CORNER_REFINEMENT_MIN_ACCURACY="0.10000000000000001" CORNER_REFINEMENT_WIN_SIZE="5" ERROR_CORRECTION_RATE="0.59999999999999998" MARKER_BORDER_BITS="1" MAX_ERRONEOUS_BITS_IN_BORDER_RATE="0.34999999999999998" MAX_MARKER_PERIMETER="15" MAX_RATIO_ERROR="0.029999999999999999" MIN_CORNER_DISTANCE="0.050000000000000003" MIN_DISTANCE_TO_BORDER="3" MIN_MARKER_DISTANCE="0.050000000000000003" MIN_MARKER_PERIMETER="5" MIN_OTSU_STD_DEV="5" PERSPECTIVE_REMOVE_IGNORED_MARGIN_PER_CELL="0.13" PERSPECTIVE_REMOVE_PIXEL_PER_CELL="4" SHOW_DETECTED_CANDIDATES="0"/> + </CODE_MARKER> + <MULTI_COLOR_MARKER> + <BLACK_DOT IGNORE_WITHOUT="1" RESTRICT_POSITION="0" SIZE="5" USE="1" USE_COLOR="0"/> + <CODE_MARKER USE="0"/> + <AUTO_CORRECT ONLY_EXPORT="0" USE="0"/> + <MASK MASK="1" OPACITY="100" SHOW="0"/> + <PARAM CLOSE_RADIUS="5" CLOSE_USED="1" MAX_AREA="5000" MAX_RATIO="2" MIN_AREA="1000" OPEN_RADIUS="5" OPEN_USED="1" USE_HEAD_SIZE="0"/> + </MULTI_COLOR_MARKER> + <MOCAP COLOR="#ffff37" SHOW="0" SIZE="2"/> + <PLAYER FRAME="-1" PLAYBACK_FPS="-1" PLAYER_SPEED_FIXED="0" SEQUENCE_FPS="-1" SOURCE_FRAME_IN="0" SOURCE_FRAME_OUT="-1"/> + <VIEW ANTIALIAS="0" CAMERA="2" HIDE_CONTROLS="0" OPENGL="0" SAVE_TRANSFORMED="0" TRANSFORMATION="250 0 0 0"/> + <AUTO_TRACK BACK_TRACK="1" OPTIMZE_COLOR="0"/> + <MISSING_FRAMES executed="0"/> +</PETRACK> diff --git a/tests/regression_test/data/01_intrinsic.pet b/tests/regression_test/data/01_old_intrinsic_oldModel.pet similarity index 90% rename from tests/regression_test/data/01_intrinsic.pet rename to tests/regression_test/data/01_old_intrinsic_oldModel.pet index 8d17958321cc836d4cd743ac1ed60fc20b560f13..6c5eabc4fd16dd62cf56752b53123f63d5d787b7 100644 --- a/tests/regression_test/data/01_intrinsic.pet +++ b/tests/regression_test/data/01_old_intrinsic_oldModel.pet @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE PETRACK> -<PETRACK VERSION="0.10.2"> +<PETRACK VERSION="0.10.3"> <MAIN SRC="" STATUS_HEIGHT="0"/> <CONTROL TAB="0"> <CALIBRATION> @@ -11,7 +11,10 @@ <SWAP ENABLED="0" HORIZONTALLY="0" VERTICALLY="0"/> <BG_SUB DELETE="1" DELETE_NUMBER="3" ENABLED="0" FILE="" SHOW="0" UPDATE="0"/> <PATTERN BOARD_SIZE_X="6" BOARD_SIZE_Y="8" SQUARE_SIZE="4.5999999"/> - <INTRINSIC_PARAMETERS CALIB_FILES="" CX="952.03999999999996" CY="698.72000000000003" ENABLED="0" EXT_MODEL_ENABLED="0" FIX_CENTER="0" FX="842.57000000000005" FY="842.69000000000005" IMMUTABLE="0" K4="0" K5="0" K6="0" QUAD_ASPECT_RATIO="0" R2="-0.27662599999999998" R4="0.093287999999999996" R6="-0.01423" ReprError="1.1930544727952612" S1="0" S2="0" S3="0" S4="0" TANG_DIST="1" TAUX="0" TAUY="0" TX="-0.00024699999999999999" TY="5.5000000000000002e-05"/> + <INTRINSIC_PARAMETERS CALIB_FILES="" ENABLED="0" EXT_MODEL_ENABLED="0" FIX_CENTER="0" IMMUTABLE="0" QUAD_ASPECT_RATIO="0" TANG_DIST="1"> + <OLD_MODEL CX="952.03999999999996" CY="698.72000000000003" FX="842.57000000000005" FY="842.69000000000005" K4="0" K5="0" K6="0" R2="-0.27662599" R4="0.093287997" R6="-0.01423" ReprError="1.1930544" S1="0" S2="0" S3="0" S4="0" TAUX="0" TAUY="0" TX="-0.00024699999" TY="5.5e-05"/> + <EXT_MODEL CX="551.5" CY="383.5" FX="881" FY="881" K4="0" K5="0" K6="0" R2="0" R4="0" R6="0" ReprError="nan" S1="0" S2="0" S3="0" S4="0" TAUX="0" TAUY="0" TX="0" TY="0"/> + </INTRINSIC_PARAMETERS> <EXTRINSIC_PARAMETERS ALTITUDE="535" COORD3D_AXIS_LEN="200" COORD3D_SWAP_X="0" COORD3D_SWAP_Y="0" COORD3D_SWAP_Z="0" COORD3D_TRANS_X="0" COORD3D_TRANS_Y="0" COORD3D_TRANS_Z="0" COORD_DIMENSION="0" EXTERNAL_CALIB_FILE="" EXTR_ROT_1="0" EXTR_ROT_2="0" EXTR_ROT_3="0" EXTR_TRANS_1="0" EXTR_TRANS_2="0" EXTR_TRANS_3="-500" FIX="0" IMMUTABLE_COORD_BOX="0" IMMUTABLE_EXTRINSIC_BOX="0" ROTATE="0" SCALE="100" SHOW="0" SHOW_CALIB_POINTS="0" TRANS_X="0" TRANS_Y="0" UNIT="100" USE_INTRINSIC_CENTER="0"/> <ALIGNMENT_GRID FIX="0" GRID3D_RESOLUTION="100" GRID3D_TRANS_X="0" GRID3D_TRANS_Y="0" GRID3D_TRANS_Z="0" GRID_DIMENSION="0" IMMUTABLE="0" ROTATE="0" SCALE="100" SHOW="0" TRANS_X="0" TRANS_Y="0"/> </CALIBRATION> diff --git a/tests/regression_test/data/01_old_intrinsic_oldModel_truth.pet b/tests/regression_test/data/01_old_intrinsic_oldModel_truth.pet new file mode 100644 index 0000000000000000000000000000000000000000..6c5eabc4fd16dd62cf56752b53123f63d5d787b7 --- /dev/null +++ b/tests/regression_test/data/01_old_intrinsic_oldModel_truth.pet @@ -0,0 +1,97 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE PETRACK> +<PETRACK VERSION="0.10.3"> + <MAIN SRC="" STATUS_HEIGHT="0"/> + <CONTROL TAB="0"> + <CALIBRATION> + <FILTER_BEFORE IMMUTABLE="0"/> + <BRIGHTNESS ENABLED="0" VALUE="0"/> + <CONTRAST ENABLED="0" VALUE="0"/> + <BORDER COLOR="#000000" ENABLED="0" VALUE="0"/> + <SWAP ENABLED="0" HORIZONTALLY="0" VERTICALLY="0"/> + <BG_SUB DELETE="1" DELETE_NUMBER="3" ENABLED="0" FILE="" SHOW="0" UPDATE="0"/> + <PATTERN BOARD_SIZE_X="6" BOARD_SIZE_Y="8" SQUARE_SIZE="4.5999999"/> + <INTRINSIC_PARAMETERS CALIB_FILES="" ENABLED="0" EXT_MODEL_ENABLED="0" FIX_CENTER="0" IMMUTABLE="0" QUAD_ASPECT_RATIO="0" TANG_DIST="1"> + <OLD_MODEL CX="952.03999999999996" CY="698.72000000000003" FX="842.57000000000005" FY="842.69000000000005" K4="0" K5="0" K6="0" R2="-0.27662599" R4="0.093287997" R6="-0.01423" ReprError="1.1930544" S1="0" S2="0" S3="0" S4="0" TAUX="0" TAUY="0" TX="-0.00024699999" TY="5.5e-05"/> + <EXT_MODEL CX="551.5" CY="383.5" FX="881" FY="881" K4="0" K5="0" K6="0" R2="0" R4="0" R6="0" ReprError="nan" S1="0" S2="0" S3="0" S4="0" TAUX="0" TAUY="0" TX="0" TY="0"/> + </INTRINSIC_PARAMETERS> + <EXTRINSIC_PARAMETERS ALTITUDE="535" COORD3D_AXIS_LEN="200" COORD3D_SWAP_X="0" COORD3D_SWAP_Y="0" COORD3D_SWAP_Z="0" COORD3D_TRANS_X="0" COORD3D_TRANS_Y="0" COORD3D_TRANS_Z="0" COORD_DIMENSION="0" EXTERNAL_CALIB_FILE="" EXTR_ROT_1="0" EXTR_ROT_2="0" EXTR_ROT_3="0" EXTR_TRANS_1="0" EXTR_TRANS_2="0" EXTR_TRANS_3="-500" FIX="0" IMMUTABLE_COORD_BOX="0" IMMUTABLE_EXTRINSIC_BOX="0" ROTATE="0" SCALE="100" SHOW="0" SHOW_CALIB_POINTS="0" TRANS_X="0" TRANS_Y="0" UNIT="100" USE_INTRINSIC_CENTER="0"/> + <ALIGNMENT_GRID FIX="0" GRID3D_RESOLUTION="100" GRID3D_TRANS_X="0" GRID3D_TRANS_Y="0" GRID3D_TRANS_Z="0" GRID_DIMENSION="0" IMMUTABLE="0" ROTATE="0" SCALE="100" SHOW="0" TRANS_X="0" TRANS_Y="0"/> + </CALIBRATION> + <RECOGNITION> + <PERFORM ENABLED="0" METHOD="5" STEP="1"/> + <REGION_OF_INTEREST FIX="0" HEIGHT="0" SHOW="0" WIDTH="0" X="0" Y="0"/> + <MARKER BRIGHTNESS="50" IGNORE_WITHOUT="1"/> + <SIZE_COLOR AUTO_WB="0" DEFAULT_HEIGHT="180" GREY_LEVEL="50" MAP_NUMBER="0" MODEL="0" SHOW="1" SYMBOL_SIZE="10" X="0" Y="1" Z="255"> + <MAP COLORED="1" FROM_HUE="0" FROM_SAT="0" FROM_VAL="128" HEIGHT="255" INV_HUE="0" MAP_HEIGHT="180" TO_HUE="359" TO_SAT="255" TO_VAL="255" WIDTH="359" X="0" Y="0"/> + </SIZE_COLOR> + <READ_HEIGHTS HEIGHT_FILE=""/> + <READ_MARKER_IDS MARKER_FILE=""/> + </RECOGNITION> + <TRACKING> + <ONLINE_CALCULATION ENABLED="0"/> + <REPEAT_BELOW ENABLED="1" QUALITY="50"/> + <EXTRAPOLATION ENABLED="1"/> + <MERGE ENABLED="0"/> + <ONLY_VISIBLE ENABLED="1"/> + <REGION_OF_INTEREST FIX="0" HEIGHT="0" SHOW="0" WIDTH="0" X="0" Y="0"/> + <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"/> + <EXPORT_COMMENT ENABLED="0"/> + <EXPORT_MARKERID ENABLED="0"/> + <TRACK_FILE FILENAME=""/> + <SEARCH_REGION ADAPTIVE="0" LEVELS="3" MAX_ERROR="0" SCALE="16" SHOW="0"/> + <PATH AFTER="15" BEFORE="15" COLLECTIVE_COLOR_SIZE="11" COLOR_MARKER_LINE_WIDTH="1" COLOR_MARKER_SIZE="14" CURRENT_POINT_LINE_WIDTH="1" CURRENT_POINT_SIZE="60" FIX="0" GROUND_PATH_SIZE="1" GROUND_POSITION_SIZE="1" HEAD_SIZE="1" NUMBER_BOLD="1" NUMBER_SIZE="14" ONLY_PEOPLE="0" ONLY_PEOPLE_LIST="0" ONLY_PEOPLE_NR="1" ONLY_PEOPLE_NR_LIST="" ONLY_VISIBLE="0" PATH_SIZE="2" POINTS_COLORED="1" POINTS_SIZE="7" SHOW="1" SHOW_COLLECTIVE_COLOR="1" SHOW_COLOR_MARKER="1" SHOW_CURRENT_POINT="1" SHOW_GROUND_PATH="0" SHOW_GROUND_POSITION="0" SHOW_NUMBER="1" SHOW_PATH="1" SHOW_POINTS="0" SHOW_POINTS_LINE_WIDTH="1" TRACK_GROUND_PATH_COLOR="#00ff00" TRACK_PATH_COLOR="#ff0000"/> + </TRACKING> + <ANALYSIS> + <SEARCH_MISSING_FRAMES ENABLED="1"/> + <MARK_ACTUAL ENABLED="0"/> + <CALCULATION ABSOLUTE="0" CONSIDER_X="0" CONSIDER_Y="1" REVERSE="0" SHOW_VORONOI="0" STEP_SIZE="25"/> + </ANALYSIS> + <CORRECTION> + <EQUALITY DISTANCE="0.5" ENABLED="1"/> + <VELOCITY ENABLED="1"/> + <LENGTH ENABLED="1" MIN_LENGTH="10"/> + <INSIDE ENABLED="1" MARGIN="30"/> + </CORRECTION> + </CONTROL> + <EXTR_CALIBRATION> + <REPROJECTION_ERROR AVG_DH="0" AVG_PH="0" AVG_PX="0" MAX_DH="4.6632130749188108e-310" MAX_PH="4.6632130749149077e-310" MAX_PX="4.6632132612882775e-310" SD_DH="4.6632137672154514e-310" SD_PH="6.9526421601088563e-310" SD_PX="6.952642160144429e-310" USED_HEIGHT="4.6632137672154514e-310"/> + </EXTR_CALIBRATION> + <STEREO> + <DISPARITY ALGO="0" COLOR="0" HIDE_INVALID="1" OPACITY="100" SHOW="0"> + <VALUES MAX="100" MIN="0"/> + <MASK EDGE_SIZE="5" SIZE="7" USE_EDGE="0"/> + <USE CALIB_CENTER="1" EXPORT="0" HEIGHT="0" HEIGHT_EVER="1" RECO="0"/> + </DISPARITY> + </STEREO> + <COLOR_MARKER> + <MASK MASK="1" OPACITY="100" SHOW="0"/> + <FROM_COLOR HUE="0" SATURATION="0" VALUE="0"/> + <TO_COLOR HUE="359" SATURATION="255" VALUE="255"/> + <PARAM CLOSE_RADIUS="5" CLOSE_USED="1" INVERS_HUE="0" MAX_AREA="5000" MAX_RATIO="2" MIN_AREA="1000" OPEN_RADIUS="5" OPEN_USED="1"/> + </COLOR_MARKER> + <CODE_MARKER> + <DICTIONARY ID="0"/> + <PARAM ADAPTIVE_THRESH_CONSTANT="7" ADAPTIVE_THRESH_WIN_SIZE_MAX="27" ADAPTIVE_THRESH_WIN_SIZE_MIN="3" ADAPTIVE_THRESH_WIN_SIZE_STEP="10" CORNER_REFINEMENT="0" CORNER_REFINEMENT_MAX_ITERATIONS="30" CORNER_REFINEMENT_MIN_ACCURACY="0.10000000000000001" CORNER_REFINEMENT_WIN_SIZE="5" ERROR_CORRECTION_RATE="0.59999999999999998" MARKER_BORDER_BITS="1" MAX_ERRONEOUS_BITS_IN_BORDER_RATE="0.34999999999999998" MAX_MARKER_PERIMETER="15" MAX_RATIO_ERROR="0.029999999999999999" MIN_CORNER_DISTANCE="0.050000000000000003" MIN_DISTANCE_TO_BORDER="3" MIN_MARKER_DISTANCE="0.050000000000000003" MIN_MARKER_PERIMETER="5" MIN_OTSU_STD_DEV="5" PERSPECTIVE_REMOVE_IGNORED_MARGIN_PER_CELL="0.13" PERSPECTIVE_REMOVE_PIXEL_PER_CELL="4" SHOW_DETECTED_CANDIDATES="0"/> + </CODE_MARKER> + <MULTI_COLOR_MARKER> + <BLACK_DOT IGNORE_WITHOUT="1" RESTRICT_POSITION="0" SIZE="5" USE="1" USE_COLOR="0"/> + <CODE_MARKER USE="0"/> + <AUTO_CORRECT ONLY_EXPORT="0" USE="0"/> + <MASK MASK="1" OPACITY="100" SHOW="0"/> + <PARAM CLOSE_RADIUS="5" CLOSE_USED="1" MAX_AREA="5000" MAX_RATIO="2" MIN_AREA="1000" OPEN_RADIUS="5" OPEN_USED="1" USE_HEAD_SIZE="0"/> + </MULTI_COLOR_MARKER> + <MOCAP COLOR="#ffff37" SHOW="0" SIZE="2"/> + <PLAYER FRAME="-1" PLAYBACK_FPS="-1" PLAYER_SPEED_FIXED="0" SEQUENCE_FPS="-1" SOURCE_FRAME_IN="0" SOURCE_FRAME_OUT="-1"/> + <VIEW ANTIALIAS="0" CAMERA="2" HIDE_CONTROLS="0" OPENGL="0" SAVE_TRANSFORMED="0" TRANSFORMATION="250 0 0 0"/> + <AUTO_TRACK BACK_TRACK="1" OPTIMZE_COLOR="0"/> + <MISSING_FRAMES executed="0"/> +</PETRACK> diff --git a/tests/regression_test/data/02_extrinsic.pet b/tests/regression_test/data/02_extrinsic.pet index d8b958547deda9c9f8e9255710fb6a9a3979f94b..2b34f9f1afcf81e8ff76255e500c50926cb52880 100644 --- a/tests/regression_test/data/02_extrinsic.pet +++ b/tests/regression_test/data/02_extrinsic.pet @@ -1,18 +1,22 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE PETRACK> -<PETRACK VERSION="0.10.0"> +<PETRACK VERSION="0.10.3"> <MAIN SRC="../00_files/calibration/extrinsic/00_all.jpg" STATUS_HEIGHT="0"/> <CONTROL TAB="0"> <CALIBRATION> + <FILTER_BEFORE IMMUTABLE="0"/> <BRIGHTNESS ENABLED="0" VALUE="0"/> <CONTRAST ENABLED="0" VALUE="0"/> <BORDER COLOR="#000000" ENABLED="0" VALUE="0"/> <SWAP ENABLED="0" HORIZONTALLY="0" VERTICALLY="0"/> <BG_SUB DELETE="1" DELETE_NUMBER="3" ENABLED="0" FILE="" SHOW="0" UPDATE="0"/> <PATTERN BOARD_SIZE_X="6" BOARD_SIZE_Y="8" SQUARE_SIZE="4.5999999"/> - <INTRINSIC_PARAMETERS CALIB_FILES="" CX="947.47000000000003" CY="698.44000000000005" ENABLED="1" EXT_MODEL_ENABLED="1" FIX_CENTER="0" FX="857.12" FY="857.50999999999999" K4="1.7398640000000001" K5="0.399007" K6="-0.013342" QUAD_ASPECT_RATIO="0" R2="1.358914" R4="0.123435" R6="-0.0091129999999999996" ReprError="0.52066329210560447" S1="0.001026" S2="-6.6000000000000005e-05" S3="-0.00019000000000000001" S4="-9.7999999999999997e-05" TANG_DIST="1" TAUX="-3.0000000000000001e-05" TAUY="-5.0000000000000002e-05" TX="0.000184" TY="-0.000388"/> - <EXTRINSIC_PARAMETERS ALTITUDE="535" COORD3D_AXIS_LEN="200" COORD3D_SWAP_X="0" COORD3D_SWAP_Y="0" COORD3D_SWAP_Z="0" COORD3D_TRANS_X="0" COORD3D_TRANS_Y="0" COORD3D_TRANS_Z="0" COORD_DIMENSION="0" EXTERNAL_CALIB_FILE="../data/before.3dc;C:/Users/Deniz/Documents/petrack/tests/regression_test/data/before.3dc;before.3dc" EXTR_ROT_1="-2.1949999999999998" EXTR_ROT_2="-2.1829999999999998" EXTR_ROT_3="0.017000000000000001" EXTR_TRANS_1="-1044.4970000000001" EXTR_TRANS_2="15.23" EXTR_TRANS_3="-628.18600000000004" FIX="0" ROTATE="0" SCALE="100" SHOW="0" SHOW_CALIB_POINTS="0" TRANS_X="0" TRANS_Y="0" UNIT="100" USE_INTRINSIC_CENTER="0"/> - <ALIGNMENT_GRID FIX="0" GRID3D_RESOLUTION="100" GRID3D_TRANS_X="0" GRID3D_TRANS_Y="0" GRID3D_TRANS_Z="0" GRID_DIMENSION="0" ROTATE="0" SCALE="100" SHOW="0" TRANS_X="0" TRANS_Y="0"/> + <INTRINSIC_PARAMETERS CALIB_FILES="" ENABLED="1" EXT_MODEL_ENABLED="1" FIX_CENTER="0" IMMUTABLE="0" QUAD_ASPECT_RATIO="0" TANG_DIST="1"> + <OLD_MODEL CX="551.5" CY="383.5" FX="881" FY="881" K4="0" K5="0" K6="0" R2="0" R4="0" R6="0" ReprError="nan" S1="0" S2="0" S3="0" S4="0" TAUX="0" TAUY="0" TX="0" TY="0"/> + <EXT_MODEL CX="947.47000000000003" CY="698.44000000000005" FX="857.12" FY="857.50999999999999" K4="1.739864" K5="0.39900699" K6="-0.013342" R2="1.358914" R4="0.123435" R6="-0.0091129998" ReprError="0.52066332" S1="0.001026" S2="-6.6000001e-05" S3="-0.00019000001" S4="-9.7999997e-05" TAUX="-2.9999999e-05" TAUY="-4.9999999e-05" TX="0.000184" TY="-0.00038799999"/> + </INTRINSIC_PARAMETERS> + <EXTRINSIC_PARAMETERS ALTITUDE="535" COORD3D_AXIS_LEN="200" COORD3D_SWAP_X="0" COORD3D_SWAP_Y="0" COORD3D_SWAP_Z="0" COORD3D_TRANS_X="0" COORD3D_TRANS_Y="0" COORD3D_TRANS_Z="0" COORD_DIMENSION="0" EXTERNAL_CALIB_FILE="before.3dc" EXTR_ROT_1="-2.1949999999999998" EXTR_ROT_2="-2.1829999999999998" EXTR_ROT_3="0.017000000000000001" EXTR_TRANS_1="-1044.4970000000001" EXTR_TRANS_2="15.23" EXTR_TRANS_3="-628.18600000000004" FIX="0" IMMUTABLE_COORD_BOX="0" IMMUTABLE_EXTRINSIC_BOX="0" ROTATE="0" SCALE="100" SHOW="0" SHOW_CALIB_POINTS="0" TRANS_X="0" TRANS_Y="0" UNIT="100" USE_INTRINSIC_CENTER="0"/> + <ALIGNMENT_GRID FIX="0" GRID3D_RESOLUTION="100" GRID3D_TRANS_X="0" GRID3D_TRANS_Y="0" GRID3D_TRANS_Z="0" GRID_DIMENSION="0" IMMUTABLE="0" ROTATE="0" SCALE="100" SHOW="0" TRANS_X="0" TRANS_Y="0"/> </CALIBRATION> <RECOGNITION> <PERFORM ENABLED="0" METHOD="5" STEP="1"/> @@ -86,7 +90,7 @@ <PARAM CLOSE_RADIUS="5" CLOSE_USED="1" MAX_AREA="5000" MAX_RATIO="2" MIN_AREA="1000" OPEN_RADIUS="5" OPEN_USED="1" USE_HEAD_SIZE="0"/> </MULTI_COLOR_MARKER> <MOCAP COLOR="#ffff37" SHOW="0" SIZE="2"/> - <PLAYER FPS="25" FRAME="0" PLAYER_SPEED_FIXED="0" SOURCE_FRAME_IN="0" SOURCE_FRAME_OUT="0"/> + <PLAYER FRAME="-1" PLAYBACK_FPS="-1" PLAYER_SPEED_FIXED="0" SEQUENCE_FPS="-1" SOURCE_FRAME_IN="0" SOURCE_FRAME_OUT="0"/> <VIEW ANTIALIAS="0" CAMERA="2" HIDE_CONTROLS="0" OPENGL="0" SAVE_TRANSFORMED="0" TRANSFORMATION="208 0 0 0"/> <AUTO_TRACK BACK_TRACK="1" OPTIMZE_COLOR="0"/> <MISSING_FRAMES executed="0"/> diff --git a/tests/regression_test/data/blackdotMarker.pet b/tests/regression_test/data/blackdotMarker.pet index d7e06ecd1f20c20bfdd533183d1bc1d2d4704f97..1517884f38b1ed14feeda51ec1a5f5f61e76c0fa 100755 --- a/tests/regression_test/data/blackdotMarker.pet +++ b/tests/regression_test/data/blackdotMarker.pet @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE PETRACK> -<PETRACK VERSION="0.10.2"> +<PETRACK VERSION="0.10.3"> <MAIN SRC="blackdotMarker.mp4" STATUS_HEIGHT="0"/> <CONTROL TAB="2"> <CALIBRATION> @@ -11,7 +11,10 @@ <SWAP ENABLED="0" HORIZONTALLY="0" VERTICALLY="0"/> <BG_SUB DELETE="1" DELETE_NUMBER="3" ENABLED="0" FILE="" SHOW="0" UPDATE="0"/> <PATTERN BOARD_SIZE_X="6" BOARD_SIZE_Y="9" SQUARE_SIZE="3"/> - <INTRINSIC_PARAMETERS CALIB_FILES="" CX="1038" CY="798" ENABLED="1" EXT_MODEL_ENABLED="0" FIX_CENTER="0" FX="835.65999999999997" FY="835.75999999999999" IMMUTABLE="0" K4="0" K5="0" K6="0" QUAD_ASPECT_RATIO="0" R2="-0.246701" R4="0.072692000000000007" R6="-0.010224" ReprError="nan" S1="0" S2="0" S3="0" S4="0" TANG_DIST="1" TAUX="0" TAUY="0" TX="0.00033700000000000001" TY="6.9999999999999999e-06"/> + <INTRINSIC_PARAMETERS CALIB_FILES="" ENABLED="1" EXT_MODEL_ENABLED="0" FIX_CENTER="0" IMMUTABLE="0" QUAD_ASPECT_RATIO="0" TANG_DIST="1"> + <OLD_MODEL CX="1038" CY="798" FX="835.65999999999997" FY="835.75999999999999" K4="0" K5="0" K6="0" R2="-0.246701" R4="0.072691999" R6="-0.010224" ReprError="nan" S1="0" S2="0" S3="0" S4="0" TAUX="0" TAUY="0" TX="0.000337" TY="7.0000001e-06"/> + <EXT_MODEL CX="551.5" CY="383.5" FX="881" FY="881" K4="0" K5="0" K6="0" R2="0" R4="0" R6="0" ReprError="nan" S1="0" S2="0" S3="0" S4="0" TAUX="0" TAUY="0" TX="0" TY="0"/> + </INTRINSIC_PARAMETERS> <EXTRINSIC_PARAMETERS ALTITUDE="535" COORD3D_AXIS_LEN="200" COORD3D_SWAP_X="0" COORD3D_SWAP_Y="0" COORD3D_SWAP_Z="0" COORD3D_TRANS_X="225" COORD3D_TRANS_Y="350" COORD3D_TRANS_Z="0" COORD_DIMENSION="0" EXTERNAL_CALIB_FILE="" EXTR_ROT_1="-2.2050000000000001" EXTR_ROT_2="-2.177" EXTR_ROT_3="0.104" EXTR_TRANS_1="-224.46700000000001" EXTR_TRANS_2="-629.58500000000004" EXTR_TRANS_3="-408.82499999999999" FIX="1" IMMUTABLE_COORD_BOX="0" IMMUTABLE_EXTRINSIC_BOX="0" ROTATE="0" SCALE="1" SHOW="0" SHOW_CALIB_POINTS="0" TRANS_X="0" TRANS_Y="0" UNIT="100" USE_INTRINSIC_CENTER="0"/> <ALIGNMENT_GRID FIX="1" GRID3D_RESOLUTION="100" GRID3D_TRANS_X="75" GRID3D_TRANS_Y="-18" GRID3D_TRANS_Z="0" GRID_DIMENSION="0" IMMUTABLE="0" ROTATE="0" SCALE="1" SHOW="0" TRANS_X="0" TRANS_Y="0"/> </CALIBRATION> diff --git a/tests/regression_test/data/codeMarker.pet b/tests/regression_test/data/codeMarker.pet index 23da59c3ea0fe239ebe10d0fda7a474509e7be90..05e72beee75ca097268f03552bbe046f23b7ac63 100644 --- a/tests/regression_test/data/codeMarker.pet +++ b/tests/regression_test/data/codeMarker.pet @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE PETRACK> -<PETRACK VERSION="0.10.2"> +<PETRACK VERSION="0.10.3"> <MAIN SRC="codeMarker.mp4" STATUS_HEIGHT="0"/> <CONTROL TAB="2"> <CALIBRATION> @@ -11,7 +11,10 @@ <SWAP ENABLED="0" HORIZONTALLY="0" VERTICALLY="0"/> <BG_SUB DELETE="1" DELETE_NUMBER="3" ENABLED="0" FILE="" SHOW="0" UPDATE="0"/> <PATTERN BOARD_SIZE_X="6" BOARD_SIZE_Y="8" SQUARE_SIZE="4.5999999"/> - <INTRINSIC_PARAMETERS CALIB_FILES="" CX="1397.98" CY="1138.9300000000001" ENABLED="1" EXT_MODEL_ENABLED="0" FIX_CENTER="0" FX="835.65999999999997" FY="835.75999999999999" IMMUTABLE="0" K4="0" K5="0" K6="0" QUAD_ASPECT_RATIO="0" R2="-0.246701" R4="0.072692000000000007" R6="-0.010224" ReprError="nan" S1="0" S2="0" S3="0" S4="0" TANG_DIST="1" TAUX="0" TAUY="0" TX="0.00033700000000000001" TY="6.9999999999999999e-06"/> + <INTRINSIC_PARAMETERS CALIB_FILES="" ENABLED="1" EXT_MODEL_ENABLED="0" FIX_CENTER="0" IMMUTABLE="0" QUAD_ASPECT_RATIO="0" TANG_DIST="1"> + <OLD_MODEL CX="1397.98" CY="1138.9300000000001" FX="835.65999999999997" FY="835.75999999999999" K4="0" K5="0" K6="0" R2="-0.246701" R4="0.072691999" R6="-0.010224" ReprError="nan" S1="0" S2="0" S3="0" S4="0" TAUX="0" TAUY="0" TX="0.000337" TY="7.0000001e-06"/> + <EXT_MODEL CX="551.5" CY="383.5" FX="881" FY="881" K4="0" K5="0" K6="0" R2="0" R4="0" R6="0" ReprError="nan" S1="0" S2="0" S3="0" S4="0" TAUX="0" TAUY="0" TX="0" TY="0"/> + </INTRINSIC_PARAMETERS> <EXTRINSIC_PARAMETERS ALTITUDE="535" COORD3D_AXIS_LEN="200" COORD3D_SWAP_X="0" COORD3D_SWAP_Y="0" COORD3D_SWAP_Z="0" COORD3D_TRANS_X="0" COORD3D_TRANS_Y="0" COORD3D_TRANS_Z="0" COORD_DIMENSION="0" EXTERNAL_CALIB_FILE="" EXTR_ROT_1="0.012" EXTR_ROT_2="-0.014" EXTR_ROT_3="0.22700000000000001" EXTR_TRANS_1="50.128" EXTR_TRANS_2="23.611999999999998" EXTR_TRANS_3="-400.09800000000001" FIX="1" IMMUTABLE_COORD_BOX="0" IMMUTABLE_EXTRINSIC_BOX="0" ROTATE="0" SCALE="100" SHOW="0" SHOW_CALIB_POINTS="0" TRANS_X="0" TRANS_Y="0" UNIT="100" USE_INTRINSIC_CENTER="0"/> <ALIGNMENT_GRID FIX="1" GRID3D_RESOLUTION="100" GRID3D_TRANS_X="0" GRID3D_TRANS_Y="0" GRID3D_TRANS_Z="0" GRID_DIMENSION="0" IMMUTABLE="0" ROTATE="0" SCALE="100" SHOW="0" TRANS_X="0" TRANS_Y="0"/> </CALIBRATION> diff --git a/tests/regression_test/data/correct_perspective.pet b/tests/regression_test/data/correct_perspective.pet index aa9ef0389932b65b7c956563743a13eb3588cc58..525d0e08693e48724ccb6013419853cf0715b025 100644 --- a/tests/regression_test/data/correct_perspective.pet +++ b/tests/regression_test/data/correct_perspective.pet @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE PETRACK> -<PETRACK VERSION="0.10.2"> +<PETRACK VERSION="0.10.3"> <MAIN SRC="multicolor.mp4" STATUS_HEIGHT="0"/> <CONTROL TAB="2"> <CALIBRATION> @@ -11,7 +11,10 @@ <SWAP ENABLED="0" HORIZONTALLY="0" VERTICALLY="0"/> <BG_SUB DELETE="1" DELETE_NUMBER="3" ENABLED="0" FILE="" SHOW="0" UPDATE="0"/> <PATTERN BOARD_SIZE_X="6" BOARD_SIZE_Y="8" SQUARE_SIZE="4.5999999"/> - <INTRINSIC_PARAMETERS CALIB_FILES="" CX="1134.04" CY="880.72000000000003" ENABLED="1" EXT_MODEL_ENABLED="0" FIX_CENTER="0" FX="842.57000000000005" FY="842.69000000000005" IMMUTABLE="0" K4="0" K5="0" K6="0" QUAD_ASPECT_RATIO="0" R2="-0.27662599999999998" R4="0.093287999999999996" R6="-0.01423" ReprError="nan" S1="0" S2="0" S3="0" S4="0" TANG_DIST="1" TAUX="0" TAUY="0" TX="-0.00024699999999999999" TY="5.5000000000000002e-05"/> + <INTRINSIC_PARAMETERS CALIB_FILES="" ENABLED="1" EXT_MODEL_ENABLED="0" FIX_CENTER="0" IMMUTABLE="0" QUAD_ASPECT_RATIO="0" TANG_DIST="1"> + <OLD_MODEL CX="1134.04" CY="880.72000000000003" FX="842.57000000000005" FY="842.69000000000005" K4="0" K5="0" K6="0" R2="-0.27662599" R4="0.093287997" R6="-0.01423" ReprError="nan" S1="0" S2="0" S3="0" S4="0" TAUX="0" TAUY="0" TX="-0.00024699999" TY="5.5e-05"/> + <EXT_MODEL CX="551.5" CY="383.5" FX="881" FY="881" K4="0" K5="0" K6="0" R2="0" R4="0" R6="0" ReprError="nan" S1="0" S2="0" S3="0" S4="0" TAUX="0" TAUY="0" TX="0" TY="0"/> + </INTRINSIC_PARAMETERS> <EXTRINSIC_PARAMETERS ALTITUDE="535" COORD3D_AXIS_LEN="200" COORD3D_SWAP_X="0" COORD3D_SWAP_Y="1" COORD3D_SWAP_Z="0" COORD3D_TRANS_X="0" COORD3D_TRANS_Y="0" COORD3D_TRANS_Z="0" COORD_DIMENSION="0" EXTERNAL_CALIB_FILE="" EXTR_ROT_1="-2.1920000000000002" EXTR_ROT_2="-2.1829999999999998" EXTR_ROT_3="0.016" EXTR_TRANS_1="-1043.473" EXTR_TRANS_2="13.741" EXTR_TRANS_3="-626.84199999999998" FIX="0" IMMUTABLE_COORD_BOX="0" IMMUTABLE_EXTRINSIC_BOX="0" ROTATE="0" SCALE="100" SHOW="0" SHOW_CALIB_POINTS="0" TRANS_X="0" TRANS_Y="0" UNIT="100" USE_INTRINSIC_CENTER="0"/> <ALIGNMENT_GRID FIX="0" GRID3D_RESOLUTION="100" GRID3D_TRANS_X="91" GRID3D_TRANS_Y="34" GRID3D_TRANS_Z="0" GRID_DIMENSION="0" IMMUTABLE="0" ROTATE="0" SCALE="100" SHOW="0" TRANS_X="0" TRANS_Y="0"/> </CALIBRATION> diff --git a/tests/regression_test/data/markerCasern.pet b/tests/regression_test/data/markerCasern.pet index 224f8a6d82284d725e3da7bb777bc48e64b0c168..61e3c83a96b2eecd273f6ac62737a361379fa580 100644 --- a/tests/regression_test/data/markerCasern.pet +++ b/tests/regression_test/data/markerCasern.pet @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE PETRACK> -<PETRACK VERSION="0.10.2"> +<PETRACK VERSION="0.10.3"> <MAIN SRC="markerCasern.avi" STATUS_HEIGHT="180"/> <CONTROL TAB="0"> <CALIBRATION> @@ -11,7 +11,10 @@ <SWAP ENABLED="0" HORIZONTALLY="0" VERTICALLY="0"/> <BG_SUB DELETE="1" DELETE_NUMBER="3" ENABLED="0" FILE="" SHOW="0" UPDATE="0"/> <PATTERN BOARD_SIZE_X="6" BOARD_SIZE_Y="8" SQUARE_SIZE="4.5999999"/> - <INTRINSIC_PARAMETERS CALIB_FILES="" CX="589.5" CY="461.5" ENABLED="1" EXT_MODEL_ENABLED="0" FIX_CENTER="1" FX="882.15999999999997" FY="882.15999999999997" IMMUTABLE="0" K4="0" K5="0" K6="0" QUAD_ASPECT_RATIO="1" R2="-0.378664" R4="0.15861700000000001" R6="0" ReprError="nan" S1="0" S2="0" S3="0" S4="0" TANG_DIST="1" TAUX="0" TAUY="0" TX="-0.000241" TY="0.00031199999999999999"/> + <INTRINSIC_PARAMETERS CALIB_FILES="" ENABLED="1" EXT_MODEL_ENABLED="0" FIX_CENTER="1" IMMUTABLE="0" QUAD_ASPECT_RATIO="1" TANG_DIST="1"> + <OLD_MODEL CX="589.5" CY="461.5" FX="882.15999999999997" FY="882.15999999999997" K4="0" K5="0" K6="0" R2="-0.37866399" R4="0.158617" R6="0" ReprError="nan" S1="0" S2="0" S3="0" S4="0" TAUX="0" TAUY="0" TX="-0.000241" TY="0.00031199999"/> + <EXT_MODEL CX="589.5" CY="461.5" FX="881" FY="881" K4="0" K5="0" K6="0" R2="0" R4="0" R6="0" ReprError="nan" S1="0" S2="0" S3="0" S4="0" TAUX="0" TAUY="0" TX="0" TY="0"/> + </INTRINSIC_PARAMETERS> <EXTRINSIC_PARAMETERS ALTITUDE="537" COORD3D_AXIS_LEN="200" COORD3D_SWAP_X="0" COORD3D_SWAP_Y="0" COORD3D_SWAP_Z="0" COORD3D_TRANS_X="0" COORD3D_TRANS_Y="0" COORD3D_TRANS_Z="0" COORD_DIMENSION="1" EXTERNAL_CALIB_FILE="" EXTR_ROT_1="0" EXTR_ROT_2="0" EXTR_ROT_3="0" EXTR_TRANS_1="0" EXTR_TRANS_2="0" EXTR_TRANS_3="-500" FIX="1" IMMUTABLE_COORD_BOX="0" IMMUTABLE_EXTRINSIC_BOX="0" ROTATE="27" SCALE="767" SHOW="1" SHOW_CALIB_POINTS="0" TRANS_X="5179" TRANS_Y="2170" UNIT="46" USE_INTRINSIC_CENTER="0"/> <ALIGNMENT_GRID FIX="1" GRID3D_RESOLUTION="100" GRID3D_TRANS_X="0" GRID3D_TRANS_Y="0" GRID3D_TRANS_Z="0" GRID_DIMENSION="1" IMMUTABLE="0" ROTATE="27" SCALE="768" SHOW="1" TRANS_X="245" TRANS_Y="657"/> </CALIBRATION> diff --git a/tests/regression_test/data/markerJapan.pet b/tests/regression_test/data/markerJapan.pet index 0d0ef2c0b5b3dcf0773d216c83b494afbaecb079..57c55aef88da4e0ef02e99cf81035039ceae5cec 100644 --- a/tests/regression_test/data/markerJapan.pet +++ b/tests/regression_test/data/markerJapan.pet @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE PETRACK> -<PETRACK VERSION="0.10.2"> +<PETRACK VERSION="0.10.3"> <MAIN SRC="markerJapan/000100000.jpg" STATUS_HEIGHT="0"/> <CONTROL TAB="0"> <CALIBRATION> @@ -11,7 +11,10 @@ <SWAP ENABLED="0" HORIZONTALLY="0" VERTICALLY="0"/> <BG_SUB DELETE="1" DELETE_NUMBER="3" ENABLED="0" FILE="" SHOW="0" UPDATE="0"/> <PATTERN BOARD_SIZE_X="6" BOARD_SIZE_Y="8" SQUARE_SIZE="4.5999999"/> - <INTRINSIC_PARAMETERS CALIB_FILES="" CX="973" CY="620" ENABLED="1" EXT_MODEL_ENABLED="0" FIX_CENTER="0" FX="1653.49" FY="1673.5599999999999" IMMUTABLE="0" K4="0" K5="0" K6="0" QUAD_ASPECT_RATIO="0" R2="0.00068099999999999996" R4="-0.22715399999999999" R6="0" ReprError="nan" S1="0" S2="0" S3="0" S4="0" TANG_DIST="1" TAUX="0" TAUY="0" TX="0.0042729999999999999" TY="0.00044799999999999999"/> + <INTRINSIC_PARAMETERS CALIB_FILES="" ENABLED="1" EXT_MODEL_ENABLED="0" FIX_CENTER="0" IMMUTABLE="0" QUAD_ASPECT_RATIO="0" TANG_DIST="1"> + <OLD_MODEL CX="973" CY="620" FX="1653.49" FY="1673.5599999999999" K4="0" K5="0" K6="0" R2="0.000681" R4="-0.227154" R6="0" ReprError="nan" S1="0" S2="0" S3="0" S4="0" TAUX="0" TAUY="0" TX="0.0042730002" TY="0.00044800001"/> + <EXT_MODEL CX="551.5" CY="383.5" FX="881" FY="881" K4="0" K5="0" K6="0" R2="0" R4="0" R6="0" ReprError="nan" S1="0" S2="0" S3="0" S4="0" TAUX="0" TAUY="0" TX="0" TY="0"/> + </INTRINSIC_PARAMETERS> <EXTRINSIC_PARAMETERS ALTITUDE="2035" COORD3D_AXIS_LEN="200" COORD3D_SWAP_X="0" COORD3D_SWAP_Y="0" COORD3D_SWAP_Z="0" COORD3D_TRANS_X="0" COORD3D_TRANS_Y="0" COORD3D_TRANS_Z="0" COORD_DIMENSION="1" EXTERNAL_CALIB_FILE="" EXTR_ROT_1="0" EXTR_ROT_2="0" EXTR_ROT_3="0" EXTR_TRANS_1="0" EXTR_TRANS_2="0" EXTR_TRANS_3="-500" FIX="1" IMMUTABLE_COORD_BOX="0" IMMUTABLE_EXTRINSIC_BOX="0" ROTATE="3594" SCALE="1000" SHOW="1" SHOW_CALIB_POINTS="0" TRANS_X="14450" TRANS_Y="5468" UNIT="120" USE_INTRINSIC_CENTER="0"/> <ALIGNMENT_GRID FIX="1" GRID3D_RESOLUTION="100" GRID3D_TRANS_X="0" GRID3D_TRANS_Y="0" GRID3D_TRANS_Z="0" GRID_DIMENSION="1" IMMUTABLE="0" ROTATE="895" SCALE="1001" SHOW="0" TRANS_X="392" TRANS_Y="586"/> </CALIBRATION> diff --git a/tests/regression_test/data/multiColorMarkerWithAruco.pet b/tests/regression_test/data/multiColorMarkerWithAruco.pet index f0de23e3b4f1da50cecd36ab9068664ed761b039..c40a9e5202f8b0893dcc1c5c72d7fc52ab8bdf77 100644 --- a/tests/regression_test/data/multiColorMarkerWithAruco.pet +++ b/tests/regression_test/data/multiColorMarkerWithAruco.pet @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE PETRACK> -<PETRACK VERSION="0.10.2"> +<PETRACK VERSION="0.10.3"> <MAIN SRC="multiColorMarkerWithAruco.mp4" STATUS_HEIGHT="0"/> <CONTROL TAB="1"> <CALIBRATION> @@ -11,7 +11,10 @@ <SWAP ENABLED="0" HORIZONTALLY="0" VERTICALLY="0"/> <BG_SUB DELETE="1" DELETE_NUMBER="3" ENABLED="0" FILE="" SHOW="0" UPDATE="0"/> <PATTERN BOARD_SIZE_X="6" BOARD_SIZE_Y="8" SQUARE_SIZE="4.5999999"/> - <INTRINSIC_PARAMETERS CALIB_FILES="" CX="983.10000000000002" CY="572.13" ENABLED="1" EXT_MODEL_ENABLED="0" FIX_CENTER="0" FX="1860.1700000000001" FY="1862.24" IMMUTABLE="0" K4="0" K5="0" K6="0" QUAD_ASPECT_RATIO="0" R2="-0.37733299999999997" R4="0.242947" R6="-0.15323500000000001" ReprError="nan" S1="0" S2="0" S3="0" S4="0" TANG_DIST="1" TAUX="0" TAUY="0" TX="-0.0040350000000000004" TY="-0.001372"/> + <INTRINSIC_PARAMETERS CALIB_FILES="" ENABLED="1" EXT_MODEL_ENABLED="0" FIX_CENTER="0" IMMUTABLE="0" QUAD_ASPECT_RATIO="0" TANG_DIST="1"> + <OLD_MODEL CX="983.10000000000002" CY="572.13" FX="1860.1700000000001" FY="1862.24" K4="0" K5="0" K6="0" R2="-0.37733299" R4="0.242947" R6="-0.153235" ReprError="nan" S1="0" S2="0" S3="0" S4="0" TAUX="0" TAUY="0" TX="-0.0040350002" TY="-0.001372"/> + <EXT_MODEL CX="551.5" CY="383.5" FX="881" FY="881" K4="0" K5="0" K6="0" R2="0" R4="0" R6="0" ReprError="nan" S1="0" S2="0" S3="0" S4="0" TAUX="0" TAUY="0" TX="0" TY="0"/> + </INTRINSIC_PARAMETERS> <EXTRINSIC_PARAMETERS ALTITUDE="535" COORD3D_AXIS_LEN="200" COORD3D_SWAP_X="0" COORD3D_SWAP_Y="0" COORD3D_SWAP_Z="0" COORD3D_TRANS_X="0" COORD3D_TRANS_Y="0" COORD3D_TRANS_Z="0" COORD_DIMENSION="0" EXTERNAL_CALIB_FILE="" EXTR_ROT_1="-2.1299999999999999" EXTR_ROT_2="2.1579999999999999" EXTR_ROT_3="-0.036999999999999998" EXTR_TRANS_1="14.253" EXTR_TRANS_2="14.198" EXTR_TRANS_3="-528.09799999999996" FIX="0" IMMUTABLE_COORD_BOX="0" IMMUTABLE_EXTRINSIC_BOX="0" ROTATE="0" SCALE="100" SHOW="0" SHOW_CALIB_POINTS="0" TRANS_X="0" TRANS_Y="0" UNIT="100" USE_INTRINSIC_CENTER="0"/> <ALIGNMENT_GRID FIX="0" GRID3D_RESOLUTION="100" GRID3D_TRANS_X="0" GRID3D_TRANS_Y="0" GRID3D_TRANS_Z="0" GRID_DIMENSION="0" IMMUTABLE="0" ROTATE="0" SCALE="100" SHOW="0" TRANS_X="0" TRANS_Y="0"/> </CALIBRATION> diff --git a/tests/regression_test/data/multiColorMarkerWithAruco_dictMip36h12.pet b/tests/regression_test/data/multiColorMarkerWithAruco_dictMip36h12.pet index 732bcb9b8489b3bb759a70e8a0503c89e051e9c2..702837ff568f4d93143ae5a537f860b4c8f4ffdc 100644 --- a/tests/regression_test/data/multiColorMarkerWithAruco_dictMip36h12.pet +++ b/tests/regression_test/data/multiColorMarkerWithAruco_dictMip36h12.pet @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE PETRACK> -<PETRACK VERSION="0.10.2"> +<PETRACK VERSION="0.10.3"> <MAIN SRC="multiColorMarkerWithAruco_dictMip36h12.mp4" STATUS_HEIGHT="0"/> <CONTROL TAB="1"> <CALIBRATION> @@ -11,7 +11,10 @@ <SWAP ENABLED="0" HORIZONTALLY="0" VERTICALLY="0"/> <BG_SUB DELETE="1" DELETE_NUMBER="3" ENABLED="0" FILE="" SHOW="0" UPDATE="0"/> <PATTERN BOARD_SIZE_X="6" BOARD_SIZE_Y="8" SQUARE_SIZE="4.5999999"/> - <INTRINSIC_PARAMETERS CALIB_FILES="" CX="2380.0599999999999" CY="1911.8699999999999" ENABLED="1" EXT_MODEL_ENABLED="0" FIX_CENTER="0" FX="1716.1300000000001" FY="1716.6199999999999" IMMUTABLE="0" K4="0" K5="0" K6="0" QUAD_ASPECT_RATIO="0" R2="-0.23147100000000001" R4="0.060733000000000002" R6="-0.0072639999999999996" ReprError="nan" S1="0" S2="0" S3="0" S4="0" TANG_DIST="1" TAUX="0" TAUY="0" TX="0.000106" TY="0.00046500000000000003"/> + <INTRINSIC_PARAMETERS CALIB_FILES="" ENABLED="1" EXT_MODEL_ENABLED="0" FIX_CENTER="0" IMMUTABLE="0" QUAD_ASPECT_RATIO="0" TANG_DIST="1"> + <OLD_MODEL CX="2380.0599999999999" CY="1911.8699999999999" FX="1716.1300000000001" FY="1716.6199999999999" K4="0" K5="0" K6="0" R2="-0.231471" R4="0.060733002" R6="-0.0072639999" ReprError="nan" S1="0" S2="0" S3="0" S4="0" TAUX="0" TAUY="0" TX="0.000106" TY="0.00046499999"/> + <EXT_MODEL CX="551.5" CY="383.5" FX="881" FY="881" K4="0" K5="0" K6="0" R2="0" R4="0" R6="0" ReprError="nan" S1="0" S2="0" S3="0" S4="0" TAUX="0" TAUY="0" TX="0" TY="0"/> + </INTRINSIC_PARAMETERS> <EXTRINSIC_PARAMETERS ALTITUDE="535" COORD3D_AXIS_LEN="200" COORD3D_SWAP_X="0" COORD3D_SWAP_Y="0" COORD3D_SWAP_Z="0" COORD3D_TRANS_X="0" COORD3D_TRANS_Y="0" COORD3D_TRANS_Z="0" COORD_DIMENSION="0" EXTERNAL_CALIB_FILE="" EXTR_ROT_1="3.1219999999999999" EXTR_ROT_2="0.041000000000000002" EXTR_ROT_3="0.050999999999999997" EXTR_TRANS_1="-1.2969999999999999" EXTR_TRANS_2="6.5439999999999996" EXTR_TRANS_3="-423.565" FIX="0" IMMUTABLE_COORD_BOX="0" IMMUTABLE_EXTRINSIC_BOX="0" ROTATE="0" SCALE="100" SHOW="0" SHOW_CALIB_POINTS="0" TRANS_X="0" TRANS_Y="0" UNIT="100" USE_INTRINSIC_CENTER="0"/> <ALIGNMENT_GRID FIX="0" GRID3D_RESOLUTION="100" GRID3D_TRANS_X="0" GRID3D_TRANS_Y="0" GRID3D_TRANS_Z="0" GRID_DIMENSION="0" IMMUTABLE="0" ROTATE="0" SCALE="100" SHOW="0" TRANS_X="0" TRANS_Y="0"/> </CALIBRATION> diff --git a/tests/regression_test/data/multicolor.pet b/tests/regression_test/data/multicolor.pet index da303259c43629aafa3eae9184b8315c3528890f..8c4b619cf48b51e93969fa8d3ba0ff1befc647c8 100644 --- a/tests/regression_test/data/multicolor.pet +++ b/tests/regression_test/data/multicolor.pet @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE PETRACK> -<PETRACK VERSION="0.10.2"> +<PETRACK VERSION="0.10.3"> <MAIN SRC="multicolor.mp4" STATUS_HEIGHT="0"/> <CONTROL TAB="2"> <CALIBRATION> @@ -11,7 +11,10 @@ <SWAP ENABLED="0" HORIZONTALLY="0" VERTICALLY="0"/> <BG_SUB DELETE="1" DELETE_NUMBER="3" ENABLED="0" FILE="" SHOW="0" UPDATE="0"/> <PATTERN BOARD_SIZE_X="6" BOARD_SIZE_Y="8" SQUARE_SIZE="4.5999999"/> - <INTRINSIC_PARAMETERS CALIB_FILES="" CX="1134.04" CY="880.72000000000003" ENABLED="1" EXT_MODEL_ENABLED="0" FIX_CENTER="0" FX="842.57000000000005" FY="842.69000000000005" IMMUTABLE="0" K4="0" K5="0" K6="0" QUAD_ASPECT_RATIO="0" R2="-0.27662599999999998" R4="0.093287999999999996" R6="-0.01423" ReprError="nan" S1="0" S2="0" S3="0" S4="0" TANG_DIST="1" TAUX="0" TAUY="0" TX="-0.00024699999999999999" TY="5.5000000000000002e-05"/> + <INTRINSIC_PARAMETERS CALIB_FILES="" ENABLED="1" EXT_MODEL_ENABLED="0" FIX_CENTER="0" IMMUTABLE="0" QUAD_ASPECT_RATIO="0" TANG_DIST="1"> + <OLD_MODEL CX="1134.04" CY="880.72000000000003" FX="842.57000000000005" FY="842.69000000000005" K4="0" K5="0" K6="0" R2="-0.27662599" R4="0.093287997" R6="-0.01423" ReprError="nan" S1="0" S2="0" S3="0" S4="0" TAUX="0" TAUY="0" TX="-0.00024699999" TY="5.5e-05"/> + <EXT_MODEL CX="551.5" CY="383.5" FX="881" FY="881" K4="0" K5="0" K6="0" R2="0" R4="0" R6="0" ReprError="nan" S1="0" S2="0" S3="0" S4="0" TAUX="0" TAUY="0" TX="0" TY="0"/> + </INTRINSIC_PARAMETERS> <EXTRINSIC_PARAMETERS ALTITUDE="535" COORD3D_AXIS_LEN="200" COORD3D_SWAP_X="0" COORD3D_SWAP_Y="1" COORD3D_SWAP_Z="0" COORD3D_TRANS_X="0" COORD3D_TRANS_Y="0" COORD3D_TRANS_Z="0" COORD_DIMENSION="0" EXTERNAL_CALIB_FILE="" EXTR_ROT_1="-2.1920000000000002" EXTR_ROT_2="-2.1829999999999998" EXTR_ROT_3="0.016" EXTR_TRANS_1="-1043.473" EXTR_TRANS_2="13.741" EXTR_TRANS_3="-626.84199999999998" FIX="0" IMMUTABLE_COORD_BOX="0" IMMUTABLE_EXTRINSIC_BOX="0" ROTATE="0" SCALE="100" SHOW="0" SHOW_CALIB_POINTS="0" TRANS_X="0" TRANS_Y="0" UNIT="100" USE_INTRINSIC_CENTER="0"/> <ALIGNMENT_GRID FIX="0" GRID3D_RESOLUTION="100" GRID3D_TRANS_X="91" GRID3D_TRANS_Y="34" GRID3D_TRANS_Z="0" GRID_DIMENSION="0" IMMUTABLE="0" ROTATE="0" SCALE="100" SHOW="0" TRANS_X="0" TRANS_Y="0"/> </CALIBRATION> diff --git a/tests/regression_test/data/test_Fps_truth.pet b/tests/regression_test/data/test_Fps_truth.pet index 7e1935d85233c94faac2487265e32f251b61ff18..d6e3298908ffeff8e32ac5304f8632d56f26c004 100644 --- a/tests/regression_test/data/test_Fps_truth.pet +++ b/tests/regression_test/data/test_Fps_truth.pet @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE PETRACK> -<PETRACK VERSION="0.10.2"> +<PETRACK VERSION="0.10.3"> <MAIN SRC="../../../demo/00_files/video/video.mp4" STATUS_HEIGHT="0"/> <CONTROL TAB="0"> <CALIBRATION> @@ -11,7 +11,10 @@ <SWAP ENABLED="0" HORIZONTALLY="0" VERTICALLY="0"/> <BG_SUB DELETE="1" DELETE_NUMBER="3" ENABLED="0" FILE="" SHOW="0" UPDATE="0"/> <PATTERN BOARD_SIZE_X="6" BOARD_SIZE_Y="8" SQUARE_SIZE="4.5999999"/> - <INTRINSIC_PARAMETERS CALIB_FILES="/home/luke/Dev/petrack/demo/00_files/calibration/intrinsic/01_still.png" CX="551.5" CY="383.5" ENABLED="0" EXT_MODEL_ENABLED="1" FIX_CENTER="0" FX="881" FY="881" IMMUTABLE="0" K4="0" K5="0" K6="0" QUAD_ASPECT_RATIO="0" R2="0" R4="0" R6="0" ReprError="nan" S1="0" S2="0" S3="0" S4="0" TANG_DIST="1" TAUX="0" TAUY="0" TX="0" TY="0"/> + <INTRINSIC_PARAMETERS CALIB_FILES="/home/luke/Dev/petrack/demo/00_files/calibration/intrinsic/01_still.png" ENABLED="0" EXT_MODEL_ENABLED="1" FIX_CENTER="0" IMMUTABLE="0" QUAD_ASPECT_RATIO="0" TANG_DIST="1"> + <OLD_MODEL CX="551.5" CY="383.5" FX="881" FY="881" K4="0" K5="0" K6="0" R2="0" R4="0" R6="0" ReprError="nan" S1="0" S2="0" S3="0" S4="0" TAUX="0" TAUY="0" TX="0" TY="0"/> + <EXT_MODEL CX="551.5" CY="383.5" FX="881" FY="881" K4="0" K5="0" K6="0" R2="0" R4="0" R6="0" ReprError="nan" S1="0" S2="0" S3="0" S4="0" TAUX="0" TAUY="0" TX="0" TY="0"/> + </INTRINSIC_PARAMETERS> <EXTRINSIC_PARAMETERS ALTITUDE="535" COORD3D_AXIS_LEN="200" COORD3D_SWAP_X="0" COORD3D_SWAP_Y="0" COORD3D_SWAP_Z="0" COORD3D_TRANS_X="0" COORD3D_TRANS_Y="0" COORD3D_TRANS_Z="0" COORD_DIMENSION="0" EXTERNAL_CALIB_FILE="" EXTR_ROT_1="0" EXTR_ROT_2="0" EXTR_ROT_3="0" EXTR_TRANS_1="0" EXTR_TRANS_2="0" EXTR_TRANS_3="-500" FIX="0" IMMUTABLE_COORD_BOX="0" IMMUTABLE_EXTRINSIC_BOX="0" ROTATE="0" SCALE="100" SHOW="0" SHOW_CALIB_POINTS="0" TRANS_X="0" TRANS_Y="0" UNIT="100" USE_INTRINSIC_CENTER="0"/> <ALIGNMENT_GRID FIX="0" GRID3D_RESOLUTION="100" GRID3D_TRANS_X="0" GRID3D_TRANS_Y="0" GRID3D_TRANS_Z="0" GRID_DIMENSION="0" IMMUTABLE="0" ROTATE="0" SCALE="100" SHOW="0" TRANS_X="0" TRANS_Y="0"/> </CALIBRATION> diff --git a/tests/regression_test/data/test_oldFps.pet b/tests/regression_test/data/test_oldFps.pet index 466eb6d71e32511463cfeae5024abb8288f18f6a..c7a17d46a5b2ae6d30bb05c66140139eadc5ebef 100644 --- a/tests/regression_test/data/test_oldFps.pet +++ b/tests/regression_test/data/test_oldFps.pet @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE PETRACK> -<PETRACK VERSION="0.10.2"> +<PETRACK VERSION="0.10.3"> <MAIN SRC="../../../demo/00_files/video/video.mp4" STATUS_HEIGHT="0"/> <CONTROL TAB="0"> <CALIBRATION> @@ -11,7 +11,10 @@ <SWAP ENABLED="0" HORIZONTALLY="0" VERTICALLY="0"/> <BG_SUB DELETE="1" DELETE_NUMBER="3" ENABLED="0" FILE="" SHOW="0" UPDATE="0"/> <PATTERN BOARD_SIZE_X="6" BOARD_SIZE_Y="8" SQUARE_SIZE="4.5999999"/> - <INTRINSIC_PARAMETERS CALIB_FILES="" CX="511.5" CY="383.5" ENABLED="0" EXT_MODEL_ENABLED="0" FIX_CENTER="0" FX="881" FY="881" IMMUTABLE="0" K4="0" K5="0" K6="0" QUAD_ASPECT_RATIO="0" R2="0" R4="0" R6="0" ReprError="nan" S1="0" S2="0" S3="0" S4="0" TANG_DIST="1" TAUX="0" TAUY="0" TX="0" TY="0"/> + <INTRINSIC_PARAMETERS CALIB_FILES="" ENABLED="0" EXT_MODEL_ENABLED="0" FIX_CENTER="0" IMMUTABLE="0" QUAD_ASPECT_RATIO="0" TANG_DIST="1"> + <OLD_MODEL CX="511.5" CY="383.5" FX="881" FY="881" K4="0" K5="0" K6="0" R2="0" R4="0" R6="0" ReprError="nan" S1="0" S2="0" S3="0" S4="0" TAUX="0" TAUY="0" TX="0" TY="0"/> + <EXT_MODEL CX="551.5" CY="383.5" FX="881" FY="881" K4="0" K5="0" K6="0" R2="0" R4="0" R6="0" ReprError="nan" S1="0" S2="0" S3="0" S4="0" TAUX="0" TAUY="0" TX="0" TY="0"/> + </INTRINSIC_PARAMETERS> <EXTRINSIC_PARAMETERS ALTITUDE="535" COORD3D_AXIS_LEN="200" COORD3D_SWAP_X="0" COORD3D_SWAP_Y="0" COORD3D_SWAP_Z="0" COORD3D_TRANS_X="0" COORD3D_TRANS_Y="0" COORD3D_TRANS_Z="0" COORD_DIMENSION="0" EXTERNAL_CALIB_FILE="" EXTR_ROT_1="0" EXTR_ROT_2="0" EXTR_ROT_3="0" EXTR_TRANS_1="0" EXTR_TRANS_2="0" EXTR_TRANS_3="-500" FIX="0" IMMUTABLE_COORD_BOX="0" IMMUTABLE_EXTRINSIC_BOX="0" ROTATE="0" SCALE="100" SHOW="0" SHOW_CALIB_POINTS="0" TRANS_X="0" TRANS_Y="0" UNIT="100" USE_INTRINSIC_CENTER="0"/> <ALIGNMENT_GRID FIX="0" GRID3D_RESOLUTION="100" GRID3D_TRANS_X="0" GRID3D_TRANS_Y="0" GRID3D_TRANS_Z="0" GRID_DIMENSION="0" IMMUTABLE="0" ROTATE="0" SCALE="100" SHOW="0" TRANS_X="0" TRANS_Y="0"/> </CALIBRATION> diff --git a/tests/regression_test/data/test_oldFps_truth.pet b/tests/regression_test/data/test_oldFps_truth.pet index f9b2dacd5165d867513d059e35c8ab239c0bda38..29d907e99945cd3ba5cd93cf66d1f994f65e6cbe 100644 --- a/tests/regression_test/data/test_oldFps_truth.pet +++ b/tests/regression_test/data/test_oldFps_truth.pet @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE PETRACK> -<PETRACK VERSION="0.10.2"> +<PETRACK VERSION="0.10.3"> <MAIN SRC="../../../demo/00_files/video/video.mp4" STATUS_HEIGHT="0"/> <CONTROL TAB="0"> <CALIBRATION> @@ -11,7 +11,10 @@ <SWAP ENABLED="0" HORIZONTALLY="0" VERTICALLY="0"/> <BG_SUB DELETE="1" DELETE_NUMBER="3" ENABLED="0" FILE="" SHOW="0" UPDATE="0"/> <PATTERN BOARD_SIZE_X="6" BOARD_SIZE_Y="8" SQUARE_SIZE="4.5999999"/> - <INTRINSIC_PARAMETERS CALIB_FILES="" CX="511.5" CY="383.5" ENABLED="0" EXT_MODEL_ENABLED="0" FIX_CENTER="0" FX="881" FY="881" IMMUTABLE="0" K4="0" K5="0" K6="0" QUAD_ASPECT_RATIO="0" R2="0" R4="0" R6="0" ReprError="nan" S1="0" S2="0" S3="0" S4="0" TANG_DIST="1" TAUX="0" TAUY="0" TX="0" TY="0"/> + <INTRINSIC_PARAMETERS CALIB_FILES="" ENABLED="0" EXT_MODEL_ENABLED="0" FIX_CENTER="0" IMMUTABLE="0" QUAD_ASPECT_RATIO="0" TANG_DIST="1"> + <OLD_MODEL CX="511.5" CY="383.5" FX="881" FY="881" K4="0" K5="0" K6="0" R2="0" R4="0" R6="0" ReprError="nan" S1="0" S2="0" S3="0" S4="0" TAUX="0" TAUY="0" TX="0" TY="0"/> + <EXT_MODEL CX="551.5" CY="383.5" FX="881" FY="881" K4="0" K5="0" K6="0" R2="0" R4="0" R6="0" ReprError="nan" S1="0" S2="0" S3="0" S4="0" TAUX="0" TAUY="0" TX="0" TY="0"/> + </INTRINSIC_PARAMETERS> <EXTRINSIC_PARAMETERS ALTITUDE="535" COORD3D_AXIS_LEN="200" COORD3D_SWAP_X="0" COORD3D_SWAP_Y="0" COORD3D_SWAP_Z="0" COORD3D_TRANS_X="0" COORD3D_TRANS_Y="0" COORD3D_TRANS_Z="0" COORD_DIMENSION="0" EXTERNAL_CALIB_FILE="" EXTR_ROT_1="0" EXTR_ROT_2="0" EXTR_ROT_3="0" EXTR_TRANS_1="0" EXTR_TRANS_2="0" EXTR_TRANS_3="-500" FIX="0" IMMUTABLE_COORD_BOX="0" IMMUTABLE_EXTRINSIC_BOX="0" ROTATE="0" SCALE="100" SHOW="0" SHOW_CALIB_POINTS="0" TRANS_X="0" TRANS_Y="0" UNIT="100" USE_INTRINSIC_CENTER="0"/> <ALIGNMENT_GRID FIX="0" GRID3D_RESOLUTION="100" GRID3D_TRANS_X="0" GRID3D_TRANS_Y="0" GRID3D_TRANS_Z="0" GRID_DIMENSION="0" IMMUTABLE="0" ROTATE="0" SCALE="100" SHOW="0" TRANS_X="0" TRANS_Y="0"/> </CALIBRATION> diff --git a/tests/regression_test/tests/test_calib.py b/tests/regression_test/tests/test_calib.py index e7d6f0fef17c91abb0a86c15009487cd2c913185..30492fc034a59e06bfd569e47815ef62e512d99d 100644 --- a/tests/regression_test/tests/test_calib.py +++ b/tests/regression_test/tests/test_calib.py @@ -20,19 +20,14 @@ from pytest import approx import subprocess import xml.etree.ElementTree as ET import numpy as np +import math from dataclasses import dataclass from numpy import r_ -# NOTE: Does not test all options; ie. QuadAspectRatio, Fix Center, Ext. Model, ... - -def read_intrinsics(tree: ET.ElementTree) -> np.ndarray: - # NOTE: needs non-nan reprojection error - - node = tree.find("./CONTROL/CALIBRATION/INTRINSIC_PARAMETERS") - if node is None: - raise RuntimeError("Invalid pet-File! No Calibration node") +# NOTE: Does not test all options; ie. QuadAspectRatio, Fix Center, Ext. Model, ... +def extract_parameters(node): cx = float(node.get("CX", "nan")) cy = float(node.get("CY", "nan")) fx = float(node.get("FX", "nan")) @@ -47,14 +42,14 @@ def read_intrinsics(tree: ET.ElementTree) -> np.ndarray: s2 = float(node.get("S2", "nan")) s3 = float(node.get("S3", "nan")) s4 = float(node.get("S4", "nan")) - tang_dist = float(node.get("TANG_DIST", "nan")) taux = float(node.get("TAUX", "nan")) tauy = float(node.get("TAUY", "nan")) tx = float(node.get("TX", "nan")) ty = float(node.get("TY", "nan")) - # comparison will fail, if this is NaN reprojection_error = float(node.get("ReprError", "nan")) + if math.isnan(reprojection_error): + reprojection_error = float("-inf") return np.array( [ cx, @@ -71,7 +66,6 @@ def read_intrinsics(tree: ET.ElementTree) -> np.ndarray: s2, s3, s4, - tang_dist, taux, tauy, tx, @@ -81,6 +75,27 @@ def read_intrinsics(tree: ET.ElementTree) -> np.ndarray: ) +def read_intrinsics(tree: ET.ElementTree) -> np.ndarray: + # NOTE: needs non-nan reprojection error + + oldModelNode = tree.find("./CONTROL/CALIBRATION/INTRINSIC_PARAMETERS/OLD_MODEL") + + extModelNode = tree.find("./CONTROL/CALIBRATION/INTRINSIC_PARAMETERS/EXT_MODEL") + + if oldModelNode is None or extModelNode is None: + raise RuntimeError("Invalid pet-File! No Calibration node") + + node = tree.find("./CONTROL/CALIBRATION/INTRINSIC_PARAMETERS") + tang_dist = float(node.get("TANG_DIST", "nan")) + fix_center = float(node.get("FIX_CENTER", "nan")) + quad_aspect = float(node.get("QUAD_ASPECT_RATIO", "nan")) + + oldModelParams = extract_parameters(oldModelNode) + extModelParams = extract_parameters(extModelNode) + config = np.array([tang_dist, fix_center, quad_aspect]) + return np.concatenate([oldModelParams, extModelParams, config]) + + @dataclass class Extrinsic3DParams: rot: np.ndarray @@ -169,11 +184,36 @@ def test_autoCalib_default_options(pytestconfig): compare_intrinsic_calib(test_pet, truth_pet) -def test_autoCalib_old_model(pytestconfig): +def test_load_old_project_old_model(pytestconfig): petrack_path = pytestconfig.getoption("path") - project = "../data/00_empty.pet" - real_intrinsic = "../data/01_intrinsic.pet" - intrinsic_dir = "../../../demo/00_files/calibration/intrinsic" + project = "../data/01_old_intrinsic_oldModel.pet" + real_intrinsic = "../data/01_old_intrinsic_oldModel_truth.pet" + output = "../data/calibTest.pet" # same for other test, cannot be run concurrently + + # run autocalib on demo project + subprocess.run( + [ + petrack_path, + "-project", + project, + "-autosave", + output, + "-platform", + "offscreen", + ], + check=True, + ) + + test_pet = ET.parse(output) + truth_pet = ET.parse(real_intrinsic) + + compare_intrinsic_calib(test_pet, truth_pet) + + +def test_load_old_project_ext_model(pytestconfig): + petrack_path = pytestconfig.getoption("path") + project = "../data/01_old_intrinsic_extModel.pet" + real_intrinsic = "../data/01_old_intrinsic_extModel_truth.pet" output = "../data/calibTest.pet" # same for other test, cannot be run concurrently # run autocalib on demo project @@ -182,8 +222,6 @@ def test_autoCalib_old_model(pytestconfig): petrack_path, "-project", project, - "-autoIntrinsic", - intrinsic_dir, "-autosave", output, "-platform", @@ -200,9 +238,9 @@ def test_autoCalib_old_model(pytestconfig): def test_extr_calib(pytestconfig): petrack_path = pytestconfig.getoption("path") - project = "../data/01_intrinsic.pet" - real_extrinsic = "../data/02_extrinsic.pet" - extrinsic_file = "../data/before.3dc" + project = "../../../demo/01_calibration/01_intrinsic.pet" + real_extrinsic = "../../../demo/01_calibration/02_extrinsic.pet" + extrinsic_file = "../../../demo/01_calibration/before.3dc" output = ( "../data/extrCalibTest.pet" # same for other test, cannot be run concurrently ) diff --git a/tests/unit_test/ui/main-windows/tst_coordinateSystemBox.cpp b/tests/unit_test/ui/main-windows/tst_coordinateSystemBox.cpp index a510f5f92ca83a0e82fcd2fba04e2edc6838330c..a2b679b9dabb5f752d6fcf2f9de59cc9df3a24ca 100644 --- a/tests/unit_test/ui/main-windows/tst_coordinateSystemBox.cpp +++ b/tests/unit_test/ui/main-windows/tst_coordinateSystemBox.cpp @@ -42,7 +42,7 @@ TEST_CASE("CoordinateSystemBox: display of values in UI") ExtrinsicBox extrBox(nullptr, extrCalib); AutoCalib autoCalib{}; CalibFilter calibFilter; - IntrinsicBox intrBox{&petrack, autoCalib, calibFilter, []() {}}; + IntrinsicBox intrBox{&petrack, autoCalib, calibFilter, extrBox, []() {}}; ImageItem imageItem{&petrack, nullptr}; auto *ui = new Ui::CoordinateSystemBox(); CoordinateSystemBox coordSysBox{ @@ -142,7 +142,7 @@ TEST_CASE("CoordinateSystemBox: UI logic") ExtrinsicBox extrBox(nullptr, extrCalib); AutoCalib autoCalib{}; CalibFilter calibFilter; - IntrinsicBox intrBox{&petrack, autoCalib, calibFilter, []() {}}; + IntrinsicBox intrBox{&petrack, autoCalib, calibFilter, extrBox, []() {}}; ImageItem imageItem{&petrack, nullptr}; auto *ui = new Ui::CoordinateSystemBox(); int updateStatusPosCounter = 0; diff --git a/tests/unit_test/ui/main-windows/tst_extrinsicBox.cpp b/tests/unit_test/ui/main-windows/tst_extrinsicBox.cpp index be13dff71b70520bb193106697337f983957e323..efa392720bd1b9f403a6ee124ed51d797181d6c1 100644 --- a/tests/unit_test/ui/main-windows/tst_extrinsicBox.cpp +++ b/tests/unit_test/ui/main-windows/tst_extrinsicBox.cpp @@ -21,6 +21,7 @@ #include "personStorage.h" #include "petrack.h" #include "ui_extrinsicBox.h" +#include "util.h" #include <QDomElement> #include <catch2/catch.hpp> @@ -92,7 +93,7 @@ TEST_CASE("ExtrinsicBox: reading/writing xml") params.trans3 = 699; extrBox.setExtrinsicParameters(params); - + INFO(extrBox.getExtrinsicParameters().trans1); AND_WHEN("We save that state into an xml-document") { QDomDocument doc; @@ -108,6 +109,7 @@ TEST_CASE("ExtrinsicBox: reading/writing xml") ExtrinsicBox extrBox(nullptr, calib); extrBox.getXml(elem); + INFO(nodeToString(elem)); CHECK(extrBox.getExtrinsicParameters() == params); } } diff --git a/tests/unit_test/ui/main-windows/tst_intrinsicBox.cpp b/tests/unit_test/ui/main-windows/tst_intrinsicBox.cpp index 6f59b4a6caad23eb5701093a735b1973ff259cf3..1a5332b2e7614693d9c3f4c3ba0edc5129d36a49 100644 --- a/tests/unit_test/ui/main-windows/tst_intrinsicBox.cpp +++ b/tests/unit_test/ui/main-windows/tst_intrinsicBox.cpp @@ -18,14 +18,18 @@ #include "autoCalib.h" #include "calibFilter.h" +#include "extrCalibration.h" +#include "extrinsicBox.h" #include "intrinsicBox.h" +#include "personStorage.h" +#include "petrack.h" #include "ui_intrinsicBox.h" #include "util.h" #include <QDomElement> #include <QSignalSpy> -#include <QTextStream> #include <catch2/catch.hpp> +#include <catch2/trompeloeil.hpp> bool matEq(const cv::Mat &lhs, const cv::Mat &rhs) @@ -38,33 +42,37 @@ constexpr double SERIALIZATION_MARGIN = 0.01; TEST_CASE("IntrinsicCameraParams have value semantics") { IntrinsicCameraParams testParams; + testParams.setFx(1); + testParams.setFy(1); + testParams.setCx(0); + testParams.setCy(0); CHECK(matEq(testParams.cameraMatrix, cv::Mat::eye(cv::Size(3, 3), CV_64F))); CHECK(matEq(testParams.distortionCoeffs, cv::Mat::zeros(1, 14, CV_32F))); - CHECK(std::isnan(testParams.reprojectionError)); - testParams.cameraMatrix.at<double>(0, 0) = 1000; - testParams.distortionCoeffs.at<float>(0) = 2000; + CHECK(qIsNaN(testParams.reprojectionError)); + testParams.setFx(1000); + testParams.setR2(2000); SECTION("Copy Constructor") { IntrinsicCameraParams copy{testParams}; - copy.cameraMatrix.at<double>(1, 1) = -1; - copy.distortionCoeffs.at<double>(1) = -1; - CHECK(copy.cameraMatrix.at<double>(0, 0) == 1000); - CHECK(copy.distortionCoeffs.at<float>(0) == 2000); - CHECK(testParams.cameraMatrix.at<double>(1, 1) == 1); - CHECK(testParams.distortionCoeffs.at<float>(1) == 0); + copy.setFy(-1); + copy.setR4(-1); + CHECK(copy.getFx() == 1000); + CHECK(copy.getR2() == 2000); + CHECK(testParams.getFy() == 1); + CHECK(testParams.getR4() == 0); } SECTION("Copy Assignment") { IntrinsicCameraParams copy; - copy = testParams; - copy.cameraMatrix.at<double>(1, 1) = -1; - copy.distortionCoeffs.at<double>(1) = -1; - CHECK(copy.cameraMatrix.at<double>(0, 0) == 1000); - CHECK(copy.distortionCoeffs.at<float>(0) == 2000); - CHECK(testParams.cameraMatrix.at<double>(1, 1) == 1); - CHECK(testParams.distortionCoeffs.at<float>(1) == 0); + copy = testParams; + copy.setFy(-1); + copy.setR4(-1); + CHECK(copy.getFx() == 1000); + CHECK(copy.getR2() == 2000); + CHECK(testParams.getFy() == 1); + CHECK(testParams.getR4() == 0); } } @@ -72,60 +80,68 @@ TEST_CASE("IntrinsicCameraParams values") { AutoCalib autoCalib; CalibFilter filterCalib; + Petrack petrack{"Unkown"}; + Autosave autosave(petrack); + PersonStorage storage(petrack, autosave); + ExtrCalibration calib(storage); + ExtrinsicBox extrBox(nullptr, calib); Ui::IntrinsicBox *ui = new Ui::IntrinsicBox(); // ownership transferred to IntrinsicBox - auto intrBox = IntrinsicBox(nullptr, ui, autoCalib, filterCalib, []() {}); + auto intrBox = IntrinsicBox(nullptr, ui, autoCalib, filterCalib, extrBox, []() {}); QSignalSpy spy{&intrBox, &IntrinsicBox::paramsChanged}; CHECK(spy.isValid()); - + IntrinsicModelsParameters params; WHEN("I set the values of the IntrinsicParameters (via the setter)") { - IntrinsicCameraParams params; - params.cameraMatrix = (cv::Mat_<double>(3, 3) << 800, 2, 3, 4, 900, 6, 7, 8, 9); - std::iota(params.distortionCoeffs.begin<float>(), params.distortionCoeffs.end<float>(), -5); + params.oldModelParams.cameraMatrix = (cv::Mat_<double>(3, 3) << 800, 2, 3, 4, 900, 6, 7, 8, 9); // values need to be in valid range -5 to 5 - params.distortionCoeffs.at<float>(10) = 1; - params.distortionCoeffs.at<float>(11) = 2; - params.distortionCoeffs.at<float>(12) = 3; - params.distortionCoeffs.at<float>(13) = 4; + params.oldModelParams.distortionCoeffs = + (cv::Mat_<float>(1, 14) << -4.5, -4, -3.5, -3, -2.5, -2, -1.5, -1, 1, 1.5, 2, 2.5, 3, 3.5); - params.reprojectionError = 42; + params.oldModelParams.reprojectionError = 42; - intrBox.setIntrinsicCameraParams(params); + params.extModelParams.cameraMatrix = (cv::Mat_<double>(3, 3) << 600, 2, 3, 4, 800, 6, 7, 8, 9); + // values need to be in valid range -5 to 5 + params.extModelParams.distortionCoeffs = + (cv::Mat_<float>(1, 14) << 4.5, 4, 3.5, 3, 2.5, 2, 1.5, 1, -1, -1.5, -2, -2.5, -3, -3.5); + params.extModelParams.reprojectionError = 187; + intrBox.setIntrinsicCameraParams(params); THEN("The params are changed in the params-struct") { - auto newParams = intrBox.getIntrinsicCameraParams(); - CHECK(intrBox.getIntrinsicCameraParams() == params); + auto newParams = intrBox.getBothIntrinsicCameraParams(); + CHECK(newParams.oldModelParams == params.oldModelParams); + CHECK(newParams.extModelParams == params.extModelParams); } - THEN("The params are changed in the ui") + THEN("The extended model params are shown in the ui") { - CHECK(ui->fx->value() == params.cameraMatrix.at<double>(0, 0)); - CHECK(ui->fy->value() == params.cameraMatrix.at<double>(1, 1)); - CHECK(ui->cx->value() == params.cameraMatrix.at<double>(0, 2)); - CHECK(ui->cy->value() == params.cameraMatrix.at<double>(1, 2)); - - CHECK(ui->r2->value() == static_cast<double>(params.distortionCoeffs.at<float>(0))); - CHECK(ui->r4->value() == static_cast<double>(params.distortionCoeffs.at<float>(1))); - CHECK(ui->tx->value() == static_cast<double>(params.distortionCoeffs.at<float>(2))); - CHECK(ui->ty->value() == static_cast<double>(params.distortionCoeffs.at<float>(3))); - CHECK(ui->r6->value() == static_cast<double>(params.distortionCoeffs.at<float>(4))); - CHECK(ui->k4->value() == static_cast<double>(params.distortionCoeffs.at<float>(5))); - CHECK(ui->k5->value() == static_cast<double>(params.distortionCoeffs.at<float>(6))); - CHECK(ui->k6->value() == static_cast<double>(params.distortionCoeffs.at<float>(7))); - CHECK(ui->s1->value() == static_cast<double>(params.distortionCoeffs.at<float>(8))); - CHECK(ui->s2->value() == static_cast<double>(params.distortionCoeffs.at<float>(9))); - CHECK(ui->s3->value() == static_cast<double>(params.distortionCoeffs.at<float>(10))); - CHECK(ui->s4->value() == static_cast<double>(params.distortionCoeffs.at<float>(11))); - CHECK(ui->taux->value() == static_cast<double>(params.distortionCoeffs.at<float>(12))); - CHECK(ui->tauy->value() == static_cast<double>(params.distortionCoeffs.at<float>(13))); + CHECK(ui->fx->value() == Approx(params.extModelParams.getFx())); + CHECK(ui->fy->value() == Approx(params.extModelParams.getFy())); + CHECK(ui->cx->value() == Approx(params.extModelParams.getCx())); + CHECK(ui->cy->value() == Approx(params.extModelParams.getCy())); + + CHECK(ui->r2->value() == Approx(static_cast<double>(params.extModelParams.getR2()))); + CHECK(ui->r4->value() == Approx(static_cast<double>(params.extModelParams.getR4()))); + CHECK(ui->tx->value() == Approx(static_cast<double>(params.extModelParams.getTx()))); + CHECK(ui->ty->value() == Approx(static_cast<double>(params.extModelParams.getTy()))); + CHECK(ui->r6->value() == Approx(static_cast<double>(params.extModelParams.getR6()))); + CHECK(ui->k4->value() == Approx(static_cast<double>(params.extModelParams.getK4()))); + CHECK(ui->k5->value() == Approx(static_cast<double>(params.extModelParams.getK5()))); + CHECK(ui->k6->value() == Approx(static_cast<double>(params.extModelParams.getK6()))); + CHECK(ui->s1->value() == Approx(static_cast<double>(params.extModelParams.getS1()))); + CHECK(ui->s2->value() == Approx(static_cast<double>(params.extModelParams.getS2()))); + CHECK(ui->s3->value() == Approx(static_cast<double>(params.extModelParams.getS3()))); + CHECK(ui->s4->value() == Approx(static_cast<double>(params.extModelParams.getS4()))); + CHECK(ui->taux->value() == Approx(static_cast<double>(params.extModelParams.getTaux()))); + CHECK(ui->tauy->value() == Approx(static_cast<double>(params.extModelParams.getTauy()))); + CHECK( + ui->intrError->text().toDouble() == + Approx(static_cast<double>(params.extModelParams.reprojectionError))); } - GIVEN("Some parameters are out of range") { - params.distortionCoeffs.at<float>(12) = 156468; - auto oldParams = intrBox.getIntrinsicCameraParams(); + params.extModelParams.setS4(156468); THEN("An exception is thrown") { CHECK_THROWS_AS(intrBox.setIntrinsicCameraParams(params), std::domain_error); @@ -136,6 +152,37 @@ TEST_CASE("IntrinsicCameraParams values") { CHECK(spy.count() == 1); } + + AND_WHEN("I press the extended model checkbox") + { + ui->extModelCheckBox->setChecked(false); + + THEN("The old model parameters are shown in the UI") + { + CHECK(ui->fx->value() == Approx(params.oldModelParams.getFx())); + CHECK(ui->fy->value() == Approx(params.oldModelParams.getFy())); + CHECK(ui->cx->value() == Approx(params.oldModelParams.getCx())); + CHECK(ui->cy->value() == Approx(params.oldModelParams.getCy())); + + CHECK(ui->r2->value() == Approx(static_cast<double>(params.oldModelParams.getR2()))); + CHECK(ui->r4->value() == Approx(static_cast<double>(params.oldModelParams.getR4()))); + CHECK(ui->tx->value() == Approx(static_cast<double>(params.oldModelParams.getTx()))); + CHECK(ui->ty->value() == Approx(static_cast<double>(params.oldModelParams.getTy()))); + CHECK(ui->r6->value() == Approx(static_cast<double>(params.oldModelParams.getR6()))); + CHECK(ui->k4->value() == Approx(static_cast<double>(params.oldModelParams.getK4()))); + CHECK(ui->k5->value() == Approx(static_cast<double>(params.oldModelParams.getK5()))); + CHECK(ui->k6->value() == Approx(static_cast<double>(params.oldModelParams.getK6()))); + CHECK(ui->s1->value() == Approx(static_cast<double>(params.oldModelParams.getS1()))); + CHECK(ui->s2->value() == Approx(static_cast<double>(params.oldModelParams.getS2()))); + CHECK(ui->s3->value() == Approx(static_cast<double>(params.oldModelParams.getS3()))); + CHECK(ui->s4->value() == Approx(static_cast<double>(params.oldModelParams.getS4()))); + CHECK(ui->taux->value() == Approx(static_cast<double>(params.oldModelParams.getTaux()))); + CHECK(ui->tauy->value() == Approx(static_cast<double>(params.oldModelParams.getTauy()))); + CHECK( + ui->intrError->text().toDouble() == + Approx(static_cast<double>(params.oldModelParams.reprojectionError))); + } + } } } @@ -143,8 +190,13 @@ TEST_CASE("IntrinsicBox: reading/writing xml") { AutoCalib autoCalib; CalibFilter filterCalib; + Petrack petrack{"Unkown"}; + Autosave autosave(petrack); + PersonStorage storage(petrack, autosave); + ExtrCalibration calib(storage); + ExtrinsicBox extrBox(nullptr, calib); Ui::IntrinsicBox *ui = new Ui::IntrinsicBox(); // ownership transferred to IntrinsicBox - auto intrBox = IntrinsicBox(nullptr, ui, autoCalib, filterCalib, []() {}); + auto intrBox = IntrinsicBox(nullptr, ui, autoCalib, filterCalib, extrBox, []() {}); // spliting, because changing some of these also changes the intrinsic params WHEN("We change non-calculated values") @@ -173,8 +225,8 @@ TEST_CASE("IntrinsicBox: reading/writing xml") { AutoCalib newAutoCalib; CalibFilter newFilterCalib; - Ui::IntrinsicBox *newUi = new Ui::IntrinsicBox(); // ownership transferred to IntrinsicBox - auto newIntrBox = IntrinsicBox(nullptr, newUi, newAutoCalib, newFilterCalib, []() {}); + Ui::IntrinsicBox *newUi = new Ui::IntrinsicBox(); // ownership transferred to IntrinsicBox + auto newIntrBox = IntrinsicBox(nullptr, newUi, newAutoCalib, newFilterCalib, extrBox, []() {}); for(auto subElem = elem.firstChildElement(); !subElem.isNull(); subElem = subElem.nextSiblingElement()) { @@ -191,6 +243,24 @@ TEST_CASE("IntrinsicBox: reading/writing xml") CHECK(newUi->fixCenter->isChecked() == ui->fixCenter->isChecked()); CHECK(newUi->tangDist->isChecked() == ui->tangDist->isChecked()); CHECK(newUi->extModelCheckBox->isChecked() == ui->extModelCheckBox->isChecked()); + + AND_THEN("parameters are correctly disabled") + { + CHECK(!newUi->cx->isEnabled()); + CHECK(!newUi->cy->isEnabled()); + CHECK(!newUi->fy->isEnabled()); + CHECK(!newUi->tx->isEnabled()); + CHECK(!newUi->ty->isEnabled()); + CHECK(!newUi->k4->isEnabled()); + CHECK(!newUi->k5->isEnabled()); + CHECK(!newUi->k6->isEnabled()); + CHECK(!newUi->s1->isEnabled()); + CHECK(!newUi->s2->isEnabled()); + CHECK(!newUi->s3->isEnabled()); + CHECK(!newUi->s4->isEnabled()); + CHECK(!newUi->taux->isEnabled()); + CHECK(!newUi->tauy->isEnabled()); + } } } } @@ -214,8 +284,8 @@ TEST_CASE("IntrinsicBox: reading/writing xml") { AutoCalib newAutoCalib; CalibFilter newFilterCalib; - Ui::IntrinsicBox *newUi = new Ui::IntrinsicBox(); // ownership transferred to IntrinsicBox - auto newIntrBox = IntrinsicBox(nullptr, newUi, newAutoCalib, newFilterCalib, []() {}); + Ui::IntrinsicBox *newUi = new Ui::IntrinsicBox(); // ownership transferred to IntrinsicBox + auto newIntrBox = IntrinsicBox(nullptr, newUi, newAutoCalib, newFilterCalib, extrBox, []() {}); for(auto subElem = elem.firstChildElement(); !subElem.isNull(); subElem = subElem.nextSiblingElement()) { @@ -231,22 +301,25 @@ TEST_CASE("IntrinsicBox: reading/writing xml") WHEN("We change calculated values") { // set different parameters: - IntrinsicCameraParams params; - params.cameraMatrix = (cv::Mat_<double>(3, 3) << 800, 0, 5, 0, 900, 7, 0, 0, 1); - std::iota(params.distortionCoeffs.begin<float>(), params.distortionCoeffs.end<float>(), -5); + IntrinsicModelsParameters params; + params.oldModelParams.cameraMatrix = (cv::Mat_<double>(3, 3) << 800, 0, 5, 0, 900, 7, 0, 0, 1); + // values need to be in valid range -5 to 5 + params.oldModelParams.distortionCoeffs = + (cv::Mat_<float>(1, 14) << -4.5, -4, -3.5, -3, -2.5, -2, -1.5, -1, 1, 1.5, 2, 2.5, 3, 3.5); + params.oldModelParams.reprojectionError = 0.5; + + params.extModelParams.cameraMatrix = (cv::Mat_<double>(3, 3) << 600, 0, 5, 0, 800, 7, 0, 0, 1); // values need to be in valid range -5 to 5 - params.distortionCoeffs.at<float>(10) = 1; - params.distortionCoeffs.at<float>(11) = 2; - params.distortionCoeffs.at<float>(12) = 3; - params.distortionCoeffs.at<float>(13) = 4; - params.reprojectionError = 0.5; + params.extModelParams.distortionCoeffs = + (cv::Mat_<float>(1, 14) << 4.5, 4, 3.5, 3, 2.5, 2, 1.5, 1, -1, -1.5, -2, -2.5, -3, -3.5); + params.extModelParams.reprojectionError = 78.5; intrBox.setIntrinsicCameraParams(params); AND_WHEN("We save the widget into a pet-file") { QDomDocument doc; auto root = doc.createElement("PETRACK"); - root.setAttribute("VERSION", "0.9.2"); + root.setAttribute("VERSION", "0.10.1"); doc.appendChild(root); QDomElement elem = doc.createElement("CALIBRATION"); root.appendChild(elem); @@ -255,8 +328,8 @@ TEST_CASE("IntrinsicBox: reading/writing xml") { AutoCalib newAutoCalib; CalibFilter newFilterCalib; - Ui::IntrinsicBox *newUi = new Ui::IntrinsicBox(); // ownership transferred to IntrinsicBox - auto newIntrBox = IntrinsicBox(nullptr, newUi, newAutoCalib, newFilterCalib, []() {}); + Ui::IntrinsicBox *newUi = new Ui::IntrinsicBox(); // ownership transferred to IntrinsicBox + auto newIntrBox = IntrinsicBox(nullptr, newUi, newAutoCalib, newFilterCalib, extrBox, []() {}); for(auto subElem = elem.firstChildElement(); !subElem.isNull(); subElem = subElem.nextSiblingElement()) { @@ -264,16 +337,41 @@ TEST_CASE("IntrinsicBox: reading/writing xml") } INFO(nodeToString(elem).toStdString()) - auto oldParams = intrBox.getIntrinsicCameraParams(); - auto newParams = newIntrBox.getIntrinsicCameraParams(); + auto originalParams = intrBox.getBothIntrinsicCameraParams(); + auto serializedParams = newIntrBox.getBothIntrinsicCameraParams(); CHECK( - cv::norm(oldParams.cameraMatrix - newParams.cameraMatrix) == + cv::norm( + originalParams.oldModelParams.cameraMatrix - serializedParams.oldModelParams.cameraMatrix) == Approx(0).margin(SERIALIZATION_MARGIN)); CHECK( - cv::norm(oldParams.distortionCoeffs - newParams.distortionCoeffs) == + cv::norm( + originalParams.oldModelParams.distortionCoeffs - + serializedParams.oldModelParams.distortionCoeffs) == Approx(0).margin(SERIALIZATION_MARGIN)); + + CHECK( + originalParams.oldModelParams.reprojectionError == + Approx(serializedParams.oldModelParams.reprojectionError)); + + // check extended model parameters + CHECK( + cv::norm( + originalParams.extModelParams.cameraMatrix - serializedParams.extModelParams.cameraMatrix) == Approx(0).margin(SERIALIZATION_MARGIN)); + CHECK( + cv::norm( + originalParams.extModelParams.distortionCoeffs - + serializedParams.extModelParams.distortionCoeffs) == Approx(0).margin(SERIALIZATION_MARGIN)); - CHECK(oldParams.reprojectionError == Approx(newParams.reprojectionError)); + if(qIsNaN(originalParams.extModelParams.reprojectionError)) + { + CHECK(qIsNaN(serializedParams.extModelParams.reprojectionError)); + } + else + { + CHECK( + originalParams.extModelParams.reprojectionError == + Approx(serializedParams.extModelParams.reprojectionError)); + } } } } @@ -281,12 +379,17 @@ TEST_CASE("IntrinsicBox: reading/writing xml") TEST_CASE("ImageSizeChanged") { - AutoCalib autoCalib; - CalibFilter filterCalib; - auto *ui = new Ui::IntrinsicBox(); // ownership transferred to IntrinsicBox - auto intrBox = IntrinsicBox(nullptr, ui, autoCalib, filterCalib, []() {}); - constexpr int width = 1280; - constexpr int height = 720; + AutoCalib autoCalib; + CalibFilter filterCalib; + Petrack petrack{"Unkown"}; + Autosave autosave(petrack); + PersonStorage storage(petrack, autosave); + ExtrCalibration calib(storage); + ExtrinsicBox extrBox(nullptr, calib); + auto *ui = new Ui::IntrinsicBox(); // ownership transferred to IntrinsicBox + auto intrBox = IntrinsicBox(nullptr, ui, autoCalib, filterCalib, extrBox, []() {}); + constexpr int width = 1280; + constexpr int height = 720; WHEN("the image size changes") { @@ -294,10 +397,28 @@ TEST_CASE("ImageSizeChanged") { ui->fixCenter->setChecked(true); intrBox.imageSizeChanged(width, height, 0); + + double cxFixed = (width - 1) / 2.; + double cyFixed = (height - 1) / 2.; THEN("cx and cy are set to the new image center") { - CHECK(ui->cx->value() == Approx((width - 1) / 2.)); - CHECK(ui->cy->value() == Approx((height - 1) / 2.)); + IntrinsicCameraParams params = intrBox.getIntrinsicCameraParams(); + CHECK(params.getCx() == Approx(cxFixed)); + CHECK(params.getCy() == Approx(cyFixed)); + CHECK(ui->cx->value() == Approx(cxFixed)); + CHECK(ui->cy->value() == Approx(cyFixed)); + } + AND_WHEN("I switch calibration models") + { + ui->extModelCheckBox->setChecked(false); + IntrinsicCameraParams params = intrBox.getIntrinsicCameraParams(); + THEN("cx and cy are updated in ui and data accordingly") + { + CHECK(params.getCx() == Approx(cxFixed)); + CHECK(params.getCy() == Approx(cyFixed)); + CHECK(ui->cx->value() == Approx(cxFixed)); + CHECK(ui->cy->value() == Approx(cyFixed)); + } } }