Example Detect Black Ellipses

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

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 ) {

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