Search in sources :

Example 11 with ConfigGridDimen

use of boofcv.abst.fiducial.calib.ConfigGridDimen 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 12 with ConfigGridDimen

use of boofcv.abst.fiducial.calib.ConfigGridDimen in project BoofCV by lessthanoptimal.

the class UtilCalibrationGui method renderTargetBuffered.

public static BufferedImage renderTargetBuffered(CalibrationPatterns type, Object config, int squareWidth) {
    int circle = squareWidth / 2;
    if (type == CalibrationPatterns.ECOCHECK) {
        ConfigECoCheckMarkers c = (ConfigECoCheckMarkers) config;
        ECoCheckUtils utils = new ECoCheckUtils();
        utils.codec.setErrorCorrectionLevel(c.errorCorrectionLevel);
        utils.codec.setChecksumBitCount(c.checksumBits);
        c.convertToGridList(utils.markers);
        utils.fixate();
        ConfigECoCheckMarkers.MarkerShape shape = c.markerShapes.get(0);
        int markerWidth = squareWidth * (shape.numCols - 1);
        int markerHeight = squareWidth * (shape.numRows - 1);
        FiducialRenderEngineGraphics2D render = configureRenderGraphics2D(markerWidth, markerHeight, squareWidth / 2);
        ECoCheckGenerator generator = new ECoCheckGenerator(utils);
        generator.squareWidth = squareWidth;
        generator.setRender(render);
        generator.render(0);
        return render.getImage();
    } else if (type == CalibrationPatterns.HAMMING_CHESSBOARD) {
        ConfigHammingChessboard c = (ConfigHammingChessboard) config;
        int markerWidth = squareWidth * c.numCols;
        int markerHeight = squareWidth * c.numRows;
        FiducialRenderEngineGraphics2D render = configureRenderGraphics2D(markerWidth, markerHeight, squareWidth / 2);
        HammingChessboardGenerator generator = new HammingChessboardGenerator(c);
        generator.squareWidth = squareWidth;
        generator.setRender(render);
        generator.render();
        return render.getImage();
    } else if (type == CalibrationPatterns.HAMMING_GRID) {
        ConfigHammingGrid c = (ConfigHammingGrid) config;
        int markerWidth = (int) Math.round(squareWidth * c.getMarkerWidth() / c.squareSize);
        int markerHeight = (int) Math.round(squareWidth * c.getMarkerHeight() / c.squareSize);
        FiducialRenderEngineGraphics2D render = configureRenderGraphics2D(markerWidth, markerHeight, squareWidth / 2);
        var generator = new HammingGridGenerator(c);
        generator.squareWidth = squareWidth;
        generator.setRender(render);
        generator.render();
        return render.getImage();
    }
    final RenderCalibrationTargetsGraphics2D renderer = new RenderCalibrationTargetsGraphics2D(20, 1);
    if (type == CalibrationPatterns.CHESSBOARD) {
        ConfigGridDimen c = (ConfigGridDimen) config;
        renderer.chessboard(c.numRows, c.numCols, squareWidth);
    } else if (type == CalibrationPatterns.SQUARE_GRID) {
        ConfigGridDimen c = (ConfigGridDimen) config;
        double space = squareWidth * c.shapeDistance / c.shapeSize;
        renderer.squareGrid(c.numRows, c.numCols, squareWidth, space);
    } else if (type == CalibrationPatterns.CIRCLE_GRID) {
        ConfigGridDimen c = (ConfigGridDimen) config;
        double space = circle * c.shapeDistance / c.shapeSize;
        renderer.circleRegular(c.numRows, c.numCols, circle, space);
    } else if (type == CalibrationPatterns.CIRCLE_HEXAGONAL) {
        ConfigGridDimen c = (ConfigGridDimen) config;
        double space = circle * c.shapeDistance / c.shapeSize;
        renderer.circleHex(c.numRows, c.numCols, circle, space);
    }
    return renderer.getBuffered();
}
Also used : ConfigGridDimen(boofcv.abst.fiducial.calib.ConfigGridDimen) FiducialRenderEngineGraphics2D(boofcv.gui.FiducialRenderEngineGraphics2D) ECoCheckUtils(boofcv.alg.fiducial.calib.ecocheck.ECoCheckUtils) ConfigHammingGrid(boofcv.factory.fiducial.ConfigHammingGrid) ConfigHammingChessboard(boofcv.factory.fiducial.ConfigHammingChessboard) HammingChessboardGenerator(boofcv.alg.fiducial.calib.hammingchess.HammingChessboardGenerator) RenderCalibrationTargetsGraphics2D(boofcv.gui.RenderCalibrationTargetsGraphics2D) ConfigECoCheckMarkers(boofcv.abst.fiducial.calib.ConfigECoCheckMarkers) ECoCheckGenerator(boofcv.alg.fiducial.calib.ecocheck.ECoCheckGenerator) HammingGridGenerator(boofcv.alg.fiducial.calib.hamminggrids.HammingGridGenerator)

Aggregations

ConfigGridDimen (boofcv.abst.fiducial.calib.ConfigGridDimen)12 GrayF32 (boofcv.struct.image.GrayF32)8 ConvertBufferedImage (boofcv.io.image.ConvertBufferedImage)7 BufferedImage (java.awt.image.BufferedImage)7 DetectSingleFiducialCalibration (boofcv.abst.geo.calibration.DetectSingleFiducialCalibration)4 Test (org.junit.jupiter.api.Test)4 CalibrateMonoPlanar (boofcv.abst.geo.calibration.CalibrateMonoPlanar)2 CameraPinholeBrown (boofcv.struct.calib.CameraPinholeBrown)2 GrayU8 (boofcv.struct.image.GrayU8)2 CalibrationDetectorChessboardX (boofcv.abst.fiducial.calib.CalibrationDetectorChessboardX)1 CalibrationDetectorCircleHexagonalGrid (boofcv.abst.fiducial.calib.CalibrationDetectorCircleHexagonalGrid)1 CalibrationDetectorSquareGrid (boofcv.abst.fiducial.calib.CalibrationDetectorSquareGrid)1 ConfigECoCheckMarkers (boofcv.abst.fiducial.calib.ConfigECoCheckMarkers)1 LensDistortionNarrowFOV (boofcv.alg.distort.LensDistortionNarrowFOV)1 LensDistortionBrown (boofcv.alg.distort.brown.LensDistortionBrown)1 ECoCheckGenerator (boofcv.alg.fiducial.calib.ecocheck.ECoCheckGenerator)1 ECoCheckUtils (boofcv.alg.fiducial.calib.ecocheck.ECoCheckUtils)1 HammingChessboardGenerator (boofcv.alg.fiducial.calib.hammingchess.HammingChessboardGenerator)1 HammingGridGenerator (boofcv.alg.fiducial.calib.hamminggrids.HammingGridGenerator)1 CalibrationObservation (boofcv.alg.geo.calibration.CalibrationObservation)1