Search in sources :

Example 21 with LensDistortionBrown

use of boofcv.alg.distort.brown.LensDistortionBrown in project BoofCV by lessthanoptimal.

the class ExampleFiducialImage method main.

public static void main(String[] args) {
    String imagePath = UtilIO.pathExample("fiducial/image/examples/");
    String patternPath = UtilIO.pathExample("fiducial/image/patterns/");
    // String imageName = "image00.jpg";
    String imageName = "image01.jpg";
    // String imageName = "image02.jpg";
    // load the lens distortion parameters and the input image
    CameraPinholeBrown param = CalibrationIO.load(new File(imagePath, "intrinsic.yaml"));
    LensDistortionNarrowFOV lensDistortion = new LensDistortionBrown(param);
    BufferedImage input = UtilImageIO.loadImage(imagePath, imageName);
    GrayF32 original = ConvertBufferedImage.convertFrom(input, true, ImageType.single(GrayF32.class));
    // Detect the fiducial
    SquareImage_to_FiducialDetector<GrayF32> detector = FactoryFiducial.squareImage(new ConfigFiducialImage(), ConfigThreshold.local(ThresholdType.LOCAL_MEAN, 21), GrayF32.class);
    // new ConfigFiducialImage(), ConfigThreshold.fixed(100), GrayF32.class);
    // give it a description of all the targets
    // 4 cm
    double width = 4;
    detector.addPatternImage(loadImage(patternPath, "ke.png", GrayF32.class), 100, width);
    detector.addPatternImage(loadImage(patternPath, "dog.png", GrayF32.class), 100, width);
    detector.addPatternImage(loadImage(patternPath, "yu.png", GrayF32.class), 100, width);
    detector.addPatternImage(loadImage(patternPath, "yu_inverted.png", GrayF32.class), 100, width);
    detector.addPatternImage(loadImage(patternPath, "pentarose.png", GrayF32.class), 100, width);
    detector.addPatternImage(loadImage(patternPath, "text_boofcv.png", GrayF32.class), 100, width);
    detector.addPatternImage(loadImage(patternPath, "leaf01.png", GrayF32.class), 100, width);
    detector.addPatternImage(loadImage(patternPath, "leaf02.png", GrayF32.class), 100, width);
    detector.addPatternImage(loadImage(patternPath, "hand01.png", GrayF32.class), 100, width);
    detector.addPatternImage(loadImage(patternPath, "chicken.png", GrayF32.class), 100, width);
    detector.addPatternImage(loadImage(patternPath, "h2o.png", GrayF32.class), 100, width);
    detector.addPatternImage(loadImage(patternPath, "yinyang.png", GrayF32.class), 100, width);
    detector.setLensDistortion(lensDistortion, param.width, param.height);
    detector.detect(original);
    // print the results
    Graphics2D g2 = input.createGraphics();
    var targetToSensor = new Se3_F64();
    var locationPixel = new Point2D_F64();
    var bounds = new Polygon2D_F64();
    for (int i = 0; i < detector.totalFound(); i++) {
        detector.getCenter(i, locationPixel);
        detector.getBounds(i, bounds);
        g2.setColor(new Color(50, 50, 255));
        g2.setStroke(new BasicStroke(10));
        VisualizeShapes.drawPolygon(bounds, true, 1.0, g2);
        if (detector.hasID())
            System.out.println("Target ID = " + detector.getId(i));
        if (detector.hasMessage())
            System.out.println("Message   = " + detector.getMessage(i));
        System.out.println("2D Image Location = " + locationPixel);
        if (detector.is3D()) {
            detector.getFiducialToCamera(i, targetToSensor);
            System.out.println("3D Location:");
            System.out.println(targetToSensor);
            VisualizeFiducial.drawCube(targetToSensor, param, detector.getWidth(i), 3, g2);
            VisualizeFiducial.drawLabelCenter(targetToSensor, param, "" + detector.getId(i), g2);
        } else {
            VisualizeFiducial.drawLabel(locationPixel, "" + detector.getId(i), g2);
        }
    }
    ShowImages.showWindow(input, "Fiducials", true);
}
Also used : CameraPinholeBrown(boofcv.struct.calib.CameraPinholeBrown) LensDistortionBrown(boofcv.alg.distort.brown.LensDistortionBrown) LensDistortionNarrowFOV(boofcv.alg.distort.LensDistortionNarrowFOV) ConfigFiducialImage(boofcv.factory.fiducial.ConfigFiducialImage) BufferedImage(java.awt.image.BufferedImage) ConvertBufferedImage(boofcv.io.image.ConvertBufferedImage) Polygon2D_F64(georegression.struct.shapes.Polygon2D_F64) GrayF32(boofcv.struct.image.GrayF32) Point2D_F64(georegression.struct.point.Point2D_F64) File(java.io.File) Se3_F64(georegression.struct.se.Se3_F64)

Example 22 with LensDistortionBrown

use of boofcv.alg.distort.brown.LensDistortionBrown in project BoofCV by lessthanoptimal.

the class ExamplePoseOfCalibrationTarget method main.

public static void main(String[] args) {
    // Load camera calibration
    CameraPinholeBrown intrinsic = CalibrationIO.load(UtilIO.pathExample("calibration/mono/Sony_DSC-HX5V_Chess/intrinsic.yaml"));
    LensDistortionNarrowFOV lensDistortion = new LensDistortionBrown(intrinsic);
    // load the video file
    String fileName = UtilIO.pathExample("tracking/chessboard_SonyDSC_01.mjpeg");
    SimpleImageSequence<GrayF32> video = DefaultMediaManager.INSTANCE.openVideo(fileName, ImageType.single(GrayF32.class));
    // DefaultMediaManager.INSTANCE.openCamera(null, 640, 480, ImageType.single(GrayF32.class));
    // Let's use the FiducialDetector interface since it is much easier than coding up
    // the entire thing ourselves. Look at FiducialDetector's code if you want to understand how it works.
    CalibrationFiducialDetector<GrayF32> detector = FactoryFiducial.calibChessboardX(null, new ConfigGridDimen(4, 5, 0.03), GrayF32.class);
    detector.setLensDistortion(lensDistortion, intrinsic.width, intrinsic.height);
    // Get the 2D coordinate of calibration points for visualization purposes
    List<Point2D_F64> calibPts = detector.getCalibrationPoints();
    // Set up visualization
    PointCloudViewer viewer = VisualizeData.createPointCloudViewer();
    viewer.setCameraHFov(PerspectiveOps.computeHFov(intrinsic));
    viewer.setTranslationStep(0.01);
    // white background
    viewer.setBackgroundColor(0xFFFFFF);
    // make the view more interest. From the side.
    DMatrixRMaj rotY = ConvertRotation3D_F64.rotY(-Math.PI / 2.0, null);
    viewer.setCameraToWorld(new Se3_F64(rotY, new Vector3D_F64(0.75, 0, 1.25)).invert(null));
    var imagePanel = new ImagePanel(intrinsic.width, intrinsic.height);
    var viewerComponent = viewer.getComponent();
    viewerComponent.setPreferredSize(new Dimension(intrinsic.width, intrinsic.height));
    var gui = new PanelGridPanel(1, imagePanel, viewerComponent);
    gui.setMaximumSize(gui.getPreferredSize());
    ShowImages.showWindow(gui, "Calibration Target Pose", true);
    // Allows the user to click on the image and pause
    var pauseHelper = new MousePauseHelper(gui);
    // saves the target's center location
    var path = new ArrayList<Point3D_F64>();
    // Process each frame in the video sequence
    var targetToCamera = new Se3_F64();
    while (video.hasNext()) {
        // detect calibration points
        detector.detect(video.next());
        if (detector.totalFound() == 1) {
            detector.getFiducialToCamera(0, targetToCamera);
            // Visualization. Show a path with green points and the calibration points in black
            viewer.clearPoints();
            Point3D_F64 center = new Point3D_F64();
            SePointOps_F64.transform(targetToCamera, center, center);
            path.add(center);
            for (Point3D_F64 p : path) {
                viewer.addPoint(p.x, p.y, p.z, 0x00FF00);
            }
            for (int j = 0; j < calibPts.size(); j++) {
                Point2D_F64 p = calibPts.get(j);
                Point3D_F64 p3 = new Point3D_F64(p.x, p.y, 0);
                SePointOps_F64.transform(targetToCamera, p3, p3);
                viewer.addPoint(p3.x, p3.y, p3.z, 0);
            }
        }
        imagePanel.setImage((BufferedImage) video.getGuiImage());
        viewerComponent.repaint();
        imagePanel.repaint();
        BoofMiscOps.pause(30);
        while (pauseHelper.isPaused()) {
            BoofMiscOps.pause(30);
        }
    }
}
Also used : ConfigGridDimen(boofcv.abst.fiducial.calib.ConfigGridDimen) Point3D_F64(georegression.struct.point.Point3D_F64) CameraPinholeBrown(boofcv.struct.calib.CameraPinholeBrown) LensDistortionBrown(boofcv.alg.distort.brown.LensDistortionBrown) LensDistortionNarrowFOV(boofcv.alg.distort.LensDistortionNarrowFOV) DMatrixRMaj(org.ejml.data.DMatrixRMaj) ArrayList(java.util.ArrayList) Vector3D_F64(georegression.struct.point.Vector3D_F64) PanelGridPanel(boofcv.gui.PanelGridPanel) GrayF32(boofcv.struct.image.GrayF32) Point2D_F64(georegression.struct.point.Point2D_F64) PointCloudViewer(boofcv.visualize.PointCloudViewer) Se3_F64(georegression.struct.se.Se3_F64) ImagePanel(boofcv.gui.image.ImagePanel) MousePauseHelper(boofcv.gui.MousePauseHelper)

Example 23 with LensDistortionBrown

use of boofcv.alg.distort.brown.LensDistortionBrown in project BoofCV by lessthanoptimal.

the class GenericFiducialDetectorChecks method checkPoseAccuracy.

@Test
void checkPoseAccuracy() {
    // this has to do with the marker coordinate system to image coordinate system
    // marker is +y up   +x right +z up
    // image is  +y down +x right +z out
    Se3_F64 adjustment = SpecialEuclideanOps_F64.eulerXyz(0, 0, 0, 0, 0, Math.PI, null);
    for (boolean distorted : new boolean[] { false, true }) {
        // System.out.println("distorted = "+distorted);
        LensDistortionBrown lensDistorted = new LensDistortionBrown(loadDistortion(distorted));
        for (ImageType type : types) {
            FiducialDetector detector = createDetector(type);
            ImageBase imageD = renderImage(loadDistortion(distorted), type);
            detector.setLensDistortion(lensDistorted, imageD.width, imageD.height);
            detect(detector, imageD);
            // ShowImages.showBlocking(imageD,"Distorted", 2_000);
            assertEquals(1, detector.totalFound());
            Se3_F64 pose = new Se3_F64();
            detector.getFiducialToCamera(0, pose);
            pose.T.scale(markerToWorld.T.norm() / pose.T.norm());
            Se3_F64 diff = adjustment.concat(markerToWorld.concat(pose.invert(null), null), null);
            double theta = ConvertRotation3D_F64.matrixToRodrigues(diff.R, null).theta;
            // System.out.println("norm = "+diff.T.norm()+"  theta = "+theta);
            // threshold selected through manual trial and error
            assertEquals(0, diff.T.norm(), tolAccuracyT);
            assertEquals(0, theta, tolAccuracyTheta);
        }
    }
}
Also used : LensDistortionBrown(boofcv.alg.distort.brown.LensDistortionBrown) ImageBase(boofcv.struct.image.ImageBase) Se3_F64(georegression.struct.se.Se3_F64) ImageType(boofcv.struct.image.ImageType) Test(org.junit.jupiter.api.Test)

Example 24 with LensDistortionBrown

use of boofcv.alg.distort.brown.LensDistortionBrown in project BoofCV by lessthanoptimal.

the class GenericFiducialDetectorChecks method modifyInput.

/**
 * Makes sure the input is not modified
 */
@Test
void modifyInput() {
    CameraPinholeBrown intrinsic = loadDistortion(true);
    LensDistortionBrown lensDistorted = new LensDistortionBrown(intrinsic);
    for (ImageType type : types) {
        ImageBase image = renderImage(intrinsic, type);
        ImageBase orig = image.clone();
        FiducialDetector detector = createDetector(type);
        detector.setLensDistortion(lensDistorted, image.width, image.height);
        detect(detector, image);
        BoofTesting.assertEquals(image, orig, 0);
    }
}
Also used : CameraPinholeBrown(boofcv.struct.calib.CameraPinholeBrown) LensDistortionBrown(boofcv.alg.distort.brown.LensDistortionBrown) ImageBase(boofcv.struct.image.ImageBase) ImageType(boofcv.struct.image.ImageType) Test(org.junit.jupiter.api.Test)

Example 25 with LensDistortionBrown

use of boofcv.alg.distort.brown.LensDistortionBrown in project BoofCV by lessthanoptimal.

the class TestFourPointSyntheticStability method basic.

/**
 * Try a few different known scenarios
 */
@Test
void basic() {
    Point2Transform2_F64 p2n = new LensDistortionBrown(intrinsic).undistort_F64(true, false);
    Point2Transform2_F64 n2p = new LensDistortionBrown(intrinsic).distort_F64(false, true);
    FourPointSyntheticStability alg = new FourPointSyntheticStability();
    alg.setShape(0.2, 0.2);
    alg.setTransforms(p2n, n2p);
    Se3_F64 f2c0 = SpecialEuclideanOps_F64.eulerXyz(0, 0, 1, 0, 0, 0, null);
    Se3_F64 f2c1 = SpecialEuclideanOps_F64.eulerXyz(0, 0, 3, 0, 0, 0, null);
    Se3_F64 f2c2 = SpecialEuclideanOps_F64.eulerXyz(0, 0, 1, 0, 0.5, 0, null);
    FiducialStability found0 = new FiducialStability();
    FiducialStability found1 = new FiducialStability();
    FiducialStability found2 = new FiducialStability();
    alg.computeStability(f2c0, 1, found0);
    alg.computeStability(f2c1, 1, found1);
    alg.computeStability(f2c2, 1, found2);
    // farther away, errors result in large pose errors
    assertTrue(found0.location * 1.1 < found1.location);
    assertTrue(found0.orientation * 1.1 < found1.orientation);
    // when viewed at an angle a small change results in a large change in pose, meaning its easier to estimate
    // when viewed head on a small change in pixel results in a similar pose making it insensitive to changes
    assertTrue(found0.location > 1.1 * found2.location);
    assertTrue(found0.orientation > 1.1 * found2.orientation);
    // larger disturbance larger error
    alg.computeStability(f2c0, 2, found1);
    assertTrue(found0.location * 1.1 < found1.location);
    assertTrue(found0.orientation * 1.1 < found1.orientation);
}
Also used : LensDistortionBrown(boofcv.alg.distort.brown.LensDistortionBrown) Point2Transform2_F64(boofcv.struct.distort.Point2Transform2_F64) Se3_F64(georegression.struct.se.Se3_F64) Test(org.junit.jupiter.api.Test)

Aggregations

LensDistortionBrown (boofcv.alg.distort.brown.LensDistortionBrown)25 CameraPinholeBrown (boofcv.struct.calib.CameraPinholeBrown)14 Se3_F64 (georegression.struct.se.Se3_F64)13 Test (org.junit.jupiter.api.Test)10 ImageBase (boofcv.struct.image.ImageBase)9 ImageType (boofcv.struct.image.ImageType)9 Point2Transform2_F64 (boofcv.struct.distort.Point2Transform2_F64)8 GrayF32 (boofcv.struct.image.GrayF32)8 ConvertBufferedImage (boofcv.io.image.ConvertBufferedImage)7 BufferedImage (java.awt.image.BufferedImage)7 Point2D_F64 (georegression.struct.point.Point2D_F64)6 LensDistortionNarrowFOV (boofcv.alg.distort.LensDistortionNarrowFOV)4 ListDisplayPanel (boofcv.gui.ListDisplayPanel)4 Point3D_F64 (georegression.struct.point.Point3D_F64)4 PointToPixelTransform_F64 (boofcv.struct.distort.PointToPixelTransform_F64)3 GrayU8 (boofcv.struct.image.GrayU8)3 Polygon2D_F64 (georegression.struct.shapes.Polygon2D_F64)3 File (java.io.File)3 FoundFiducial (boofcv.alg.fiducial.square.FoundFiducial)2 ConfigPolygonDetector (boofcv.factory.shape.ConfigPolygonDetector)2