# API example for user patterns User patterns can be useful when recognizing ID type of fields which have non-dictionary words but follow specific patterns of alphabets and digits e.g. `\A\A\d\d\d\d\A` or `\A\A\d\d\d\A` This documentation provides a simple example on how to use the tesseract-ocr API (4.x) in C++ for applying _user patterns_ for improving recognition. It is expected that tesseract-ocr is correctly installed including all dependencies. It is expected the user is familiar with C++, compiling and linking program on their platform. This is based on [an example provided in tesseract-ocr forum](https://groups.google.com/forum/#!msg/tesseract-ocr/y052O_DwYic/gsJN1NHBfqkJ) and updated for the [recent implementation of the feature for tesseract 4.x](https://github.com/tesseract-ocr/tesseract/pull/2328). Please note that while this example gets 100% accuracy after user_patterns are applied, that may not always be the case. User patterns (like user dictionaries) are merely applied as a _hint_ while decoding, but not exclusively. [Pre-processing the image](ImproveQuality.md) usually improves the quality of recognition and is recommended. ## Requirements In order to apply user patterns for improving recognition, the following are required. ### _user patterns file_ The _user patterns file_ should contain one pattern per line in UTF-8 format. In choosing which patterns to include please be aware of the fact that providing very generic patterns will make tesseract run slower. Best results may be obtained by having a single pattern in the file. Details of type of patterns that can be used are given in [trie.h](https://github.com/tesseract-ocr/tesseract/blob/main/src/dict/trie.h#L185). #### Example of a user patterns file Make a text file, and write each pattern on a separate line, with UNIX line endings (line-feed character) and a blank line at the end, e.g. ``` \A\A\d\d\d\d\A ``` In the following, let's assume you named that pattern file `path/to/my.patterns`. ### _config file_ For the API, the information about the _user patterns file_ needs to be specified in a _config file_. (For the CLI, this works as well, but there is also a direct option for the _user patterns file_ alone.) #### Example of a config file Make a text file, and write `user_patterns_file` into it verbatim, followed by the path name in one line, with UNIX line endings (line-feed character) and a blank line at the end, e.g. ``` user_patterns_file path/to/my.patterns ``` In the following, let's assume you named that config file `path/to/my.patterns.config`. ## CLI Example From the command line, user patterns can be invoked as follows: ```sh tesseract input.tif output --user-patterns path/to/my.patterns ``` ## API Example Take the following _image file_ (`Arial.png`) as input: The following code uses the above _user patterns file_ and _config file_ on that _image file_: ```C++ #include #include int main() { Pix *image; char *outText; char *configs[]={"path/to/my.patterns.config"}; int configs_size = 1; tesseract::TessBaseAPI *api = new tesseract::TessBaseAPI(); if (api->Init(NULL, "eng", tesseract::OEM_LSTM_ONLY, configs, configs_size, NULL, NULL, false)) { fprintf(stderr, "Could not initialize tesseract.\n"); exit(1); } image = pixRead("Arial.png"); api->SetImage(image); outText = api->GetUTF8Text(); printf(outText); api->End(); delete [] outText; pixDestroy(&image); return 0; } ``` Build and run script ```sh #!/bin/bash export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/usr/local/include export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib g++ -std=c++17 -o my.patterns.api my.patterns.api.cpp -llept -ltesseract export TESSDATA_PREFIX=~/tessdata_best ./my.patterns.api > Arial-patterns.txt diff -u Arial-patterns.txt Arial-gt.txt ``` With the _user patterns file_ for this image, the recognition is 100% correct. Without it, there are a number of errors: ```patch --- Arial-patterns-no.txt 2019-07-05 04:21:04.367188492 +0000 +++ Arial-gt.txt 2019-07-05 04:05:11.000000000 +0000 @@ -1,20 +1,20 @@ DQ2679M LO6217I QK2101G -JBO363H +JB0363H KN2873M -Z2B0929J +ZB0929J JF3829W -YNO0584J -SVv8400Q +YN0584J +SV8400Q FY4523X KS0016J OB3016R VA4335P -QHO205V -UH20932 +QH0205V +UH2093Z GW3760Y -S02306T +SO2306T XT8204F -MR6804| -0OX5866M +MR6804I +OX5866M ```