Derzeit entwickle ich eine App, die Kreise von Fotos erkennen wird. Ich habe es geschafft, einen Code dafür zu schreiben, aber es macht entweder falsche Negative oder falsche Positive, wenn ich ein bisschen vom PC-Bildschirm entfernt bin. Wie kann ich das Ergebnis verbessern? Ich meine, es gibt viele Apps, die kleine und unklare Kreise erkennen.Android OpenCV Verbesserte Erkennungsqualität
[Update]
I mit Werten in GaussianBlur
und HoughCircles
bin Hantieren. Ändern Imgproc.GaussianBlur(grayMat, grayMat, new Size(9, 9), 2, 2);
zu Imgproc.GaussianBlur(grayMat, grayMat, new Size(9, 9), 9, 9);
und doppelte param1 = 70, param2 = 72;
zu double param1 = 50, param2 = 52;
verbessern das Ergebnis, aber nicht genug.
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);
Vielen Dank im Voraus.
Im Moment verwende ich diese A-förmigen Punkte, um den Code zu testen, aber ich möchte noch kleinere Kreise auf dem Foto erkennen.
Haben Sie verschiedene Sätze von Parametern für param1 und param2 ausprobiert? –
Nein. Ich nicht. Wie sollte ich versuchen, sie zu ändern? Param 2 erhöhen? –
Meine erste Schätzung wäre, Param2 zu verringern. Sie werden noch ein paar falsch positive Ergebnisse haben, aber ich nehme an, dass es einfacher ist, mit falschen positiven Ergebnissen umzugehen als mit falschen negativen. Zweitens versuchen Sie Param1 zu verringern. Dies erhöht die Empfindlichkeit des Canny-Kantendetektors, was bei der Suche nach Kreisen, die nicht scharf vom Hintergrund abheben, nützlich sein kann. –