Обнаружение крутых кругов на андроид - PullRequest
6 голосов
/ 25 февраля 2012

Я пытаюсь обнаружить круги с помощью Android.Мне удалось реализовать алгоритм обнаружения линий, но при попытке нарисовать грубые круги ничего не отображается.

Мой код:

Mat thresholdImage = new Mat(getFrameHeight() + getFrameHeight() / 2, getFrameWidth(), CvType.CV_8UC1);
            mYuv.put(0, 0, data);
            Imgproc.cvtColor(mYuv, destination, Imgproc.COLOR_YUV420sp2RGB, 4);
            Imgproc.cvtColor(destination, thresholdImage, Imgproc.COLOR_RGB2GRAY, 4);
            Imgproc.GaussianBlur(thresholdImage, thresholdImage, new Size(9, 9), 2, 2 );

        Mat circles = new Mat();


        Imgproc.HoughCircles(thresholdImage, circles, Imgproc.CV_HOUGH_GRADIENT, 1d, (double)thresholdImage.height()/70, 200d, 100d);

        Log.w("circles", circles.cols()+"");
        for (int x = 0; x < circles.cols(); x++) 
        {
                double vCircle[]=circles.get(0,x);

                Point center=new Point(Math.round(vCircle[0]), Math.round(vCircle[1]));
                int radius = (int)Math.round(vCircle[2]);
                // draw the circle center
                Core.circle(destination, center, 3,new Scalar(0,255,0), -1, 8, 0 );
                // draw the circle outline
                Core.circle( destination, center, radius, new Scalar(0,0,255), 3, 8, 0 );

        }

1 Ответ

6 голосов
/ 14 мая 2012

Возможно, вы уже отсортировали это, но несколько вещей.Я бы проверил, что ваш коврик кругов на самом деле имеет некоторые результаты;иногда кажется, что vCircle возвращается null;попробуйте одну из других версий HoughCircles:

iCannyUpperThreshold = 100;
iMinRadius = 20;
iMaxRadius = 400;
iAccumulator = 300;

Imgproc.HoughCircles(thresholdImage, circles, Imgproc.CV_HOUGH_GRADIENT, 
         2.0, thresholdImage.rows() / 8, iCannyUpperThreshold, iAccumulator, 
         iMinRadius, iMaxRadius);

if (circles.cols() > 0)
    for (int x = 0; x < circles.cols(); x++) 
        {
        double vCircle[] = circles.get(0,x);

        if (vCircle == null)
            break;

        Point pt = new Point(Math.round(vCircle[0]), Math.round(vCircle[1]));
        int radius = (int)Math.round(vCircle[2]);

        // draw the found circle
        Core.circle(destination, pt, radius, new Scalar(0,255,0), iLineThickness);
        Core.circle(destination, pt, 3, new Scalar(0,0,255), iLineThickness);
        }

(я поменял твой код на свой, переименовал кое-что и поменял его обратно, я думаю я получил его обратно, так чтоработает ...)

Б.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...