0

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

所以我想实现“00295”值作为结果。

这是水表的一个例子, 但我无法达到这个结果。

脚步:

  1. 应用灰色过滤器
  2. 高斯模糊滤镜 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());
        }
    }
}
4

1 回答 1

0

如果滤水器的位置不会因图像而变化,您是否可以手动将图像裁剪为所需的尺寸?此外,在模糊图像后,尝试使用自适应阈值,然后进行精确边缘检测。因此,您的图像将只存在硬边。然后您可以在图像上找到轮廓并过滤这些轮廓,直到它们适合您想要的所需尺寸。

于 2020-03-25T02:40:10.003 回答