Search in sources :

Example 11 with LensDistortionRadialTangential

use of boofcv.alg.distort.radtan.LensDistortionRadialTangential in project BoofCV by lessthanoptimal.

the class TestBaseDetectFiducialSquare method detectWithLensDistortion.

private void detectWithLensDistortion(List<Point2D_F64> expected, DetectCorner detector, CameraPinholeRadial intrinsic) {
    // create a pattern with a corner for orientation and put it into the image
    GrayU8 pattern = createPattern(6 * 20, true);
    GrayU8 image = new GrayU8(width, height);
    ImageMiscOps.fill(image, 255);
    image.subimage(60, 300, 60 + pattern.width, 300 + pattern.height, null).setTo(pattern);
    // place the pattern right next to one of the corners to maximize distortion
    // add lens distortion
    Point2Transform2_F32 distToUndistort = LensDistortionOps.narrow(intrinsic).undistort_F32(true, true);
    Point2Transform2_F64 undistTodist = LensDistortionOps.narrow(intrinsic).distort_F64(true, true);
    InterpolatePixelS interp = FactoryInterpolation.createPixelS(0, 255, InterpolationType.BILINEAR, BorderType.ZERO, GrayU8.class);
    ImageDistort<GrayU8, GrayU8> distorter = FactoryDistort.distortSB(false, interp, GrayU8.class);
    distorter.setModel(new PointToPixelTransform_F32(distToUndistort));
    GrayU8 distorted = new GrayU8(width, height);
    distorter.apply(image, distorted);
    detector.configure(new LensDistortionRadialTangential(intrinsic), width, height, false);
    detector.process(distorted);
    assertEquals(1, detector.getFound().size());
    FoundFiducial ff = detector.getFound().get(0);
    // see if the returned corners
    Point2D_F64 expectedDist = new Point2D_F64();
    for (int j = 0; j < 4; j++) {
        Point2D_F64 f = ff.distortedPixels.get(j);
        Point2D_F64 e = expected.get((j + 1) % 4);
        undistTodist.compute(e.x, e.y, expectedDist);
        assertTrue(f.distance(expectedDist) <= 0.4);
    }
// The check to see if square is correctly undistorted is inside the processing function itself
}
Also used : InterpolatePixelS(boofcv.alg.interpolate.InterpolatePixelS) LensDistortionRadialTangential(boofcv.alg.distort.radtan.LensDistortionRadialTangential) Point2D_F64(georegression.struct.point.Point2D_F64) Point2Transform2_F64(boofcv.struct.distort.Point2Transform2_F64) GrayU8(boofcv.struct.image.GrayU8) Point2Transform2_F32(boofcv.struct.distort.Point2Transform2_F32)

Example 12 with LensDistortionRadialTangential

use of boofcv.alg.distort.radtan.LensDistortionRadialTangential in project BoofCV by lessthanoptimal.

the class VisualizeSquareFiducial method process.

public void process(String nameImage, String nameIntrinsic) {
    CameraPinholeRadial intrinsic = nameIntrinsic == null ? null : (CameraPinholeRadial) CalibrationIO.load(nameIntrinsic);
    GrayF32 input = UtilImageIO.loadImage(nameImage, GrayF32.class);
    GrayF32 undistorted = new GrayF32(input.width, input.height);
    Detector detector = new Detector();
    if (intrinsic != null) {
        CameraPinholeRadial paramUndist = new CameraPinholeRadial();
        ImageDistort<GrayF32, GrayF32> undistorter = LensDistortionOps.changeCameraModel(AdjustmentType.EXPAND, BorderType.EXTENDED, intrinsic, new CameraPinhole(intrinsic), paramUndist, ImageType.single(GrayF32.class));
        detector.configure(new LensDistortionRadialTangential(paramUndist), paramUndist.width, paramUndist.height, false);
        undistorter.apply(input, undistorted);
    } else {
        undistorted.setTo(input);
    }
    detector.process(undistorted);
    System.out.println("Total Found: " + detector.squares.size());
    FastQueue<FoundFiducial> fiducials = detector.getFound();
    int N = Math.min(20, detector.squares.size());
    ListDisplayPanel squares = new ListDisplayPanel();
    for (int i = 0; i < N; i++) {
        squares.addImage(ConvertBufferedImage.convertTo(detector.squares.get(i), null), " " + i);
    }
    BufferedImage output = new BufferedImage(input.width, input.height, BufferedImage.TYPE_INT_RGB);
    VisualizeBinaryData.renderBinary(detector.getBinary(), false, output);
    Graphics2D g2 = output.createGraphics();
    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    g2.setColor(Color.RED);
    g2.setStroke(new BasicStroke(2));
    if (intrinsic != null) {
        Point2Transform2_F64 add_p_to_p = LensDistortionOps.narrow(intrinsic).distort_F64(true, true);
        for (int i = 0; i < N; i++) {
            // add back in lens distortion
            Quadrilateral_F64 q = fiducials.get(i).distortedPixels;
            apply(add_p_to_p, q.a, q.a);
            apply(add_p_to_p, q.b, q.b);
            apply(add_p_to_p, q.c, q.c);
            apply(add_p_to_p, q.d, q.d);
            VisualizeShapes.draw(q, g2);
        }
    }
    BufferedImage outputGray = new BufferedImage(input.width, input.height, BufferedImage.TYPE_INT_RGB);
    ConvertBufferedImage.convertTo(undistorted, outputGray);
    g2 = outputGray.createGraphics();
    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    for (int i = 0; i < N; i++) {
        // add back in lens distortion
        Quadrilateral_F64 q = fiducials.get(i).distortedPixels;
        // g2.setStroke(new BasicStroke(2));
        // VisualizeBinaryData.render(detector.getSquareDetector().getUsedContours(),Color.BLUE,outputGray);
        VisualizeShapes.drawArrowSubPixel(q, 3, 1, g2);
    }
    ShowImages.showWindow(output, "Binary");
    ShowImages.showWindow(outputGray, "Gray");
    ShowImages.showWindow(squares, "Candidates");
}
Also used : ListDisplayPanel(boofcv.gui.ListDisplayPanel) Quadrilateral_F64(georegression.struct.shapes.Quadrilateral_F64) Point2Transform2_F64(boofcv.struct.distort.Point2Transform2_F64) FoundFiducial(boofcv.alg.fiducial.square.FoundFiducial) CameraPinhole(boofcv.struct.calib.CameraPinhole) BufferedImage(java.awt.image.BufferedImage) ConvertBufferedImage(boofcv.io.image.ConvertBufferedImage) LensDistortionRadialTangential(boofcv.alg.distort.radtan.LensDistortionRadialTangential) GrayF32(boofcv.struct.image.GrayF32) FactoryShapeDetector(boofcv.factory.shape.FactoryShapeDetector) ConfigPolygonDetector(boofcv.factory.shape.ConfigPolygonDetector) CameraPinholeRadial(boofcv.struct.calib.CameraPinholeRadial)

Example 13 with LensDistortionRadialTangential

use of boofcv.alg.distort.radtan.LensDistortionRadialTangential 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
    CameraPinholeRadial param = CalibrationIO.load(new File(directory, "intrinsic.yaml"));
    LensDistortionNarrowFOV lensDistortion = new LensDistortionRadialTangential(param);
    BufferedImage input = UtilImageIO.loadImage(directory, "image0000.jpg");
    // BufferedImage input = UtilImageIO.loadImage(directory , "image0001.jpg");
    // BufferedImage input = UtilImageIO.loadImage(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();
    Se3_F64 targetToSensor = new Se3_F64();
    Point2D_F64 locationPixel = new Point2D_F64();
    Polygon2D_F64 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.hasUniqueID())
            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) LensDistortionNarrowFOV(boofcv.alg.distort.LensDistortionNarrowFOV) BufferedImage(java.awt.image.BufferedImage) ConvertBufferedImage(boofcv.io.image.ConvertBufferedImage) Polygon2D_F64(georegression.struct.shapes.Polygon2D_F64) LensDistortionRadialTangential(boofcv.alg.distort.radtan.LensDistortionRadialTangential) GrayF32(boofcv.struct.image.GrayF32) CameraPinholeRadial(boofcv.struct.calib.CameraPinholeRadial) Point2D_F64(georegression.struct.point.Point2D_F64) File(java.io.File) Se3_F64(georegression.struct.se.Se3_F64)

Example 14 with LensDistortionRadialTangential

use of boofcv.alg.distort.radtan.LensDistortionRadialTangential 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
    CameraPinholeRadial param = CalibrationIO.load(new File(imagePath, "intrinsic.yaml"));
    LensDistortionNarrowFOV lensDistortion = new LensDistortionRadialTangential(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();
    Se3_F64 targetToSensor = new Se3_F64();
    Point2D_F64 locationPixel = new Point2D_F64();
    Polygon2D_F64 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.hasUniqueID())
            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 : 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) LensDistortionRadialTangential(boofcv.alg.distort.radtan.LensDistortionRadialTangential) GrayF32(boofcv.struct.image.GrayF32) CameraPinholeRadial(boofcv.struct.calib.CameraPinholeRadial) Point2D_F64(georegression.struct.point.Point2D_F64) File(java.io.File) Se3_F64(georegression.struct.se.Se3_F64)

Example 15 with LensDistortionRadialTangential

use of boofcv.alg.distort.radtan.LensDistortionRadialTangential in project BoofCV by lessthanoptimal.

the class ExamplePoseOfCalibrationTarget method main.

public static void main(String[] args) {
    // Load camera calibration
    CameraPinholeRadial intrinsic = CalibrationIO.load(UtilIO.pathExample("calibration/mono/Sony_DSC-HX5V_Chess/intrinsic.yaml"));
    LensDistortionNarrowFOV lensDistortion = new LensDistortionRadialTangential(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.calibChessboard(new ConfigChessboard(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 = new PointCloudViewer(intrinsic, 0.01);
    // make the view more interest.  From the side.
    DMatrixRMaj rotY = ConvertRotation3D_F64.rotY(-Math.PI / 2.0, null);
    viewer.setWorldToCamera(new Se3_F64(rotY, new Vector3D_F64(0.75, 0, 1.25)));
    ImagePanel imagePanel = new ImagePanel(intrinsic.width, intrinsic.height);
    viewer.setPreferredSize(new Dimension(intrinsic.width, intrinsic.height));
    PanelGridPanel gui = new PanelGridPanel(1, imagePanel, viewer);
    gui.setMaximumSize(gui.getPreferredSize());
    ShowImages.showWindow(gui, "Calibration Target Pose", true);
    // Allows the user to click on the image and pause
    MousePauseHelper pauseHelper = new MousePauseHelper(gui);
    // saves the target's center location
    List<Point3D_F64> path = new ArrayList<>();
    // Process each frame in the video sequence
    Se3_F64 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.reset();
            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());
        viewer.repaint();
        imagePanel.repaint();
        BoofMiscOps.pause(30);
        while (pauseHelper.isPaused()) {
            BoofMiscOps.pause(30);
        }
    }
}
Also used : Point3D_F64(georegression.struct.point.Point3D_F64) LensDistortionNarrowFOV(boofcv.alg.distort.LensDistortionNarrowFOV) DMatrixRMaj(org.ejml.data.DMatrixRMaj) ArrayList(java.util.ArrayList) LensDistortionRadialTangential(boofcv.alg.distort.radtan.LensDistortionRadialTangential) Vector3D_F64(georegression.struct.point.Vector3D_F64) PanelGridPanel(boofcv.gui.PanelGridPanel) GrayF32(boofcv.struct.image.GrayF32) CameraPinholeRadial(boofcv.struct.calib.CameraPinholeRadial) Point2D_F64(georegression.struct.point.Point2D_F64) PointCloudViewer(boofcv.gui.d3.PointCloudViewer) ConfigChessboard(boofcv.abst.fiducial.calib.ConfigChessboard) Se3_F64(georegression.struct.se.Se3_F64) ImagePanel(boofcv.gui.image.ImagePanel) MousePauseHelper(boofcv.gui.MousePauseHelper)

Aggregations

LensDistortionRadialTangential (boofcv.alg.distort.radtan.LensDistortionRadialTangential)15 CameraPinholeRadial (boofcv.struct.calib.CameraPinholeRadial)9 ConvertBufferedImage (boofcv.io.image.ConvertBufferedImage)6 BufferedImage (java.awt.image.BufferedImage)6 GrayF32 (boofcv.struct.image.GrayF32)5 Point2D_F64 (georegression.struct.point.Point2D_F64)5 LensDistortionNarrowFOV (boofcv.alg.distort.LensDistortionNarrowFOV)4 File (java.io.File)4 Point2Transform2_F64 (boofcv.struct.distort.Point2Transform2_F64)3 GrayU8 (boofcv.struct.image.GrayU8)3 Se3_F64 (georegression.struct.se.Se3_F64)3 FoundFiducial (boofcv.alg.fiducial.square.FoundFiducial)2 ConfigFiducialBinary (boofcv.factory.fiducial.ConfigFiducialBinary)2 ConfigFiducialImage (boofcv.factory.fiducial.ConfigFiducialImage)2 ConfigPolygonDetector (boofcv.factory.shape.ConfigPolygonDetector)2 FactoryShapeDetector (boofcv.factory.shape.FactoryShapeDetector)2 ListDisplayPanel (boofcv.gui.ListDisplayPanel)2 ImagePanel (boofcv.gui.image.ImagePanel)2 CameraPinhole (boofcv.struct.calib.CameraPinhole)2 Point2Transform2_F32 (boofcv.struct.distort.Point2Transform2_F32)2