Example Fiducial Square Binary

From BoofCV
Jump to navigationJump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Demonstration how to detect square binary fiducials. Square binary fiducials encode a pattern in the fiducial's center which can describe up to 4096 unique targets.

Example Code:

Concepts:

  • Fiducials
  • Pose estimation

Relevant Examples/Tutorials:

Videos

Example Code

**
 * Detects square binary fiducials inside an image, writes out there pose, and visualizes a virtual flat cube
 * above them in the input image.
 *
 * These markers can have issues with noise and you might want to consider using ExampleFiducialHamming instead.
 *
 * @author Peter Abeles
 */
public class ExampleFiducialBinary {
	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);
	}
}