Search in sources :

Example 1 with RandomDotDefinition

use of boofcv.io.fiducial.RandomDotDefinition in project BoofCV by lessthanoptimal.

the class CreateFiducialRandomDot method saveMarkersToYaml.

/**
 * Saves a description of all the markers in a YAML file so that it can be easily read later on
 */
private void saveMarkersToYaml() throws IOException {
    String nameYaml = FilenameUtils.getBaseName(fileName) + ".yaml";
    var writer = new OutputStreamWriter(new FileOutputStream(new File(new File(fileName).getParentFile(), nameYaml)), UTF_8);
    var def = new RandomDotDefinition();
    def.randomSeed = randomSeed;
    def.dotDiameter = dotDiameter;
    def.maxDotsPerMarker = maxDotsPerMarker;
    def.markerWidth = markerWidth;
    def.markerHeight = markerHeight;
    def.units = unit.getAbbreviation();
    def.markers.addAll(markers);
    FiducialIO.saveRandomDotYaml(def, writer);
    writer.close();
}
Also used : FileOutputStream(java.io.FileOutputStream) OutputStreamWriter(java.io.OutputStreamWriter) File(java.io.File) RandomDotDefinition(boofcv.io.fiducial.RandomDotDefinition)

Example 2 with RandomDotDefinition

use of boofcv.io.fiducial.RandomDotDefinition in project BoofCV by lessthanoptimal.

the class ExampleFiducialRandomDots method main.

public static void main(String[] args) {
    // The definitions file specifies where dots are on each marker and other bits of meta data
    RandomDotDefinition defs = FiducialIO.loadRandomDotYaml(UtilIO.fileExample("fiducial/random_dots/descriptions.yaml"));
    // The only parameter that you have to set is markerLength. It's used to compute bounding
    // boxes and similar. If you don't know what the width is just set it to 1.0
    var config = new ConfigUchiyaMarker();
    config.markerWidth = defs.markerWidth;
    config.markerHeight = defs.markerHeight;
    Uchiya_to_FiducialDetector<GrayU8> detector = FactoryFiducial.randomDots(config, GrayU8.class);
    // Load / learn all the markers. This can take a few seconds if there are a lot of markers
    for (List<Point2D_F64> marker : defs.markers) {
        detector.addMarker(marker);
    }
    // If you want 3D pose information then the camera need sto be calibrated. If you don't provide
    // this information then just things like the bounding box will be returned
    CameraPinholeBrown intrinsic = CalibrationIO.load(UtilIO.fileExample("fiducial/random_dots/intrinsic.yaml"));
    detector.setLensDistortion(LensDistortionFactory.narrow(intrinsic), intrinsic.width, intrinsic.height);
    // It's now ready to start processing images. Let's load an image
    BufferedImage image = UtilImageIO.loadImageNotNull(UtilIO.pathExample("fiducial/random_dots/image02.jpg"));
    GrayU8 gray = ConvertBufferedImage.convertFrom(image, false, ImageType.SB_U8);
    detector.detect(gray);
    // Time to visualize the results
    Graphics2D g2 = image.createGraphics();
    var targetToSensor = new Se3_F64();
    var bounds = new Polygon2D_F64();
    var center = new Point2D_F64();
    for (int i = 0; i < detector.totalFound(); i++) {
        detector.getBounds(i, bounds);
        detector.getCenter(i, center);
        g2.setColor(new Color(50, 50, 255));
        g2.setStroke(new BasicStroke(10));
        VisualizeShapes.drawPolygon(bounds, true, 1.0, g2);
        VisualizeFiducial.drawLabel(center, "" + detector.getId(i), g2);
        System.out.println("Target ID = " + detector.getId(i));
        if (detector.is3D()) {
            detector.getFiducialToCamera(i, targetToSensor);
            VisualizeFiducial.drawCube(targetToSensor, intrinsic, detector.getWidth(i), 3, g2);
        }
    }
    ShowImages.showWindow(image, "Random Dot Markers", true);
}
Also used : CameraPinholeBrown(boofcv.struct.calib.CameraPinholeBrown) RandomDotDefinition(boofcv.io.fiducial.RandomDotDefinition) BufferedImage(java.awt.image.BufferedImage) ConvertBufferedImage(boofcv.io.image.ConvertBufferedImage) Polygon2D_F64(georegression.struct.shapes.Polygon2D_F64) Point2D_F64(georegression.struct.point.Point2D_F64) GrayU8(boofcv.struct.image.GrayU8) ConfigUchiyaMarker(boofcv.factory.fiducial.ConfigUchiyaMarker) Se3_F64(georegression.struct.se.Se3_F64)

Aggregations

RandomDotDefinition (boofcv.io.fiducial.RandomDotDefinition)2 ConfigUchiyaMarker (boofcv.factory.fiducial.ConfigUchiyaMarker)1 ConvertBufferedImage (boofcv.io.image.ConvertBufferedImage)1 CameraPinholeBrown (boofcv.struct.calib.CameraPinholeBrown)1 GrayU8 (boofcv.struct.image.GrayU8)1 Point2D_F64 (georegression.struct.point.Point2D_F64)1 Se3_F64 (georegression.struct.se.Se3_F64)1 Polygon2D_F64 (georegression.struct.shapes.Polygon2D_F64)1 BufferedImage (java.awt.image.BufferedImage)1 File (java.io.File)1 FileOutputStream (java.io.FileOutputStream)1 OutputStreamWriter (java.io.OutputStreamWriter)1