Как обнаружить и подсчитать белые объекты случайного размера с помощью OpenCV в Android Studio - PullRequest
0 голосов
/ 05 октября 2018

Я пытаюсь создать приложение в Android Studio с использованием OpenCV, которое в основном смотрит на изображение группы точек, выделяет все яркие точки и затем подсчитывает их.Форма точек не соответствует, но цвет точек должен быть белым с черным фоном.

Я начинаю с загрузки изображения, подобного этому: Original Image

Затем я беру растровое изображение и конвертирую его в оттенки серого.Затем я проверяю, что значения серого находятся в пределах диапазона, и возвращаю растровое изображение двоичных значений.Возвращенное изображение выглядит следующим образом:

Processed Image

Я безуспешно пробовал несколько разных способов подсчитать эти точки, включая использование Imgproc.findContours и следование учебным пособиям.например этот , но я не ищу конкретную форму.Это в основном просто группа от 1 до 50 пикселей за раз со значениями rgb 225, 255, 255 и неправильной формы.Как можно подсчитать эти отдельные фигуры?

Вот моя часть кода, предназначенная для обработки изображений, часть countNonZero просто для того, чтобы дать мне представление о том, сколько существует белых пикселей, что составляет 179 для этого конкретного изображения

public void convertToGray(View v){
    int whitePix;
    Mat Rgba = new Mat();
    Mat grayMat = new Mat();
    Mat dots = new Mat();
    BitmapFactory.Options o = new BitmapFactory.Options();
    o.inDither=false;
    o.inSampleSize=4;

    int width = imageBitmap.getWidth();
    int height = imageBitmap.getHeight();

    grayBitmap = Bitmap.createBitmap(width,height,Bitmap.Config.RGB_565);


    //bitmap to MAT

    Utils.bitmapToMat(imageBitmap,Rgba);

    Imgproc.cvtColor(Rgba,Rgba,Imgproc.COLOR_RGB2GRAY);

    Core.inRange(Rgba,scalarLow,scalarHigh,grayMat);

    whitePix = Core.countNonZero(grayMat);

    Utils.matToBitmap(grayMat,grayBitmap);

     MediaStore.Images.Media.insertImage(getApplicationContext().getContentResolver(), grayBitmap, "Result", "Descrip");

    mImageView.setImageBitmap(grayBitmap);



}

Эта функция вызывается при нажатии кнопки после загрузки изображения в приложение.

Ответы [ 2 ]

0 голосов
/ 06 октября 2018

Оказывается, я неправильно использовал findContours, и мне удалось решить мою проблему, добавив в свою функцию следующий код:

    Mat dots = new Mat();
    List<MatOfPoint> contours = new ArrayList<MatOfPoint>();
    Imgproc.findContours(grayMat, contours, dots, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE, new Point(0,0));

    Imgproc.drawContours(grayMat, contours, -1, new Scalar(Math.random()*255, Math.random()*255, Math.random()*255));//, 2, 8, hierarchy, 0, new Point());

И список счетчиков содержит количество входов контуров, котороеэто количество сгустков, которые я ищу.

0 голосов
/ 06 октября 2018

Я использовал этот код для итерации по шаблону соответствия результатов Mat для поиска возможных совпадений.

public static List<Point> getPointsFromMatAboveThreshold(Mat m, float t){
    List<Point> matches = new ArrayList<Point>();
    FloatIndexer indexer = m.createIndexer();
    for (int y = 0; y < m.rows(); y++) {
        for (int x = 0; x < m.cols(); x++) {
            if (indexer.get(y,x)>t) {
                System.out.println("(" + x + "," + y +") = "+ indexer.get(y,x));
                matches.add(new Point(x, y));                   
            }
        }           
    }       
    return matches;
}

это даст вам список координат на определенное количество белого цвета.Затем вам нужно будет объединить эти

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