package sample; /** * @file HoughCircles.java * @brief This program demonstrates circle finding with the Hough transform */ import org.opencv.core.*; import org.opencv.core.Point; import org.opencv.highgui.HighGui; import org.opencv.imgcodecs.Imgcodecs; import org.opencv.imgproc.Imgproc; class HoughCirclesRun { public void run(String[] args) { //! [load] String default_file = "../../../../data/smarties.png"; String filename = ((args.length > 0) ? args[0] : default_file); // Load an image Mat src = Imgcodecs.imread(filename, Imgcodecs.IMREAD_COLOR); // Check if image is loaded fine if( src.empty() ) { System.out.println("Error opening image!"); System.out.println("Program Arguments: [image_name -- default " + default_file +"] \n"); System.exit(-1); } //! [load] //! [convert_to_gray] Mat gray = new Mat(); Imgproc.cvtColor(src, gray, Imgproc.COLOR_BGR2GRAY); //! [convert_to_gray] //![reduce_noise] Imgproc.medianBlur(gray, gray, 5); //![reduce_noise] //! [houghcircles] Mat circles = new Mat(); Imgproc.HoughCircles(gray, circles, Imgproc.HOUGH_GRADIENT, 1.0, (double)gray.rows()/16, // change this value to detect circles with different distances to each other 100.0, 30.0, 1, 30); // change the last two parameters // (min_radius & max_radius) to detect larger circles //! [houghcircles] //! [draw] for (int x = 0; x < circles.cols(); x++) { double[] c = circles.get(0, x); Point center = new Point(Math.round(c[0]), Math.round(c[1])); // circle center Imgproc.circle(src, center, 1, new Scalar(0,100,100), 3, 8, 0 ); // circle outline int radius = (int) Math.round(c[2]); Imgproc.circle(src, center, radius, new Scalar(255,0,255), 3, 8, 0 ); } //! [draw] //! [display] HighGui.imshow("detected circles", src); HighGui.waitKey(); //! [display] System.exit(0); } } public class HoughCircles { public static void main(String[] args) { // Load the native library. System.loadLibrary(Core.NATIVE_LIBRARY_NAME); new HoughCirclesRun().run(args); } }