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();
}
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);
}
Aggregations