1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package com.irurueta.ar.sfm;
18
19 import com.irurueta.algebra.AlgebraException;
20 import com.irurueta.geometry.MetricTransformation3D;
21 import com.irurueta.geometry.Point3D;
22
23 import java.util.ArrayList;
24
25
26
27
28
29 public class PairedViewsSparseReconstructor extends BasePairedViewsSparseReconstructor<
30 PairedViewsSparseReconstructorConfiguration, PairedViewsSparseReconstructor,
31 PairedViewsSparseReconstructorListener> {
32
33
34
35
36
37
38
39
40 public PairedViewsSparseReconstructor(
41 final PairedViewsSparseReconstructorConfiguration configuration,
42 final PairedViewsSparseReconstructorListener listener) {
43 super(configuration, listener);
44 }
45
46
47
48
49
50
51
52 public PairedViewsSparseReconstructor(final PairedViewsSparseReconstructorListener listener) {
53 this(new PairedViewsSparseReconstructorConfiguration(), listener);
54 }
55
56
57
58
59
60
61
62 @Override
63 protected boolean hasAbsoluteOrientation() {
64 return false;
65 }
66
67
68
69
70
71
72
73
74
75 @SuppressWarnings("DuplicatedCode")
76 @Override
77 protected boolean transformPairOfCamerasAndPoints(
78 final boolean isInitialPairOfViews, final boolean hasAbsoluteOrientation) {
79 final var previousMetricCamera = previousMetricEstimatedCamera.getCamera();
80 final var currentMetricCamera = currentMetricEstimatedCamera.getCamera();
81 if (previousMetricCamera == null || currentMetricCamera == null) {
82 return false;
83 }
84
85 currentScale = listener.onBaselineRequested(this, previousViewId, currentViewId,
86 previousMetricEstimatedCamera, currentMetricEstimatedCamera);
87 final var sqrScale = currentScale * currentScale;
88
89 final var scaleTransformation = new MetricTransformation3D(currentScale);
90
91 if (isInitialPairOfViews) {
92
93 referenceEuclideanTransformation = scaleTransformation;
94 } else {
95
96 final var invRot = lastEuclideanCameraRotation.inverseRotationAndReturnNew();
97 final var translation = new double[Point3D.POINT3D_INHOMOGENEOUS_COORDINATES_LENGTH];
98 translation[0] = lastEuclideanCameraCenter.getInhomX();
99 translation[1] = lastEuclideanCameraCenter.getInhomY();
100 translation[2] = lastEuclideanCameraCenter.getInhomZ();
101 referenceEuclideanTransformation = scaleTransformation.combineAndReturnNew(
102 new MetricTransformation3D(invRot, translation, 1.0));
103 referenceEuclideanTransformation.setRotation(invRot);
104 referenceEuclideanTransformation.setTranslation(lastEuclideanCameraCenter);
105 }
106
107 try {
108
109 final var previousEuclideanCamera = referenceEuclideanTransformation.transformAndReturnNew(
110 previousMetricCamera);
111 final var currentEuclideanCamera = referenceEuclideanTransformation.transformAndReturnNew(
112 currentMetricCamera);
113
114 previousEuclideanEstimatedCamera = new EstimatedCamera();
115 previousEuclideanEstimatedCamera.setCamera(previousEuclideanCamera);
116 previousEuclideanEstimatedCamera.setViewId(previousMetricEstimatedCamera.getViewId());
117 previousEuclideanEstimatedCamera.setQualityScore(previousMetricEstimatedCamera.getQualityScore());
118 if (previousMetricEstimatedCamera.getCovariance() != null) {
119 previousEuclideanEstimatedCamera.setCovariance(
120 previousMetricEstimatedCamera.getCovariance().multiplyByScalarAndReturnNew(sqrScale));
121 }
122
123 currentEuclideanEstimatedCamera = new EstimatedCamera();
124 currentEuclideanEstimatedCamera.setCamera(currentEuclideanCamera);
125 currentEuclideanEstimatedCamera.setViewId(currentMetricEstimatedCamera.getViewId());
126 currentEuclideanEstimatedCamera.setQualityScore(currentMetricEstimatedCamera.getQualityScore());
127 if (currentMetricEstimatedCamera.getCovariance() != null) {
128 currentEuclideanEstimatedCamera.setCovariance(
129 currentMetricEstimatedCamera.getCovariance().multiplyByScalarAndReturnNew(sqrScale));
130 }
131
132
133 euclideanReconstructedPoints = new ArrayList<>();
134 for (final var metricReconstructedPoint : metricReconstructedPoints) {
135 final var metricPoint = metricReconstructedPoint.getPoint();
136 final var euclideanPoint = referenceEuclideanTransformation.transformAndReturnNew(metricPoint);
137 final var euclideanReconstructedPoint = new ReconstructedPoint3D();
138 euclideanReconstructedPoint.setPoint(euclideanPoint);
139 euclideanReconstructedPoint.setInlier(metricReconstructedPoint.isInlier());
140 euclideanReconstructedPoint.setId(metricReconstructedPoint.getId());
141 euclideanReconstructedPoint.setColorData(metricReconstructedPoint.getColorData());
142 if (metricReconstructedPoint.getCovariance() != null) {
143 euclideanReconstructedPoint.setCovariance(
144 metricReconstructedPoint.getCovariance().multiplyByScalarAndReturnNew(sqrScale));
145 }
146 euclideanReconstructedPoint.setQualityScore(metricReconstructedPoint.getQualityScore());
147 euclideanReconstructedPoints.add(euclideanReconstructedPoint);
148 }
149
150 } catch (final AlgebraException e) {
151 return false;
152 }
153
154 return super.transformPairOfCamerasAndPoints(isInitialPairOfViews, hasAbsoluteOrientation);
155 }
156 }