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