Obecnie pracuję nad aplikacją, która wykrywa kręgi ze zdjęć. Udało mi się napisać kod do tego, ale albo robi fałszywe negatywy, albo fałszywe alarmy, jeśli odbiorę telefon trochę z ekranu komputera. Jak mogę poprawić wynik? Mam na myśli, że istnieje wiele aplikacji wykrywających małe i niejasne kręgi.Android OpenCV Poprawianie jakości wykrywania
[Aktualizacja]
mam błahy z wartościami w GaussianBlur
i HoughCircles
. Zmiana Imgproc.GaussianBlur(grayMat, grayMat, new Size(9, 9), 2, 2);
na Imgproc.GaussianBlur(grayMat, grayMat, new Size(9, 9), 9, 9);
i podwójne poprawić wynik, ale nie wystarczy.
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);
Z góry dziękuję.
Teraz używam tych punktów w kształcie litery A, aby przetestować kod, ale chcę wykryć nawet mniejsze kręgi na zdjęciu.
Czy próbowałeś różnych zestawów parametrów dla param1 i param2? –
Nie. Nie. Jak myślisz, jak powinienem spróbować je zmienić? Zwiększyć parametr 2? –
Moim pierwszym domysłem byłoby zmniejszenie param2. Będziesz miał kilka fałszywych trafień, ale zakładam, że łatwiej jest radzić sobie z fałszywymi pozytywami niż fałszywie negatywnymi. Po drugie, spróbuj zmniejszyć parametr param1. Zwiększa to czułość detektora krawędzi Canny'ego, co może być miłe, gdy chcesz wykryć kręgi, które nie wyróżniają się w tle. –