1 /* 2 * Copyright (C) 2017 Alberto Irurueta Carro (alberto@irurueta.com) 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 package com.irurueta.ar.sfm; 17 18 import com.irurueta.ar.epipolar.CorrectorType; 19 import com.irurueta.ar.epipolar.estimators.FundamentalMatrixEstimatorMethod; 20 import com.irurueta.ar.epipolar.estimators.FundamentalMatrixRobustEstimator; 21 import com.irurueta.ar.epipolar.estimators.PROSACFundamentalMatrixRobustEstimator; 22 import com.irurueta.geometry.PinholeCameraIntrinsicParameters; 23 import com.irurueta.geometry.estimators.ProjectiveTransformation2DRobustEstimator; 24 import com.irurueta.numerical.robust.RobustEstimatorMethod; 25 26 import java.io.Serializable; 27 28 /** 29 * Base class containing configuration for a two view sparse re-constructor. 30 * 31 * @param <T> an actual implementation of a configuration class. 32 */ 33 public abstract class BaseTwoViewsSparseReconstructorConfiguration< 34 T extends BaseTwoViewsSparseReconstructorConfiguration<T>> implements Serializable { 35 /** 36 * Default robust fundamental matrix estimator method. 37 * This is only used when general scenes are allowed. 38 */ 39 public static final RobustEstimatorMethod DEFAULT_ROBUST_FUNDAMENTAL_MATRIX_ESTIMATOR_METHOD = 40 RobustEstimatorMethod.PROSAC; 41 42 /** 43 * Default non-robust fundamental matrix estimator method used internally 44 * within a robust estimator. 45 * This is only used when general scenes are allowed. 46 */ 47 public static final FundamentalMatrixEstimatorMethod DEFAULT_NON_ROBUST_FUNDAMENTAL_MATRIX_ESTIMATOR_METHOD = 48 FundamentalMatrixEstimatorMethod.SEVEN_POINTS_ALGORITHM; 49 50 /** 51 * Indicates that estimated fundamental matrix is refined by default using 52 * all found inliers. 53 * This is only used when general scenes are allowed. 54 */ 55 public static final boolean DEFAULT_REFINE_FUNDAMENTAL_MATRIX = true; 56 57 /** 58 * Indicates that fundamental matrix covariance is kept by default after the 59 * estimation. 60 * This is only used when general scenes are allowed. 61 */ 62 public static final boolean DEFAULT_KEEP_FUNDAMENTAL_MATRIX_COVARIANCE = false; 63 64 /** 65 * Default confidence of robustly estimated fundamental matrix. By default, 66 * this is 99%. 67 * This is only used when general scenes are allowed. 68 */ 69 public static final double DEFAULT_FUNDAMENTAL_MATRIX_CONFIDENCE = 70 FundamentalMatrixRobustEstimator.DEFAULT_CONFIDENCE; 71 72 /** 73 * Default maximum number of iterations to make while robustly estimating 74 * fundamental matrix. By default, this is 5000 iterations. 75 * This is only used when general scenes are allowed. 76 */ 77 public static final int DEFAULT_FUNDAMENTAL_MATRIX_MAX_ITERATIONS = 78 FundamentalMatrixRobustEstimator.DEFAULT_MAX_ITERATIONS; 79 80 /** 81 * Default threshold to determine whether samples for robust fundamental 82 * matrix estimation are inliers or not. 83 * This is only used when general scenes are allowed. 84 */ 85 public static final double DEFAULT_FUNDAMENTAL_MATRIX_THRESHOLD = 86 PROSACFundamentalMatrixRobustEstimator.DEFAULT_THRESHOLD; 87 88 /** 89 * Default value indicating that inlier data is kept after robust 90 * fundamental matrix estimation. 91 * This is only used when general scenes are allowed. 92 */ 93 public static final boolean DEFAULT_FUNDAMENTAL_MATRIX_COMPUTE_AND_KEEP_INLIERS = true; 94 95 /** 96 * Default value indicating that residual data is kept after robust 97 * fundamental matrix estimation. 98 * This is only used when general scenes are allowed. 99 */ 100 public static final boolean DEFAULT_FUNDAMENTAL_MATRIX_COMPUTE_AND_KEEP_RESIDUALS = true; 101 102 /** 103 * Default method to use for initial estimation of cameras. 104 */ 105 public static final InitialCamerasEstimatorMethod DEFAULT_INITIAL_CAMERAS_ESTIMATOR_METHOD = 106 InitialCamerasEstimatorMethod.DUAL_ABSOLUTE_QUADRIC_AND_ESSENTIAL_MATRIX; 107 108 /** 109 * Indicates whether an homogeneous point triangulator is used for point 110 * triangulation when Dual Absolute Quadric (DAQ) camera initialization is 111 * used. 112 */ 113 public static final boolean DEFAULT_DAQ_USE_HOMOGENEOUS_POINT_TRIANGULATOR = true; 114 115 /** 116 * Default aspect ratio for initial cameras. 117 */ 118 public static final double DEFAULT_INITIAL_CAMERAS_ASPECT_RATIO = 1.0; 119 120 /** 121 * Default horizontal principal point value to use for initial cameras 122 * estimation using Dual Image of Absolute Conic (DIAC) or Dual Absolute 123 * Quadric (DAQ) methods. 124 */ 125 public static final double DEFAULT_INITIAL_CAMERAS_PRINCIPAL_POINT_X = 0.0; 126 127 /** 128 * Default vertical principal point value to use for initial cameras 129 * estimation using Dual Image of Absolute Conic (DIAC) or Dual Absolute 130 * Quadric (DAQ) methods. 131 */ 132 public static final double DEFAULT_INITIAL_CAMERAS_PRINCIPAL_POINT_Y = 0.0; 133 134 /** 135 * Default corrector type to use for point triangulation when initial 136 * cameras are being estimated using either Dual Image of Absolute Conic 137 * (DIAC), Dual Absolute Quadric (DAQ) or essential matrix methods. 138 */ 139 public static final CorrectorType DEFAULT_INITIAL_CAMERAS_CORRECTOR_TYPE = CorrectorType.SAMPSON_CORRECTOR; 140 141 /** 142 * Default value indicating whether valid triangulated points are marked 143 * during initial cameras estimation using either Dual Image of Absolute 144 * Conic (DIAC) or essential matrix methods. 145 */ 146 public static final boolean DEFAULT_INITIAL_CAMERAS_MARK_VALID_TRIANGULATED_POINTS = true; 147 148 /** 149 * Indicates whether a general (points are laying in a general 3D position) 150 * scene is allowed. 151 * When true, an initial geometry estimation is attempted for general 152 * points. 153 */ 154 public static final boolean DEFAULT_ALLOW_GENERAL_SCENE = true; 155 156 /** 157 * Indicates whether a planar (points laying in a 3D plane) scene is 158 * allowed. 159 * When true, an initial geometry estimation is attempted for planar points. 160 */ 161 public static final boolean DEFAULT_ALLOW_PLANAR_SCENE = true; 162 163 /** 164 * Default robust planar homography estimator method. 165 * This is only used when planar scenes are allowed. 166 */ 167 public static final RobustEstimatorMethod DEFAULT_ROBUST_PLANAR_HOMOGRAPHY_ESTIMATOR_METHOD = 168 RobustEstimatorMethod.PROMEDS; 169 170 /** 171 * Indicates that planar homography is refined by default using all found 172 * inliers. 173 * This is only used when planar scenes are allowed. 174 */ 175 public static final boolean DEFAULT_REFINE_PLANAR_HOMOGRAPHY = true; 176 177 /** 178 * Indicates that planar homography covariance is kept by default after 179 * estimation. 180 * This is only used when planar scenes are allowed. 181 */ 182 public static final boolean DEFAULT_KEEP_PLANAR_HOMOGRAPHY_COVARIANCE = false; 183 184 /** 185 * Default confidence of robustly estimated planar homography. By default, 186 * this is 99%. 187 * This is only used when planar scenes are allowed. 188 */ 189 public static final double DEFAULT_PLANAR_HOMOGRAPHY_CONFIDENCE = 190 ProjectiveTransformation2DRobustEstimator.DEFAULT_CONFIDENCE; 191 192 /** 193 * Default maximum number of iterations to make while robustly estimating 194 * planar homography. By default, this is 5000 iterations. 195 * This is only used when planar scenes are allowed. 196 */ 197 public static final int DEFAULT_PLANAR_HOMOGRAPHY_MAX_ITERATIONS = 198 ProjectiveTransformation2DRobustEstimator.DEFAULT_MAX_ITERATIONS; 199 200 /** 201 * Default threshold to determine whether samples for robust projective 202 * 2D transformation estimation are inliers or not. 203 * This is only used when planar scenes are allowed. 204 */ 205 public static final double DEFAULT_PLANAR_HOMOGRAPHY_THRESHOLD = 1e-3; 206 207 /** 208 * Default value indicating that inlier data is kept after robust planar 209 * homography estimation. 210 * This is only used when planar scenes are allowed. 211 */ 212 public static final boolean DEFAULT_PLANAR_HOMOGRAPHY_COMPUTE_AND_KEEP_INLIERS = true; 213 214 /** 215 * Default value indicating that residual data is kept after robust planar 216 * homography estimation. 217 * This is only used when planar scenes are allowed. 218 */ 219 public static final boolean DEFAULT_PLANAR_HOMOGRAPHY_COMPUTE_AND_KEEP_RESIDUALS = true; 220 221 /** 222 * Method to use for non-robust fundamental matrix estimation. 223 * This is only used when general scenes are allowed. 224 */ 225 private FundamentalMatrixEstimatorMethod mNonRobustFundamentalMatrixEstimatorMethod = 226 DEFAULT_NON_ROBUST_FUNDAMENTAL_MATRIX_ESTIMATOR_METHOD; 227 228 /** 229 * Method to use for robust fundamental matrix estimation. 230 * This is only used when general scenes are allowed. 231 */ 232 private RobustEstimatorMethod mRobustFundamentalMatrixEstimatorMethod = 233 DEFAULT_ROBUST_FUNDAMENTAL_MATRIX_ESTIMATOR_METHOD; 234 235 /** 236 * Indicates whether estimated fundamental matrix is refined among all found 237 * inliers. 238 * This is only used when general scenes are allowed. 239 */ 240 private boolean refineFundamentalMatrix = DEFAULT_REFINE_FUNDAMENTAL_MATRIX; 241 242 /** 243 * Indicates whether covariance of estimated fundamental matrix is kept 244 * after the estimation. 245 * This is only used when general scenes are allowed. 246 */ 247 private boolean keepFundamentalMatrixCovariance = DEFAULT_KEEP_FUNDAMENTAL_MATRIX_COVARIANCE; 248 249 /** 250 * Confidence of robustly estimated fundamental matrix. 251 * This is only used when general scenes are allowed. 252 */ 253 private double fundamentalMatrixConfidence = DEFAULT_FUNDAMENTAL_MATRIX_CONFIDENCE; 254 255 /** 256 * Maximum number of iterations to robustly estimate fundamental matrix. 257 * This is only used when general scenes are allowed. 258 */ 259 private int fundamentalMatrixMaxIterations = DEFAULT_FUNDAMENTAL_MATRIX_MAX_ITERATIONS; 260 261 /** 262 * Threshold to determine whether samples for robust fundamental matrix 263 * estimation are inliers or not. 264 * This is only used when general scenes are allowed. 265 */ 266 private double fundamentalMatrixThreshold = DEFAULT_FUNDAMENTAL_MATRIX_THRESHOLD; 267 268 /** 269 * Indicates whether inliers must be kept during robust fundamental matrix 270 * estimation. 271 * This is only used when general scenes are allowed. 272 */ 273 private boolean fundamentalMatrixComputeAndKeepInliers = DEFAULT_FUNDAMENTAL_MATRIX_COMPUTE_AND_KEEP_INLIERS; 274 275 /** 276 * Indicates whether residuals must be computed and kept during robust 277 * fundamental matrix estimation. 278 * This is only used when general scenes are allowed. 279 */ 280 private boolean fundamentalMatrixComputeAndKeepResiduals = DEFAULT_FUNDAMENTAL_MATRIX_COMPUTE_AND_KEEP_RESIDUALS; 281 282 /** 283 * Method to use for initial estimation of cameras. 284 */ 285 private InitialCamerasEstimatorMethod initialCamerasEstimatorMethod = DEFAULT_INITIAL_CAMERAS_ESTIMATOR_METHOD; 286 287 /** 288 * Indicates whether an homogeneous point triangulator is used for point 289 * triangulation when Dual Absolute Quadric (DAQ) camera initialization is 290 * used. 291 */ 292 private boolean daqUseHomogeneousPointTriangulator = DEFAULT_DAQ_USE_HOMOGENEOUS_POINT_TRIANGULATOR; 293 294 /** 295 * Aspect ratio for initial cameras. 296 */ 297 private double initialCamerasAspectRatio = DEFAULT_INITIAL_CAMERAS_ASPECT_RATIO; 298 299 /** 300 * Horizontal principal point value to use for initial cameras estimation 301 * using Dual Image of Absolute Conic (DIAC) or Dual Absolute Quadric (DAQ) 302 * methods. 303 */ 304 private double principalPointX = DEFAULT_INITIAL_CAMERAS_PRINCIPAL_POINT_X; 305 306 /** 307 * Vertical principal point value to use for initial cameras estimation 308 * using Dual Image of Absolute Conic (DIAC) or Dual Absolute Quadric (DAQ) 309 * methods. 310 */ 311 private double principalPointY = DEFAULT_INITIAL_CAMERAS_PRINCIPAL_POINT_Y; 312 313 /** 314 * Corrector type to use for point triangulation when initial cameras are 315 * being estimated using either Dual Image of Absolute Conic (DIAC) or 316 * essential matrix methods or null if no corrector is used. 317 */ 318 private CorrectorType initialCamerasCorrectorType = DEFAULT_INITIAL_CAMERAS_CORRECTOR_TYPE; 319 320 /** 321 * Value indicating whether valid triangulated points are marked during 322 * initial cameras estimation using either Dual Image of Absolute Conic 323 * (DIAC) or essential matrix methods. 324 */ 325 private boolean initialCamerasMarkValidTriangulatedPoints = DEFAULT_INITIAL_CAMERAS_MARK_VALID_TRIANGULATED_POINTS; 326 327 /** 328 * Intrinsic parameters of first camera estimated using the essential matrix 329 * method. 330 */ 331 private PinholeCameraIntrinsicParameters initialIntrinsic1; 332 333 /** 334 * Intrinsic parameters of second camera estimated using the essential 335 * matrix method. 336 */ 337 private PinholeCameraIntrinsicParameters initialIntrinsic2; 338 339 /** 340 * Indicates whether a general scene (points laying in a general 3D 341 * position) is allowed. 342 * When true, an initial geometry estimation is attempted for general 343 * points. 344 */ 345 private boolean allowGeneralScene = DEFAULT_ALLOW_GENERAL_SCENE; 346 347 /** 348 * Indicates whether a planar scene (points laying in a 3D plane) is allowed. 349 * When true, an initial geometry estimation is attempted for planar points. 350 */ 351 private boolean allowPlanarScene = DEFAULT_ALLOW_PLANAR_SCENE; 352 353 /** 354 * Robust method to use for planar homography estimation. 355 * This is only used when planar scenes are allowed. 356 */ 357 private RobustEstimatorMethod robustPlanarHomographyEstimatorMethod = 358 DEFAULT_ROBUST_PLANAR_HOMOGRAPHY_ESTIMATOR_METHOD; 359 360 /** 361 * Indicates whether planar homography is refined using all found inliers or 362 * not. 363 * This is only used when planar scenes are allowed. 364 */ 365 private boolean refinePlanarHomography = DEFAULT_REFINE_PLANAR_HOMOGRAPHY; 366 367 /** 368 * Indicates whether planar homography covariance is kept after estimation. 369 * This is only used when planar scenes are allowed. 370 */ 371 private boolean keepPlanarHomographyCovariance = DEFAULT_KEEP_PLANAR_HOMOGRAPHY_COVARIANCE; 372 373 /** 374 * Confidence of robustly estimated planar homography. By default, this is 375 * 99%. 376 * This is only used when planar scenes are allowed. 377 */ 378 private double planarHomographyConfidence = DEFAULT_PLANAR_HOMOGRAPHY_CONFIDENCE; 379 380 /** 381 * Maximum number of iterations to make while robustly estimating planar 382 * homography. By default, this is 5000. 383 * This is only used when planar scenes are allowed. 384 */ 385 private int planarHomographyMaxIterations = DEFAULT_PLANAR_HOMOGRAPHY_MAX_ITERATIONS; 386 387 /** 388 * Threshold to determine whether samples for robust projective 2D 389 * transformation estimation are inliers or not. 390 */ 391 private double planarHomographyThreshold = DEFAULT_PLANAR_HOMOGRAPHY_THRESHOLD; 392 393 /** 394 * Value indicating that inlier data is kept after robust planar homography 395 * estimation. 396 * This is only used when planar scenes are allowed. 397 */ 398 private boolean planarHomographyComputeAndKeepInliers = DEFAULT_PLANAR_HOMOGRAPHY_COMPUTE_AND_KEEP_INLIERS; 399 400 /** 401 * Value indicating that residual data is kept after robust planar 402 * homography estimation. 403 * This is only used when planar scenes are allowed. 404 */ 405 private boolean planarHomographyComputeAndKeepResiduals = DEFAULT_PLANAR_HOMOGRAPHY_COMPUTE_AND_KEEP_RESIDUALS; 406 407 /** 408 * Constructor. 409 */ 410 protected BaseTwoViewsSparseReconstructorConfiguration() { 411 } 412 413 /** 414 * Gets method to use for non-robust fundamental matrix estimation. 415 * This is only used when general scenes are allowed. 416 * 417 * @return method to use for non-robust fundamental matrix estimation. 418 */ 419 public FundamentalMatrixEstimatorMethod getNonRobustFundamentalMatrixEstimatorMethod() { 420 return mNonRobustFundamentalMatrixEstimatorMethod; 421 } 422 423 /** 424 * Sets method to use for non-robust fundamental matrix estimation. 425 * This is only used when general scenes are allowed. 426 * 427 * @param method method to use for non-robust fundamental matrix estimation. 428 * @return this instance so that method can be easily chained. 429 */ 430 public T setNonRobustFundamentalMatrixEstimatorMethod(final FundamentalMatrixEstimatorMethod method) { 431 mNonRobustFundamentalMatrixEstimatorMethod = method; 432 //noinspection unchecked 433 return (T) this; 434 } 435 436 /** 437 * Gets method to use for robust fundamental matrix estimation. 438 * This is only used when general scenes are allowed. 439 * 440 * @return method to use for robust fundamental matrix estimation. 441 */ 442 public RobustEstimatorMethod getRobustFundamentalMatrixEstimatorMethod() { 443 return mRobustFundamentalMatrixEstimatorMethod; 444 } 445 446 /** 447 * Sets method to use for robust fundamental matrix estimation. 448 * This is only used when general scenes are allowed. 449 * 450 * @param method method to use for robust fundamental matrix estimation. 451 * @return this instance so that method can be easily chained. 452 */ 453 public T setRobustFundamentalMatrixEstimatorMethod(final RobustEstimatorMethod method) { 454 mRobustFundamentalMatrixEstimatorMethod = method; 455 //noinspection unchecked 456 return (T) this; 457 } 458 459 /** 460 * Indicates whether estimated fundamental matrix is refined among all found 461 * inliers. 462 * This is only used when general scenes are allowed. 463 * 464 * @return true if fundamental matrix is refined, false otherwise. 465 */ 466 public boolean isFundamentalMatrixRefined() { 467 return refineFundamentalMatrix; 468 } 469 470 /** 471 * Specifies whether estimated fundamental matrix is refined among all found 472 * inliers. 473 * This is only used when general scenes are allowed. 474 * 475 * @param refineFundamentalMatrix true if fundamental matrix is refined, 476 * false otherwise. 477 * @return this instance so that method can be easily chained. 478 */ 479 public T setFundamentalMatrixRefined(final boolean refineFundamentalMatrix) { 480 this.refineFundamentalMatrix = refineFundamentalMatrix; 481 //noinspection unchecked 482 return (T) this; 483 } 484 485 /** 486 * Indicates whether covariance of estimated fundamental matrix is kept 487 * after the estimation. 488 * This is only used when general scenes are allowed. 489 * 490 * @return true if covariance is kept, false otherwise. 491 */ 492 public boolean isFundamentalMatrixCovarianceKept() { 493 return keepFundamentalMatrixCovariance; 494 } 495 496 /** 497 * Specifies whether covariance of estimated fundamental matrix is kept 498 * after the estimation. 499 * This is only used when general scenes are allowed. 500 * 501 * @param keepFundamentalMatrixCovariance true if covariance is kept, false 502 * otherwise. 503 * @return this instance so that method can be easily chained. 504 */ 505 public T setFundamentalMatrixCovarianceKept(final boolean keepFundamentalMatrixCovariance) { 506 this.keepFundamentalMatrixCovariance = keepFundamentalMatrixCovariance; 507 //noinspection unchecked 508 return (T) this; 509 } 510 511 /** 512 * Gets confidence of robustly estimated fundamental matrix. 513 * This is only used when general scenes are allowed. 514 * 515 * @return confidence of robustly estimated fundamental matrix. 516 */ 517 public double getFundamentalMatrixConfidence() { 518 return fundamentalMatrixConfidence; 519 } 520 521 /** 522 * Sets confidence of robustly estimated fundamental matrix. 523 * This is only used when general scenes are allowed. 524 * 525 * @param fundamentalMatrixConfidence confidence of robustly estimated 526 * fundamental matrix. 527 * @return this instance so that method can be easily chained. 528 */ 529 public T setFundamentalMatrixConfidence(final double fundamentalMatrixConfidence) { 530 this.fundamentalMatrixConfidence = fundamentalMatrixConfidence; 531 //noinspection unchecked 532 return (T) this; 533 } 534 535 /** 536 * Gets maximum number of iterations to robustly estimate fundamental 537 * matrix. 538 * This is only used when general scenes are allowed. 539 * 540 * @return maximum number of iterations to robustly estimate fundamental 541 * matrix. 542 */ 543 public int getFundamentalMatrixMaxIterations() { 544 return fundamentalMatrixMaxIterations; 545 } 546 547 /** 548 * Sets maximum number of iterations to robustly estimate fundamental 549 * matrix. 550 * This is only used when general scenes are allowed. 551 * 552 * @param fundamentalMatrixMaxIterations maximum number of iterations to 553 * robustly estimate fundamental matrix. 554 * @return this instance so that method can be easily chained. 555 */ 556 public T setFundamentalMatrixMaxIterations(final int fundamentalMatrixMaxIterations) { 557 this.fundamentalMatrixMaxIterations = fundamentalMatrixMaxIterations; 558 //noinspection unchecked 559 return (T) this; 560 } 561 562 /** 563 * Gets threshold to determine whether samples for robust fundamental matrix 564 * estimation are inliers or not. 565 * This is only used when general scenes are allowed. 566 * 567 * @return threshold to determine whether samples for robust fundamental 568 * matrix estimation are inliers or not. 569 */ 570 public double getFundamentalMatrixThreshold() { 571 return fundamentalMatrixThreshold; 572 } 573 574 /** 575 * Sets threshold to determine whether samples for robust fundamental matrix 576 * estimation are inliers or not. 577 * This is only used when general scenes are allowed. 578 * 579 * @param fundamentalMatrixThreshold threshold to determine whether samples 580 * for robust fundamental matrix estimation are inliers or not. 581 * @return this instance so that method can be easily chained. 582 */ 583 public T setFundamentalMatrixThreshold(final double fundamentalMatrixThreshold) { 584 this.fundamentalMatrixThreshold = fundamentalMatrixThreshold; 585 //noinspection unchecked 586 return (T) this; 587 } 588 589 /** 590 * Indicates whether inliers must be kept during robust fundamental matrix 591 * estimation. 592 * This is only used when general scenes are allowed. 593 * 594 * @return true if inliers must be kept during robust fundamental matrix 595 * estimation, false otherwise. 596 */ 597 public boolean getFundamentalMatrixComputeAndKeepInliers() { 598 return fundamentalMatrixComputeAndKeepInliers; 599 } 600 601 /** 602 * Specifies whether inliers must be kept during robust fundamental matrix 603 * estimation. 604 * This is only used when general scenes are allowed. 605 * 606 * @param fundamentalMatrixComputeAndKeepInliers true if inliers must be 607 * kept during robust fundamental matrix estimation, 608 * false otherwise. 609 * @return this instance so that method can be easily chained. 610 */ 611 public T setFundamentalMatrixComputeAndKeepInliers(final boolean fundamentalMatrixComputeAndKeepInliers) { 612 this.fundamentalMatrixComputeAndKeepInliers = fundamentalMatrixComputeAndKeepInliers; 613 //noinspection unchecked 614 return (T) this; 615 } 616 617 /** 618 * Indicates whether residuals must be computed and kept during robust 619 * fundamental matrix estimation. 620 * This is only used when general scenes are allowed. 621 * 622 * @return true if residuals must be computed and kept, false otherwise. 623 */ 624 public boolean getFundamentalMatrixComputeAndKeepResiduals() { 625 return fundamentalMatrixComputeAndKeepResiduals; 626 } 627 628 /** 629 * Specifies whether residuals must be computed and kept during robust 630 * fundamental matrix estimation. 631 * This is only used when general scenes are allowed. 632 * 633 * @param fundamentalMatrixComputeAndKeepResiduals true if residuals must be 634 * computed and kept, false otherwise. 635 * @return this instance so that method can be easily chained. 636 */ 637 public T setFundamentalMatrixComputeAndKeepResiduals(final boolean fundamentalMatrixComputeAndKeepResiduals) { 638 this.fundamentalMatrixComputeAndKeepResiduals = fundamentalMatrixComputeAndKeepResiduals; 639 //noinspection unchecked 640 return (T) this; 641 } 642 643 /** 644 * Gets method to use for initial estimation of cameras. 645 * 646 * @return method to use for initial estimation of cameras. 647 */ 648 public InitialCamerasEstimatorMethod getInitialCamerasEstimatorMethod() { 649 return initialCamerasEstimatorMethod; 650 } 651 652 /** 653 * Sets method to use for initial estimation of cameras. 654 * 655 * @param method method to use for initial estimation of cameras. 656 * @return this instance so that method can be easily chained. 657 */ 658 public T setInitialCamerasEstimatorMethod(final InitialCamerasEstimatorMethod method) { 659 initialCamerasEstimatorMethod = method; 660 //noinspection unchecked 661 return (T) this; 662 } 663 664 /** 665 * Indicates whether an homogeneous point triangulator is used for point 666 * triangulation when Dual Absolute Quadric (DAQ) camera initialization is 667 * used. 668 * 669 * @return true if homogeneous point triangulator is used, false if an 670 * inhomogeneous point triangulator is used instead. 671 */ 672 public boolean getDaqUseHomogeneousPointTriangulator() { 673 return daqUseHomogeneousPointTriangulator; 674 } 675 676 /** 677 * Specifies whether an homogeneous point triangulator is used for point 678 * triangulation when Dual Absolute Quadric (DAQ) camera initialization is 679 * used. 680 * 681 * @param daqUseHomogeneousPointTriangulator true if homogeneous point 682 * triangulator is used, false if an inhomogeneous point 683 * triangulator is used instead. 684 * @return this instance so that method can be easily chained. 685 */ 686 public T setDaqUseHomogeneousPointTriangulator(final boolean daqUseHomogeneousPointTriangulator) { 687 this.daqUseHomogeneousPointTriangulator = daqUseHomogeneousPointTriangulator; 688 //noinspection unchecked 689 return (T) this; 690 } 691 692 /** 693 * Gets aspect ratio for initial cameras estimation using DAQ or DIAC 694 * methods. 695 * 696 * @return aspect ratio for initial cameras using DAQ or DIAC methods. 697 */ 698 public double getInitialCamerasAspectRatio() { 699 return initialCamerasAspectRatio; 700 } 701 702 /** 703 * Sets aspect ratio for initial cameras using DAQ or DIAC methods. 704 * 705 * @param initialCamerasAspectRatio aspect ratio for initial cameras using 706 * DAQ or DIAC methods. 707 * @return this instance so that method can be easily chained. 708 */ 709 public T setInitialCamerasAspectRatio(final double initialCamerasAspectRatio) { 710 this.initialCamerasAspectRatio = initialCamerasAspectRatio; 711 //noinspection unchecked 712 return (T) this; 713 } 714 715 /** 716 * Gets horizontal principal point value to use for initial cameras 717 * estimation using DIAC or DAQ methods. 718 * 719 * @return horizontal principal point value to use for initial cameras 720 * estimation using DIAC or DAQ methods. 721 */ 722 public double getPrincipalPointX() { 723 return principalPointX; 724 } 725 726 /** 727 * Sets horizontal principal point value to use for initial cameras 728 * estimation using DIAC or DAQ methods. 729 * 730 * @param principalPointX horizontal principal point value to use for 731 * initial cameras estimation using DIAC or DAQ methods. 732 * @return this instance so that method can be easily chained. 733 */ 734 public T setPrincipalPointX(final double principalPointX) { 735 this.principalPointX = principalPointX; 736 //noinspection unchecked 737 return (T) this; 738 } 739 740 /** 741 * Gets vertical principal point value to use for initial cameras estimation 742 * using DIAC or DAQ methods. 743 * 744 * @return vertical principal point value to use for initial cameras 745 * estimation using DIAC or DAQ methods. 746 */ 747 public double getPrincipalPointY() { 748 return principalPointY; 749 } 750 751 /** 752 * Sets vertical principal point value to use for initial cameras estimation 753 * using DIAC or DAQ methods. 754 * 755 * @param principalPointY vertical principal point value to use for 756 * initial cameras estimation using DIAC or DAQ methods. 757 * @return this instance so that method can be easily chained. 758 */ 759 public T setPrincipalPointY(final double principalPointY) { 760 this.principalPointY = principalPointY; 761 //noinspection unchecked 762 return (T) this; 763 } 764 765 /** 766 * Gets corrector type to use for point triangulation when initial cameras 767 * are being estimated using either DIAC or essential matrix methods or null 768 * if no corrector is used. 769 * 770 * @return corrector type to use for point triangulation when initial 771 * cameras are being estimated using either DIAC or essential matrix methods 772 * or null if no corrector is used. 773 */ 774 public CorrectorType getInitialCamerasCorrectorType() { 775 return initialCamerasCorrectorType; 776 } 777 778 /** 779 * Sets corrector type to use for point triangulation when initial cameras 780 * are being estimated using either DIAC or essential matrix methods or null 781 * if no corrector is used. 782 * 783 * @param type corrector type to use for point triangulation when initial 784 * cameras are being estimated using either DIAC or essential matrix methods 785 * or null if no corrector is used. 786 * @return this instance so that method can be easily chained. 787 */ 788 public T setInitialCamerasCorrectorType(final CorrectorType type) { 789 initialCamerasCorrectorType = type; 790 //noinspection unchecked 791 return (T) this; 792 } 793 794 /** 795 * Gets value indicating whether valid triangulated points are marked during 796 * initial cameras estimation using either DIAC or essential matrix methods. 797 * 798 * @return value indicating whether valid triangulated points are marked 799 * during initial cameras estimation using either DIAC or essential matrix 800 * methods. 801 */ 802 public boolean getInitialCamerasMarkValidTriangulatedPoints() { 803 return initialCamerasMarkValidTriangulatedPoints; 804 } 805 806 /** 807 * Sets value indicating whether valid triangulated points are marked during 808 * initial cameras estimation using either DIAC or essential matrix methods. 809 * 810 * @param initialCamerasMarkValidTriangulatedPoints value indicating whether 811 * valid triangulated points are marked during 812 * initial cameras estimation using either DIAC or 813 * essential matrix methods. 814 * @return this instance so that method can be easily chained. 815 */ 816 public T setInitialCamerasMarkValidTriangulatedPoints(final boolean initialCamerasMarkValidTriangulatedPoints) { 817 this.initialCamerasMarkValidTriangulatedPoints = initialCamerasMarkValidTriangulatedPoints; 818 //noinspection unchecked 819 return (T) this; 820 } 821 822 /** 823 * Gets intrinsic parameters of first camera estimated using the essential 824 * matrix method. 825 * 826 * @return intrinsic parameters of first camera estimated using the 827 * essential matrix method. 828 */ 829 public PinholeCameraIntrinsicParameters getInitialIntrinsic1() { 830 return initialIntrinsic1; 831 } 832 833 /** 834 * Sets intrinsic parameters of first camera estimated using the essential 835 * matrix method. 836 * 837 * @param initialIntrinsic1 intrinsic parameters of first camera estimated 838 * using the essential matrix method. 839 * @return this instance so that method can be easily chained. 840 */ 841 public T setInitialIntrinsic1(final PinholeCameraIntrinsicParameters initialIntrinsic1) { 842 this.initialIntrinsic1 = initialIntrinsic1; 843 //noinspection unchecked 844 return (T) this; 845 } 846 847 /** 848 * Gets intrinsic parameters of second camera estimated using the essential 849 * matrix method. 850 * 851 * @return intrinsic parameters of second camera estimated using the 852 * essential matrix method. 853 */ 854 public PinholeCameraIntrinsicParameters getInitialIntrinsic2() { 855 return initialIntrinsic2; 856 } 857 858 /** 859 * Sets intrinsic parameters of second camera estimated using the essential 860 * matrix method. 861 * 862 * @param initialIntrinsic2 intrinsic parameters of second camera estimated 863 * using the essential matrix method. 864 * @return this instance so that method can be easily chained. 865 */ 866 public T setInitialIntrinsic2(final PinholeCameraIntrinsicParameters initialIntrinsic2) { 867 this.initialIntrinsic2 = initialIntrinsic2; 868 //noinspection unchecked 869 return (T) this; 870 } 871 872 /** 873 * Indicates whether a general scene (points laying in a general 3D 874 * position) is allowed. 875 * When true, an initial geometry estimation is attempted for general 876 * points. 877 * 878 * @return true if general scene is allowed, false otherwise. 879 */ 880 public boolean isGeneralSceneAllowed() { 881 return allowGeneralScene; 882 } 883 884 /** 885 * Specifies whether a general scene (points laying in a general 3D 886 * position) is allowed. 887 * When true, an initial geometry estimation is attempted for general 888 * points. 889 * 890 * @param allowGeneralScene true if general scene is allowed, false 891 * otherwise. 892 * @return this instance so that method can be easily chained. 893 */ 894 public T setGeneralSceneAllowed(final boolean allowGeneralScene) { 895 this.allowGeneralScene = allowGeneralScene; 896 //noinspection unchecked 897 return (T) this; 898 } 899 900 /** 901 * Indicates whether a planar scene (points laying in a 3D plane) is allowed 902 * or not. 903 * When true, an initial geometry estimation is attempted for planar points. 904 * 905 * @return true if planar scene is allowed, false otherwise. 906 */ 907 public boolean isPlanarSceneAllowed() { 908 return allowPlanarScene; 909 } 910 911 /** 912 * Specifies whether a planar scene (points laying in a 3D plane) is allowed 913 * or not. 914 * When true, an initial geometry estimation is attempted for planar points. 915 * 916 * @param allowPlanarScene true if planar scene is allowed, false otherwise. 917 * @return this instance so that method can be easily chained. 918 */ 919 public T setPlanarSceneAllowed(final boolean allowPlanarScene) { 920 this.allowPlanarScene = allowPlanarScene; 921 //noinspection unchecked 922 return (T) this; 923 } 924 925 /** 926 * Gets robust method to use for planar homography estimation. 927 * This is only used when planar scenes are allowed. 928 * 929 * @return robust method to use for planar homography estimation. 930 */ 931 public RobustEstimatorMethod getRobustPlanarHomographyEstimatorMethod() { 932 return robustPlanarHomographyEstimatorMethod; 933 } 934 935 /** 936 * Sets robust method to use for planar homography estimation. 937 * This is only used when planar scenes are allowed. 938 * 939 * @param robustPlanarHomographyEstimatorMethod robust method to use for 940 * planar homography estimation. 941 * @return this instance so that method can be easily chained. 942 */ 943 public T setRobustPlanarHomographyEstimatorMethod( 944 final RobustEstimatorMethod robustPlanarHomographyEstimatorMethod) { 945 this.robustPlanarHomographyEstimatorMethod = robustPlanarHomographyEstimatorMethod; 946 //noinspection unchecked 947 return (T) this; 948 } 949 950 /** 951 * Indicates whether planar homography is refined using all found inliers or 952 * not. 953 * This is only used when planar scenes are allowed. 954 * 955 * @return true if planar homography is refined, false otherwise. 956 */ 957 public boolean isPlanarHomographyRefined() { 958 return refinePlanarHomography; 959 } 960 961 /** 962 * Specifies whether planar homography is refined using all found inliers or 963 * not. 964 * This is only used when planar scenes are allowed. 965 * 966 * @param refinePlanarHomography true if planar homography must be refined, 967 * false otherwise. 968 * @return this instance so that method can be easily chained. 969 */ 970 public T setPlanarHomographyRefined(final boolean refinePlanarHomography) { 971 this.refinePlanarHomography = refinePlanarHomography; 972 //noinspection unchecked 973 return (T) this; 974 } 975 976 /** 977 * Indicates whether planar homography covariance is kept after estimation. 978 * This is only used when planar scenes are allowed. 979 * 980 * @return true if planar homography covariance is kept, false otherwise. 981 */ 982 public boolean isPlanarHomographyCovarianceKept() { 983 return keepPlanarHomographyCovariance; 984 } 985 986 /** 987 * Specifies whether planar homography covariance is kept after estimation. 988 * This is only used when planar scenes are allowed. 989 * 990 * @param keepPlanarHomographyCovariance true if planar homography 991 * covariance is kept, false otherwise. 992 * @return this instance so that method can be easily chained. 993 */ 994 public T setPlanarHomographyCovarianceKept(final boolean keepPlanarHomographyCovariance) { 995 this.keepPlanarHomographyCovariance = keepPlanarHomographyCovariance; 996 //noinspection unchecked 997 return (T) this; 998 } 999 1000 /** 1001 * Gets confidence of robustly estimated planar homography. By default, this 1002 * is 99%. 1003 * This is only used when planar scenes are allowed. 1004 * 1005 * @return confidence of robustly estimated planar homography. 1006 */ 1007 public double getPlanarHomographyConfidence() { 1008 return planarHomographyConfidence; 1009 } 1010 1011 /** 1012 * Sets confidence of robustly estimated planar homography. By default, this 1013 * is 99%. 1014 * This is only used when planar scenes are allowed. 1015 * 1016 * @param planarHomographyConfidence confidence of robustly estimated planar 1017 * homography. 1018 * @return this instance so that method can be easily chained. 1019 */ 1020 public T setPlanarHomographyConfidence(final double planarHomographyConfidence) { 1021 this.planarHomographyConfidence = planarHomographyConfidence; 1022 //noinspection unchecked 1023 return (T) this; 1024 } 1025 1026 /** 1027 * Gets maximum number of iterations to make while robustly estimating 1028 * planar homography. By default, this is 5000. 1029 * This is only used when planar scenes are allowed. 1030 * 1031 * @return maximum number of iterations to make while robustly estimating 1032 * planar homography. 1033 */ 1034 public int getPlanarHomographyMaxIterations() { 1035 return planarHomographyMaxIterations; 1036 } 1037 1038 /** 1039 * Sets maximum number of iterations to make while robustly estimating 1040 * planar homography. By default, this is 5000. 1041 * This is only used when planar scenes are allowed. 1042 * 1043 * @param planarHomographyMaxIterations maximum number of iterations to make 1044 * while robustly estimating planar homography. 1045 * @return this instance so that method can be easily chained. 1046 */ 1047 public T setPlanarHomographyMaxIterations(final int planarHomographyMaxIterations) { 1048 this.planarHomographyMaxIterations = planarHomographyMaxIterations; 1049 //noinspection unchecked 1050 return (T) this; 1051 } 1052 1053 /** 1054 * Gets threshold to determine whether samples for robust projective 2D 1055 * transformation estimation are inliers or not. 1056 * This is only used when planar scenes are allowed. 1057 * 1058 * @return threshold to robustly estimate projective 2D transformation. 1059 */ 1060 public double getPlanarHomographyThreshold() { 1061 return planarHomographyThreshold; 1062 } 1063 1064 /** 1065 * Sets threshold to determine whether samples for robust projective 2D 1066 * transformation estimation are inliers or not. 1067 * This is only used when planar scenes are allowed. 1068 * 1069 * @param planarHomographyThreshold threshold to robustly estimate 1070 * projective 2D transformation. 1071 * @return this instance so that method can be easily chained. 1072 */ 1073 public T setPlanarHomographyThreshold(final double planarHomographyThreshold) { 1074 this.planarHomographyThreshold = planarHomographyThreshold; 1075 //noinspection unchecked 1076 return (T) this; 1077 } 1078 1079 /** 1080 * Gets value indicating that inlier data is kept after robust planar 1081 * homography estimation. 1082 * This is only used when planar scenes are allowed. 1083 * 1084 * @return true if inlier data is kept, false otherwise. 1085 */ 1086 public boolean getPlanarHomographyComputeAndKeepInliers() { 1087 return planarHomographyComputeAndKeepInliers; 1088 } 1089 1090 /** 1091 * Specifies whether inlier data is kept after robust planar homography 1092 * estimation. 1093 * This is only used when planar scenes are allowed. 1094 * 1095 * @param planarHomographyComputeAndKeepInliers true if inlier data is kept, 1096 * false otherwise. 1097 * @return this instance so that method can be easily chained. 1098 */ 1099 public T setPlanarHomographyComputeAndKeepInliers(final boolean planarHomographyComputeAndKeepInliers) { 1100 this.planarHomographyComputeAndKeepInliers = planarHomographyComputeAndKeepInliers; 1101 //noinspection unchecked 1102 return (T) this; 1103 } 1104 1105 /** 1106 * Gets value indicating that residual data is kept after robust planar 1107 * homography estimation. 1108 * This is only used when planar scenes are allowed. 1109 * 1110 * @return true if residual data is kept, false otherwise. 1111 */ 1112 public boolean getPlanarHomographyComputeAndKeepResiduals() { 1113 return planarHomographyComputeAndKeepResiduals; 1114 } 1115 1116 /** 1117 * Sets value indicating that residual data is kept after robust planar 1118 * homography estimation. 1119 * This is only used when planar scenes are allowed. 1120 * 1121 * @param planarHomographyComputeAndKeepResiduals true if residual data is 1122 * kept, false otherwise. 1123 * @return this instance so that method can be easily chained. 1124 */ 1125 public T setPlanarHomographyComputeAndKeepResiduals(final boolean planarHomographyComputeAndKeepResiduals) { 1126 this.planarHomographyComputeAndKeepResiduals = planarHomographyComputeAndKeepResiduals; 1127 //noinspection unchecked 1128 return (T) this; 1129 } 1130 }