Предварительная обработка изображения водомера с OpenCv Java, оптическое распознавание текста с Tesseract - PullRequest
0 голосов
/ 25 марта 2020

Я пытаюсь разработать простое приложение (OpenCv, Tesseract и Java), где мне нужно получить цифры из фотографии счетчика воды. Я новичок ie в OpenCV и застрял на обнаружении чисел в прямоугольниках.

Так что я хочу получить значение "00295" в качестве результата.

Вот пример счетчика воды Но я не могу достичь этого результата.

Шаги:

  1. Применить фильтр Грея
  2. Фильтр GaussianBlur 3x3
  3. Порог фильтра Собеля
  4. И выполнение OCR с числовыми символами разрешено только

Но в результате я получаю кучу случайных чисел из других меток. Не могли бы вы дать несколько советов и показать, как обнаружить эти 5 прямоугольников и получить из них цифры? Заранее спасибо.

Вот код:


    private static final int
            CV_THRESH_OTSU = 8;
    public static void main(String[] args) {

        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

        Mat img = new Mat();
        Mat imgGray = new Mat();
        Mat imgGaussianBlur = new Mat();
        Mat imgSobel = new Mat();
        Mat imgThreshold = new Mat();

        //Path to picture
        String inputFilePath = "D:/OCR/test.jpg";
        img = Imgcodecs.imread(inputFilePath);
        Imgcodecs.imwrite("preprocess/1_True_Image.png", img);

        Imgproc.cvtColor(img, imgGray, Imgproc.COLOR_BGR2GRAY);
        Imgcodecs.imwrite("preprocess/2_imgGray.png", imgGray);

        Imgproc.GaussianBlur(imgGray,imgGaussianBlur, new Size(3, 3),0);
        Imgcodecs.imwrite("preprocess/3_imgGaussianBlur.png", imgGray);

        Imgproc.Sobel(imgGaussianBlur, imgSobel, -1, 1, 0);
        Imgcodecs.imwrite("preprocess/4_imgSobel.png", imgSobel);

        Imgproc.threshold(imgSobel, imgThreshold, 0, 255,  CV_THRESH_OTSU);
        Imgcodecs.imwrite("preprocess/5_imgThreshold.png", imgThreshold);

        File imageFile = new File("preprocess/5_imgThreshold.png");
        Tesseract tesseract = new Tesseract();
        //tessdata directory
        tesseract.setDatapath("tessdata");
        tesseract.setTessVariable("tessedit_char_whitelist", "0123456789");
        try {
            String result = tesseract.doOCR(imageFile);
            System.out.println(result);
        } catch (TesseractException e) {
            System.err.println(e.getMessage());
        }
    }
}

1 Ответ

0 голосов
/ 25 марта 2020

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

...