use of boofcv.abst.geo.bundle.SceneStructureCommon.Point in project BoofCV by lessthanoptimal.
the class TestSceneStructureCommon method Point_removeView.
@Test
void Point_removeView() {
Point p = new Point(3);
p.views.add(1);
p.views.add(6);
p.views.add(3);
p.views.add(9);
p.views.add(4);
p.removeView(9);
assertEquals(4, p.views.size);
assertEquals(1, p.views.get(0));
assertEquals(6, p.views.get(1));
assertEquals(3, p.views.get(2));
assertEquals(4, p.views.get(3));
}
use of boofcv.abst.geo.bundle.SceneStructureCommon.Point in project BoofCV by lessthanoptimal.
the class TestSceneStructureCommon method removePoints.
@Test
void removePoints() {
MockSceneStructureCommon structure = new MockSceneStructureCommon(false);
structure.homogenous = false;
structure.pointSize = 3;
List<Point> original = new ArrayList<>();
for (int i = 0; i < 20; i++) {
original.add(structure.points.grow());
}
DogArray_I32 which = new DogArray_I32();
which.add(2);
which.add(5);
structure.removePoints(which);
assertEquals(18, structure.points.size);
assertSame(original.get(0), structure.points.data[0]);
assertSame(original.get(3), structure.points.data[2]);
assertSame(original.get(4), structure.points.data[3]);
assertSame(original.get(7), structure.points.data[5]);
assertSame(original.get(19), structure.points.data[17]);
}
use of boofcv.abst.geo.bundle.SceneStructureCommon.Point in project BoofCV by lessthanoptimal.
the class TestPruneStructureFromSceneMetric method createRestOfTheScene.
private void createRestOfTheScene(List<Point3D_F64> points, boolean sanityCheck) {
for (int i = 0; i < structure.views.size; i++) {
double x = -1.5 + (int) (3 * i / Math.max(1, (structure.views.size - 1)));
structure.setView(i, i % 2, false, eulerXyz(x, 0, 0, 0, 0, 0, null));
}
observations = new SceneObservations();
observations.initialize(structure.views.size);
Se3_F64 world_to_view = new Se3_F64();
Se3_F64 tmp = new Se3_F64();
// 3D point in camera coordinate system
Point3D_F64 cameraX = new Point3D_F64();
// observed pixel coordinate of 3D point
Point2D_F64 pixel = new Point2D_F64();
for (int viewIdx = 0; viewIdx < structure.views.size; viewIdx++) {
SceneStructureMetric.View v = structure.views.data[viewIdx];
BundleAdjustmentCamera camera = structure.cameras.get(v.camera).model;
structure.getWorldToView(v, world_to_view, tmp);
for (int pointIdx = 0; pointIdx < structure.points.size; pointIdx++) {
Point3D_F64 p = points.get(pointIdx);
world_to_view.transform(p, cameraX);
if (cameraX.z <= 0)
continue;
camera.project(cameraX.x, cameraX.y, cameraX.z, pixel);
if (!intrinsic.isInside(pixel.x, pixel.y))
continue;
observations.views.data[viewIdx].add(pointIdx, (float) pixel.x, (float) pixel.y);
structure.connectPointToView(pointIdx, viewIdx);
}
}
if (!sanityCheck)
return;
// sanity checks
for (int pointIdx = 0; pointIdx < structure.points.size; pointIdx++) {
if (structure.points.data[pointIdx].views.size == 0) {
Point3D_F64 p = new Point3D_F64();
structure.points.data[pointIdx].get(p);
throw new RuntimeException("Point with no views. " + p);
}
}
for (int viewIdx = 0; viewIdx < observations.views.size; viewIdx++) {
if (observations.views.data[viewIdx].size() == 0)
throw new RuntimeException("View with no observations");
}
checkObservationAndStructureSync();
}
use of boofcv.abst.geo.bundle.SceneStructureCommon.Point in project BoofCV by lessthanoptimal.
the class TestPruneStructureFromSceneMetric method prunePoints_count.
@Test
void prunePoints_count() {
createPerfectScene();
int countPoints = structure.points.size;
int countObservations = observations.getObservationCount();
PruneStructureFromSceneMetric alg = new PruneStructureFromSceneMetric(structure, observations);
// no change expected
alg.prunePoints(1);
assertEquals(countPoints, structure.points.size);
assertEquals(countObservations, observations.getObservationCount());
// this should prune a bunch
int threshold = structure.views.size - 2;
alg.prunePoints(threshold);
assertTrue(countPoints > structure.points.size);
assertTrue(countObservations > observations.getObservationCount());
for (int pointIdx = 0; pointIdx < structure.points.size; pointIdx++) {
if (structure.points.data[pointIdx].views.size < threshold)
fail("point with not enough views");
}
checkAllObservationsArePerfect();
}
use of boofcv.abst.geo.bundle.SceneStructureCommon.Point in project BoofCV by lessthanoptimal.
the class TestPruneStructureFromSceneMetric method checkAllObservationsArePerfect.
/**
* See if all the observations are perfect. This acts as a sanity check on the scenes structure after modification
*/
private void checkAllObservationsArePerfect() {
Se3_F64 world_to_view = new Se3_F64();
Se3_F64 tmp = new Se3_F64();
Point3D_F64 worldX = new Point3D_F64();
// 3D point in camera coordinate system
Point3D_F64 cameraX = new Point3D_F64();
// observed pixel coordinate of 3D point
Point2D_F64 predicted = new Point2D_F64();
Point2D_F64 found = new Point2D_F64();
for (int viewIdx = 0; viewIdx < structure.views.size; viewIdx++) {
SceneStructureMetric.View v = structure.views.data[viewIdx];
BundleAdjustmentCamera camera = structure.cameras.get(v.camera).model;
structure.getWorldToView(v, world_to_view, tmp);
for (int obsIdx = 0; obsIdx < observations.views.data[viewIdx].size(); obsIdx++) {
Point f = structure.points.data[observations.views.data[viewIdx].point.get(obsIdx)];
f.get(worldX);
world_to_view.transform(worldX, cameraX);
assertTrue(cameraX.z > 0);
camera.project(cameraX.x, cameraX.y, cameraX.z, predicted);
observations.views.data[viewIdx].getPixel(obsIdx, found);
assertTrue(predicted.distance(found) < 1e-4);
}
}
}
Aggregations