Как я могу обнаружить квадраты, используя opencv4.2 (Android) - PullRequest
0 голосов
/ 26 февраля 2020

Я обнаруживаю прямоугольник и сравниваю цвет с тест-полоской мочи.

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

Вот мой код:

MainActivity. java

...
@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        ...
                    Bitmap img = BitmapFactory.decodeStream(in);
                    in.close();
                    Bitmap changeImg = changeBitmapContrastBrightness(img, (float)1, 10);
                    Mat cMap = new Mat();
                    Utils.bitmapToMat(changeImg, cMap);
                    List<MatOfPoint> squres = processImage(cMap);

                    for (int i = 0; i < squres.size(); i++) {
                        setLabel(cMap, String.valueOf(i), squres.get(i));
                    }

                    Bitmap resultBitmap = Bitmap.createBitmap(cMap.cols(), cMap.rows(), Bitmap.Config.ARGB_8888);
                    Utils.matToBitmap(cMap, resultBitmap);
                    imgView.setImageBitmap(resultBitmap);
                ...
    }
...
private static List<MatOfPoint> processImage(Mat img){
        ArrayList<MatOfPoint> squares = new ArrayList<>();
        Mat matGray = new Mat();
        Mat matCny = new Mat();
        Mat matBlur = new Mat();
        Mat matThresh = new Mat();
        Mat close = new Mat();
        // 노이즈 제거위해 다운스케일 후 업스케일
//        Imgproc.pyrDown(matInit, matBase, matBase.size());
//        Imgproc.pyrUp(matBase, matInit, matInit.size());
        // GrayScale
        Imgproc.cvtColor(img, matGray, Imgproc.COLOR_BGR2GRAY);
        // Blur
        Imgproc.medianBlur(matGray, matBlur, 5);
        //        // Canny Edge 검출
//        Imgproc.Canny(matBlur, matCny, 0, 255);
//        // Binary
        Imgproc.threshold(matBlur, matThresh, 160, 255, Imgproc.THRESH_BINARY_INV);
        Imgproc.morphologyEx(matThresh, close, Imgproc.MORPH_CLOSE, Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(3,3)));
//        // 노이즈 제거
//        Imgproc.erode(matCny, matCny, Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new org.opencv.core.Size(6, 6)));
//        Imgproc.dilate(matCny, matCny, Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new org.opencv.core.Size(12, 12)));

        List<MatOfPoint> contours = new ArrayList<>();
        Mat hierarchy = new Mat();
        Imgproc.findContours(close, contours, hierarchy, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE);
        double min_area = 0;
        double max_area = 10000;
        for(MatOfPoint cnt : contours){
            double contourArea = Imgproc.contourArea(cnt);

            if(contourArea > min_area && contourArea < max_area){
                squares.add(cnt);
            }
        }
        return squares;
    }

Результат приложения Изображение

enter image description here


Исходное изображение

enter image description here

Пожалуйста, помогите мне ..

1 Ответ

0 голосов
/ 26 февраля 2020

Ваш код правильно идентифицирует более мелкие прямоугольники и игнорирует очень большой прямоугольник, который является полосой, поэтому основы все на месте.

Он не распознает меньшие прямоугольники на полосе - учитывая, что ваш Обнаружение контуров четко работает, это говорит о том, что пороговое значение в вашей пороговой функции (160 в вашем коде выше), возможно, потребуется скорректировать, чтобы оно включало цветные прямоугольники на полосе, которые не имеют черного контура. Черный контур будет определенно отсоединен.

Независимо от причины root вы, вероятно, найдете самый простой способ отладки - вывести и посмотреть промежуточные сгенерированные изображения - это позволит вам очень визуально проверить себя. быстрый результат размытия и порогового значения.

Вы также можете взглянуть на использование адаптивного порогового значения, если вы работаете с несколькими изображениями и обнаружили, что пороговое значение не является чем-то, что вы можете надежно определить заранее. Документация находится здесь: https://docs.opencv.org/2.4/modules/imgproc/doc/miscellaneous_transformations.html?highlight=adaptivethreshold, и в этом ответе есть очень хороший пример: { ссылка }

adaptiveThreshold параметры позволяют вам точно настроить его поведение и стоит поэкспериментировать с ними, посмотреть, что лучше всего подходит для данного типа, если изображение:

enter image description here

...