使用OpenCv Java进行水表的图像预处理,使用Tesseract进行OCR图像预处理

时间:2020-03-25 00:25:43

标签: java opencv tesseract tess4j meter

我正在尝试开发简单的应用程序(OpenCv,Tesseract和Java),在这里我需要从水表的照片中获取数字。我是OpenCV的新手,因此无法检测矩形中的数字。

所以我想获得“ 00295”值。

Here is a example of water meter 但是我无法达到这个结果。

步骤:

  1. 应用灰色滤镜
  2. GaussianBlur过滤器3x3
  3. Sobel过滤器阈值
  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 :(得分:0)

如果滤水器的位置在图像之间不会改变,您是否可以手动将图像裁剪为所需的尺寸?另外,在使图像模糊之后,请尝试使用自适应阈值,然后再进行精巧边缘检测。结果,您的图像将仅显示硬边缘。然后,您可以在图像上找到轮廓,并通过这些轮廓进行过滤,直到它们适合所需的大小为止。