I am currently developing an application that will define circles from photos. I managed to write code for this, but it either makes false negatives or false positives if I get a little off the PC screen. How can I improve the result? I mean, there are many applications that detect small and fuzzy circles.
[Update]
I messed around with values ββin GaussianBlur and HoughCircles . changes to Imgproc.GaussianBlur(grayMat, grayMat, new Size(9, 9), 2, 2); before Imgproc.GaussianBlur(grayMat, grayMat, new Size(9, 9), 9, 9); and double param1 = 70, param2 = 72; up to double param1 = 50, param2 = 52; improves the result, but not enough.
Mat mat = new Mat(bitmap.getWidth(), bitmap.getHeight(), CvType.CV_8UC1); Mat grayMat = new Mat(bitmap.getWidth(), bitmap.getHeight(), CvType.CV_8UC1); Utils.bitmapToMat(bitmap, mat); int colorChannels = (mat.channels() == 3) ? Imgproc.COLOR_BGR2GRAY : ((mat.channels() == 4) ? Imgproc.COLOR_BGRA2GRAY : 1); Imgproc.cvtColor(mat, grayMat, colorChannels); Imgproc.GaussianBlur(grayMat, grayMat, new Size(9, 9), 2, 2); // accumulator value double dp = 1.2d; // minimum distance between the center coordinates of detected circles in pixels double minDist = 100; int minRadius = 0, maxRadius = 0; double param1 = 70, param2 = 72; Mat circles = new Mat(bitmap.getWidth(), bitmap.getHeight(), CvType.CV_8UC1); Imgproc.HoughCircles(grayMat, circles, Imgproc.CV_HOUGH_GRADIENT, dp, minDist, param1, param2, minRadius, maxRadius); int numberOfCircles = 9; if (numberOfCircles > circles.cols()){ numberOfCircles = circles.cols(); } for (int i=0; i<numberOfCircles; i++) { double[] circleCoordinates = circles.get(0, i); if(circleCoordinates == null){ break; } int x = (int) circleCoordinates[0], y = (int) circleCoordinates[1]; Point center = new Point(x, y); android.graphics.Point centerC = new android.graphics.Point(x, y); int radius = (int) circleCoordinates[2]; Core.circle(mat, center, radius, new Scalar(0, 255, 0), 4); Core.rectangle(mat, new Point(x - 5, y - 5), new Point(x + 5, y + 5), new Scalar(0, 128, 255), -1);
Thanks in advance.
I am currently using these A-shaped dots to check the code, but I want to detect even smaller circles in the photo. 