Difference between revisions of "Example Detect Black Ellipses"
From BoofCV
Jump to navigationJump to searchm |
m |
||
Line 11: | Line 11: | ||
* Fiducials | * Fiducials | ||
Related Examples | Related Examples: | ||
* [[Example_Detect_Black_Polygons|Black Polygons]] | * [[Example_Detect_Black_Polygons|Black Polygons]] | ||
* [[Example_Detect_Calibration_Target| Calibration Target]] | * [[Example_Detect_Calibration_Target| Calibration Target]] | ||
Videos: | |||
* [https://youtu.be/qMTtdiujAtQ?t=513 Ellipse Detector] | |||
= Example Code = | = Example Code = |
Revision as of 10:00, 5 January 2017
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_asymmetric/image00.jpg",
"fiducial/circle_asymmetric/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<EllipseRotated_F64> found = detector.getFoundEllipses();
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), g2);
}
panel.addImage(image,new File(fileName).getName());
}
ShowImages.showWindow(panel,"Detected Ellipses",true);
}
}