Example Detect Black Ellipses

From BoofCV
Revision as of 22:38, 19 January 2018 by Peter (talk | contribs)
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.
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:

Concepts:

  • Ellipses
  • Fiducials

Related Examples:

Videos:

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[]{
				"shapes/polygons01.jpg",
				"shapes/shapes02.png",
				"fiducial/circle_hexagonal/image00.jpg",
				"fiducial/circle_hexagonal/image01.jpg"};

		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 = 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
			FastQueue<BinaryEllipseDetector.EllipseInfo> found = detector.getFound();
			Graphics2D g2 = image.createGraphics();
			g2.setStroke(new BasicStroke(3));
			g2.setColor(Color.RED);
			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);
	}
}