Search in sources :

Example 1 with Point

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));
}
Also used : Point(boofcv.abst.geo.bundle.SceneStructureCommon.Point) Test(org.junit.jupiter.api.Test)

Example 2 with Point

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]);
}
Also used : ArrayList(java.util.ArrayList) Point(boofcv.abst.geo.bundle.SceneStructureCommon.Point) DogArray_I32(org.ddogleg.struct.DogArray_I32) Point(boofcv.abst.geo.bundle.SceneStructureCommon.Point) Test(org.junit.jupiter.api.Test)

Example 3 with Point

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();
}
Also used : Point3D_F64(georegression.struct.point.Point3D_F64) UtilPoint3D_F64(georegression.geometry.UtilPoint3D_F64) Point2D_F64(georegression.struct.point.Point2D_F64) Point(boofcv.abst.geo.bundle.SceneStructureCommon.Point) Se3_F64(georegression.struct.se.Se3_F64)

Example 4 with Point

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();
}
Also used : Point(boofcv.abst.geo.bundle.SceneStructureCommon.Point) Test(org.junit.jupiter.api.Test)

Example 5 with Point

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);
        }
    }
}
Also used : Point3D_F64(georegression.struct.point.Point3D_F64) UtilPoint3D_F64(georegression.geometry.UtilPoint3D_F64) Point2D_F64(georegression.struct.point.Point2D_F64) Point(boofcv.abst.geo.bundle.SceneStructureCommon.Point) Point(boofcv.abst.geo.bundle.SceneStructureCommon.Point) Se3_F64(georegression.struct.se.Se3_F64)

Aggregations

Point (boofcv.abst.geo.bundle.SceneStructureCommon.Point)7 Test (org.junit.jupiter.api.Test)4 UtilPoint3D_F64 (georegression.geometry.UtilPoint3D_F64)3 Point3D_F64 (georegression.struct.point.Point3D_F64)3 Point2D_F64 (georegression.struct.point.Point2D_F64)2 Se3_F64 (georegression.struct.se.Se3_F64)2 ArrayList (java.util.ArrayList)1 DogArray_I32 (org.ddogleg.struct.DogArray_I32)1