Example Detect Black Ellipses

From BoofCV
Revision as of 13:00, 21 December 2020 by Peter (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Red lines outline detected ellipses

BinaryEllipseDetector will detect ellipses inside an image which are black to a high level of precision quickly. Detection is done inside a binary image with subpixel refinement inside a gray scale image. These ellipses are used by ellipses based calibration targets

Example Code:


  • Ellipses
  • Fiducials

Related Examples:


Example Code

 * Example of how to detect black ellipses with a white background inside of images.  These ellipses will have a
 * high level of accuracy and are used in camera calibration else where.
 * @author Peter Abeles
public class ExampleDetectBlackEllipse {
	public static void main(String[] args) {
		String[] images = new String[]{

		ListDisplayPanel panel = new ListDisplayPanel();

		BinaryEllipseDetector<GrayU8> detector = FactoryShapeDetector.ellipse(null, GrayU8.class);

		for( String fileName : images ) {
			BufferedImage image = UtilImageIO.loadImage(UtilIO.pathExample(fileName));

			GrayU8 input = ConvertBufferedImage.convertFromSingle(image, null, GrayU8.class);
			GrayU8 binary = new GrayU8(input.width,input.height);

			// Binarization is done outside to allows creative tricks.  For example, when applied to a chessboard
			// pattern where square touch each other, the binary image is eroded first so that they don't touch.
			// The squares are expanded automatically during the subpixel optimization step.
			int threshold = (int)GThresholdImageOps.computeOtsu(input, 0, 255);
			ThresholdImageOps.threshold(input, binary, threshold, true);

			// it takes in a grey scale image and binary image
			// the binary image is used to do a crude polygon fit, then the grey image is used to refine the lines
			// using a sub-pixel algorithm
			detector.process(input, binary);

			// visualize results by drawing red polygons
			DogArray<BinaryEllipseDetector.EllipseInfo> found = detector.getFound();
			Graphics2D g2 = image.createGraphics();
			g2.setStroke(new BasicStroke(3));
			for (int i = 0; i < found.size; i++) {
				VisualizeShapes.drawEllipse(found.get(i).ellipse, g2);

			panel.addImage(image,new File(fileName).getName());

		ShowImages.showWindow(panel,"Detected Ellipses",true);