I\'m trying to train tesseract to recognize numbers from real images of gas meters.
The images that I use for training are made with a camera, for this reason there are
As far as I can tell you need to OpenCV to recognize box in which numbers are located, but OpenCV is not god for OCR. After you locate box, just crop that part, do image processing and then hand it over to tesseract for OCR.
I need help with OpenCV because I don't know how to program in OpenCV.
Here are few real world examples.
Tesseract is a pretty decent OCR package, but doesn't pre-process images properly. My experience is that you can get a good OCR result if you just do some pre-processing before passing it on to tesseract.
There are a couple of key pointers that improves recognition significantly:
As for point 4, if you know the font that's going to be used, there are some better solutions than using Tesseract like matching these fonts directly on the images... The basic algoritm is to find the digits and match them to all possible characters (which are only 10)... still, the implementation is tricky.
I would try this simple ImageMagick command first:
convert \
original.jpg \
-threshold 50% \
result.jpg
(Play a bit with the 50%
parameter -- try with smaller and higher values...)
Thresholding basically leaves over only 2 values, zero or maximum, for each color channel. Values below the threshold get set to 0, values above it get set to 255 (or 65535 if working at 16-bit depth).
Depending on your original.jpg, you may have a OCR-able, working, very high contrast image as a result.
I suggest you to:
I recommend you to use Tesseract's API themselves to enhance the image (denoise, normalize, sharpen...)
for example : Boxa * tesseract::TessBaseAPI::GetConnectedComponents(Pixa** pixa)
(it allows you to get to the bounding boxes of each character)
Pix* pimg = tess_api->GetThresholdedImage();
Here you find few examples