Search in sources :

Example 51 with CameraPinholeBrown

use of boofcv.struct.calib.CameraPinholeBrown in project BoofCV by lessthanoptimal.

the class ExampleFiducialBinary method main.

public static void main(String[] args) {
    String directory = UtilIO.pathExample("fiducial/binary");
    // load the lens distortion parameters and the input image
    CameraPinholeBrown param = CalibrationIO.load(new File(directory, "intrinsic.yaml"));
    var lensDistortion = new LensDistortionBrown(param);
    BufferedImage input = UtilImageIO.loadImageNotNull(directory, "image0000.jpg");
    // BufferedImage input = UtilImageIO.loadImageNotNull(directory, "image0001.jpg");
    // BufferedImage input = UtilImageIO.loadImageNotNull(directory, "image0002.jpg");
    GrayF32 original = ConvertBufferedImage.convertFrom(input, true, ImageType.single(GrayF32.class));
    // Detect the fiducial
    FiducialDetector<GrayF32> detector = FactoryFiducial.squareBinary(new ConfigFiducialBinary(0.1), ConfigThreshold.local(ThresholdType.LOCAL_MEAN, 21), GrayF32.class);
    // new ConfigFiducialBinary(0.1), ConfigThreshold.fixed(100),GrayF32.class);
    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 : ConfigFiducialBinary(boofcv.factory.fiducial.ConfigFiducialBinary) CameraPinholeBrown(boofcv.struct.calib.CameraPinholeBrown) LensDistortionBrown(boofcv.alg.distort.brown.LensDistortionBrown) 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 52 with CameraPinholeBrown

use of boofcv.struct.calib.CameraPinholeBrown in project BoofCV by lessthanoptimal.

the class ExampleRemoveLensDistortion method main.

public static void main(String[] args) {
    String calibDir = UtilIO.pathExample("calibration/mono/Sony_DSC-HX5V_Chess/");
    String imageDir = UtilIO.pathExample("structure/");
    // load calibration parameters from the previously calibrated camera
    CameraPinholeBrown param = CalibrationIO.load(new File(calibDir, "intrinsic.yaml"));
    // Specify a transform that has no lens distortion that you wish to re-render the image as having
    CameraPinhole desired = new CameraPinhole(param);
    // load images and convert the image into a color BoofCV format
    BufferedImage orig = UtilImageIO.loadImage(imageDir, "dist_cyto_01.jpg");
    Planar<GrayF32> distortedImg = ConvertBufferedImage.convertFromPlanar(orig, null, true, GrayF32.class);
    int numBands = distortedImg.getNumBands();
    // create new transforms which optimize view area in different ways.
    // EXPAND makes sure there are no black outside of image pixels inside the image
    // FULL_VIEW will include the entire original image
    // The border is VALUE, which defaults to black, just so you can see it
    ImageDistort allInside = LensDistortionOps.changeCameraModel(AdjustmentType.EXPAND, BorderType.ZERO, param, desired, null, ImageType.pl(numBands, GrayF32.class));
    ImageDistort fullView = LensDistortionOps.changeCameraModel(AdjustmentType.FULL_VIEW, BorderType.ZERO, param, desired, null, ImageType.pl(numBands, GrayF32.class));
    // NOTE: After lens distortion has been removed the intrinsic parameters is changed. If you pass
    // in  a set of IntrinsicParameters to the 4th variable it will save it there.
    // NOTE: Type information was stripped from ImageDistort simply because it becomes too verbose with it here.
    // Would be nice if this verbosity issue was addressed by the Java language.
    // render and display the different types of views in a window
    displayResults(orig, distortedImg, allInside, fullView);
}
Also used : GrayF32(boofcv.struct.image.GrayF32) CameraPinholeBrown(boofcv.struct.calib.CameraPinholeBrown) ImageDistort(boofcv.alg.distort.ImageDistort) File(java.io.File) CameraPinhole(boofcv.struct.calib.CameraPinhole) BufferedImage(java.awt.image.BufferedImage) ConvertBufferedImage(boofcv.io.image.ConvertBufferedImage)

Example 53 with CameraPinholeBrown

use of boofcv.struct.calib.CameraPinholeBrown in project BoofCV by lessthanoptimal.

the class ExampleFiducialHamming method main.

public static void main(String[] args) {
    String directory = UtilIO.pathExample("fiducial/square_hamming/aruco_25h7");
    // load the lens distortion parameters and the input image
    CameraPinholeBrown param = CalibrationIO.load(new File(directory, "intrinsic.yaml"));
    LensDistortionNarrowFOV lensDistortion = new LensDistortionBrown(param);
    // You need to create a different configuration for each dictionary type
    ConfigHammingMarker configMarker = ConfigHammingMarker.loadDictionary(HammingDictionary.ARUCO_MIP_25h7);
    FiducialDetector<GrayF32> detector = FactoryFiducial.squareHamming(configMarker, /*detector*/
    null, GrayF32.class);
    // Provide it lens parameters so that a 3D pose estimate is possible
    detector.setLensDistortion(lensDistortion, param.width, param.height);
    // Load and process all example images
    ListDisplayPanel gui = new ListDisplayPanel();
    for (int imageID = 1; imageID <= 3; imageID++) {
        String name = String.format("image%02d.jpg", imageID);
        System.out.println("processing: " + name);
        // Load the image
        BufferedImage buffered = UtilImageIO.loadImageNotNull(new File(directory, name).getPath());
        // Convert to a BoofCV format
        GrayF32 input = ConvertBufferedImage.convertFrom(buffered, (GrayF32) null);
        // Run the detector
        detector.detect(input);
        // Render a 3D compute on top of all detections
        Graphics2D g2 = buffered.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);
            }
        }
        gui.addImage(buffered, name, ScaleOptions.ALL);
    }
    ShowImages.showWindow(gui, "Example Fiducial Hamming", true);
}
Also used : ListDisplayPanel(boofcv.gui.ListDisplayPanel) CameraPinholeBrown(boofcv.struct.calib.CameraPinholeBrown) ConfigHammingMarker(boofcv.factory.fiducial.ConfigHammingMarker) LensDistortionBrown(boofcv.alg.distort.brown.LensDistortionBrown) LensDistortionNarrowFOV(boofcv.alg.distort.LensDistortionNarrowFOV) 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 54 with CameraPinholeBrown

use of boofcv.struct.calib.CameraPinholeBrown 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 55 with CameraPinholeBrown

use of boofcv.struct.calib.CameraPinholeBrown 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)

Aggregations

CameraPinholeBrown (boofcv.struct.calib.CameraPinholeBrown)99 Test (org.junit.jupiter.api.Test)62 Se3_F64 (georegression.struct.se.Se3_F64)39 GrayF32 (boofcv.struct.image.GrayF32)29 Point2D_F64 (georegression.struct.point.Point2D_F64)19 SimulatePlanarWorld (boofcv.simulation.SimulatePlanarWorld)16 LensDistortionBrown (boofcv.alg.distort.brown.LensDistortionBrown)14 ConvertBufferedImage (boofcv.io.image.ConvertBufferedImage)14 BufferedImage (java.awt.image.BufferedImage)14 ArrayList (java.util.ArrayList)12 CameraPinhole (boofcv.struct.calib.CameraPinhole)11 Point2Transform2_F64 (boofcv.struct.distort.Point2Transform2_F64)10 DMatrixRMaj (org.ejml.data.DMatrixRMaj)10 File (java.io.File)9 StereoParameters (boofcv.struct.calib.StereoParameters)6 GrayU8 (boofcv.struct.image.GrayU8)6 Point3D_F64 (georegression.struct.point.Point3D_F64)6 ImageBase (boofcv.struct.image.ImageBase)5 ImageType (boofcv.struct.image.ImageType)5 DogArray (org.ddogleg.struct.DogArray)5