Как определить контуры с разной яркостью, используя Opencv в Android? - PullRequest
0 голосов
/ 14 марта 2019

Я пытаюсь обнаружить все контуры в реальном времени по изображению с помощью Opencv и Android.

Проблема в том, что обнаружение идеально в каждом случае, только когда я включаю телефонный фонарик.

Вот результат, когда горелка выключена

enter image description here

Как вы можете заметить, средний объект никогда не обнаруживается.

И вот результат, когда факел включен

enter image description here

Результат - то, что ожидалось.

Я пытался увеличить яркость изображения, используяМетод Opencv convertTo

  orr.convertTo(orr, orr.type(), 1.3);

Но результат не так точен

enter image description here

Я также пытался изменитьзначение экспозиции камеры, но безуспешно

  public void setExposure(float progress) {
    if (progress < 0.0f && progress > 1.0f) return;
    Camera.Parameters params = mCamera.getParameters();
    int min = params.getMinExposureCompensation();
    int max = params.getMaxExposureCompensation();
    float realProgress = progress - 0.5f;
    int value;
    if (realProgress < 0) {
        value = -(int) (realProgress * 2 * min);
    } else {
        value = (int) (realProgress * 2 * max);
    }
    // if changed
    if (value != params.getExposureCompensation()) {
        params.setExposureCompensation(value);
        mCamera.setParameters(params);
    }
}

И это мой код обработки

   Imgproc.cvtColor(orr, orr, Imgproc.COLOR_RGB2HSV);

        Core.split(orr, channels);

        orr = channels.get(1);

        Core.meanStdDev(orr, mu, stddev);

        orr.convertTo(orr, orr.type(), 1.3);

        CLAHE clahe = Imgproc.createCLAHE();

        clahe.setClipLimit(1);

        clahe.apply(orr, orr);

        clahe.collectGarbage();

        Imgproc.GaussianBlur(orr, orr, new Size(5, 5), 3);

        Imgproc.Canny(orr, orr, mu.get(0, 0)[0], stddev.get(0, 0)[0], 3, false);

        Imgproc.morphologyEx(orr, orr, Imgproc.MORPH_CLOSE, kernell);

        Imgproc.dilate(orr, orr, Imgproc.getStructuringElement(Imgproc.MORPH_CROSS, new Size(3, 3)));

        Imgproc.findContours(orr, contours, new Mat(), Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE);

        for (int i = contours.size() - 1; i >= 0; i--) {
            double area = Imgproc.contourArea(contours.get(i), false);  //  Find the area of contour
            if (area < min_area || contours.get(i).width() >= orr.width() / 3)
                contours.remove(i);
        }


        if (contours.size() > 0) {
            MatOfPoint2f approxCurve = new MatOfPoint2f();
            rectList.clear();
            for (int idx = 0; idx < contours.size(); idx++) {
                //Convert contours(i) from MatOfPoint to MatOfPoint2f
                MatOfPoint2f contour2f = new MatOfPoint2f(contours.get(idx).toArray());
                //Processing on mMOP2f1 which is in type MatOfPoint2f
                double approxDistance = Imgproc.arcLength(contour2f, true) * 0.02;
                Imgproc.approxPolyDP(contour2f, approxCurve, approxDistance, true);

                //Convert back to MatOfPoint
                MatOfPoint points = new MatOfPoint(approxCurve.toArray());

                // Get bounding rect of contour
                Rect rectt = Imgproc.boundingRect(points);
                rectList.add(rect);
                Mat miniature = new Mat(orr, new Rect(rectt.tl(), rectt.br()));
                mats.add(miniature);

                // draw enclosing rectangle (all same color, but you could use variable i to make them unique)
                Imgproc.rectangle(rotated, rectt.tl(), rectt.br(), new Scalar(255, 0, 0));
            }
        }

        long e2 = Core.getTickCount();
        long e = e2 - e1;
        double time = e / Core.getTickFrequency();

        Log.d("timeTAG", "" + time);

        return rotated;

Я буквально играл с переменными и пробовал каждый подход там без удачи в течение 2дней.

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

Любая помощь будет оценена.

...