我正在尝试开发简单的应用程序(OpenCv,Tesseract和Java),在这里我需要从水表的照片中获取数字。我是OpenCV的新手,因此无法检测矩形中的数字。
所以我想获得“ 00295”值。
Here is a example of water meter 但是我无法达到这个结果。
步骤:
但是结果是我从其他标签中得到了一堆随机数。 能否请您提供一些建议并说明如何检测这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());
}
}
}
答案 0 :(得分:0)
如果滤水器的位置在图像之间不会改变,您是否可以手动将图像裁剪为所需的尺寸?另外,在使图像模糊之后,请尝试使用自适应阈值,然后再进行精巧边缘检测。结果,您的图像将仅显示硬边缘。然后,您可以在图像上找到轮廓,并通过这些轮廓进行过滤,直到它们适合所需的大小为止。