tesseract  5.0.0-alpha-619-ge9db
tesseractclass.cpp
Go to the documentation of this file.
1 // File: tesseractclass.cpp
3 // Description: The Tesseract class. It holds/owns everything needed
4 // to run Tesseract on a single language, and also a set of
5 // sub-Tesseracts to run sub-languages. For thread safety, *every*
6 // variable that was previously global or static (except for
7 // constant data, and some visual debugging flags) has been moved
8 // in here, directly, or indirectly.
9 // This makes it safe to run multiple Tesseracts in different
10 // threads in parallel, and keeps the different language
11 // instances separate.
12 // Some global functions remain, but they are isolated re-entrant
13 // functions that operate on their arguments. Functions that work
14 // on variable data have been moved to an appropriate class based
15 // mostly on the directory hierarchy. For more information see
16 // slide 6 of "2ArchitectureAndDataStructures" in
17 // https://drive.google.com/file/d/0B7l10Bj_LprhbUlIUFlCdGtDYkE/edit?usp=sharing
18 // Some global data and related functions still exist in the
19 // training-related code, but they don't interfere with normal
20 // recognition operation.
21 // Author: Ray Smith
22 //
23 // (C) Copyright 2008, Google Inc.
24 // Licensed under the Apache License, Version 2.0 (the "License");
25 // you may not use this file except in compliance with the License.
26 // You may obtain a copy of the License at
27 // http://www.apache.org/licenses/LICENSE-2.0
28 // Unless required by applicable law or agreed to in writing, software
29 // distributed under the License is distributed on an "AS IS" BASIS,
30 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
31 // See the License for the specific language governing permissions and
32 // limitations under the License.
33 //
35 
36 // Include automatically generated configuration file if running autoconf.
37 #ifdef HAVE_CONFIG_H
38 #include "config_auto.h"
39 #endif
40 
41 #include "tesseractclass.h"
42 
43 #include "allheaders.h"
44 #include "edgblob.h"
45 #include "equationdetect.h"
46 #ifndef ANDROID_BUILD
47 #include "lstmrecognizer.h"
48 #endif
49 
50 namespace tesseract {
51 
53  : BOOL_MEMBER(tessedit_resegment_from_boxes, false,
54  "Take segmentation and labeling from box file",
55  this->params()),
56  BOOL_MEMBER(tessedit_resegment_from_line_boxes, false,
57  "Conversion of word/line box file to char box file",
58  this->params()),
59  BOOL_MEMBER(tessedit_train_from_boxes, false,
60  "Generate training data from boxed chars", this->params()),
61  BOOL_MEMBER(tessedit_make_boxes_from_boxes, false,
62  "Generate more boxes from boxed chars", this->params()),
63  BOOL_MEMBER(tessedit_train_line_recognizer, false,
64  "Break input into lines and remap boxes if present",
65  this->params()),
66  BOOL_MEMBER(tessedit_dump_pageseg_images, false,
67  "Dump intermediate images made during page segmentation",
68  this->params()),
69  BOOL_MEMBER(tessedit_do_invert, true,
70  "Try inverting the image in `LSTMRecognizeWord`", this->params()),
71  // The default for pageseg_mode is the old behaviour, so as not to
72  // upset anything that relies on that.
73  INT_MEMBER(
74  tessedit_pageseg_mode, PSM_SINGLE_BLOCK,
75  "Page seg mode: 0=osd only, 1=auto+osd, 2=auto_only, 3=auto, 4=column,"
76  " 5=block_vert, 6=block, 7=line, 8=word, 9=word_circle, 10=char,"
77  "11=sparse_text, 12=sparse_text+osd, 13=raw_line"
78  " (Values from PageSegMode enum in tesseract/publictypes.h)",
79  this->params()),
80  INT_INIT_MEMBER(tessedit_ocr_engine_mode, tesseract::OEM_DEFAULT,
81  "Which OCR engine(s) to run (Tesseract, LSTM, both)."
82  " Defaults to loading and running the most accurate"
83  " available.",
84  this->params()),
85  STRING_MEMBER(tessedit_char_blacklist, "",
86  "Blacklist of chars not to recognize", this->params()),
87  STRING_MEMBER(tessedit_char_whitelist, "",
88  "Whitelist of chars to recognize", this->params()),
89  STRING_MEMBER(tessedit_char_unblacklist, "",
90  "List of chars to override tessedit_char_blacklist",
91  this->params()),
92  BOOL_MEMBER(tessedit_ambigs_training, false,
93  "Perform training for ambiguities", this->params()),
94  INT_MEMBER(pageseg_devanagari_split_strategy,
95  tesseract::ShiroRekhaSplitter::NO_SPLIT,
96  "Whether to use the top-line splitting process for Devanagari "
97  "documents while performing page-segmentation.",
98  this->params()),
99  INT_MEMBER(ocr_devanagari_split_strategy,
100  tesseract::ShiroRekhaSplitter::NO_SPLIT,
101  "Whether to use the top-line splitting process for Devanagari "
102  "documents while performing ocr.",
103  this->params()),
104  STRING_MEMBER(tessedit_write_params_to_file, "",
105  "Write all parameters to the given file.", this->params()),
106  BOOL_MEMBER(tessedit_adaption_debug, false,
107  "Generate and print debug"
108  " information for adaption",
109  this->params()),
110  INT_MEMBER(bidi_debug, 0, "Debug level for BiDi", this->params()),
111  INT_MEMBER(applybox_debug, 1, "Debug level", this->params()),
112  INT_MEMBER(applybox_page, 0, "Page number to apply boxes from",
113  this->params()),
114  STRING_MEMBER(applybox_exposure_pattern, ".exp",
115  "Exposure value follows"
116  " this pattern in the image filename. The name of the image"
117  " files are expected to be in the form"
118  " [lang].[fontname].exp[num].tif",
119  this->params()),
120  BOOL_MEMBER(applybox_learn_chars_and_char_frags_mode, false,
121  "Learn both character fragments (as is done in the"
122  " special low exposure mode) as well as unfragmented"
123  " characters.",
124  this->params()),
125  BOOL_MEMBER(applybox_learn_ngrams_mode, false,
126  "Each bounding box"
127  " is assumed to contain ngrams. Only learn the ngrams"
128  " whose outlines overlap horizontally.",
129  this->params()),
130  BOOL_MEMBER(tessedit_display_outwords, false, "Draw output words",
131  this->params()),
132  BOOL_MEMBER(tessedit_dump_choices, false, "Dump char choices",
133  this->params()),
134  BOOL_MEMBER(tessedit_timing_debug, false, "Print timing stats",
135  this->params()),
136  BOOL_MEMBER(tessedit_fix_fuzzy_spaces, true,
137  "Try to improve fuzzy spaces", this->params()),
138  BOOL_MEMBER(tessedit_unrej_any_wd, false,
139  "Don't bother with word plausibility", this->params()),
140  BOOL_MEMBER(tessedit_fix_hyphens, true, "Crunch double hyphens?",
141  this->params()),
142  BOOL_MEMBER(tessedit_enable_doc_dict, true,
143  "Add words to the document dictionary", this->params()),
144  BOOL_MEMBER(tessedit_debug_fonts, false, "Output font info per char",
145  this->params()),
146  BOOL_MEMBER(tessedit_debug_block_rejection, false, "Block and Row stats",
147  this->params()),
148  BOOL_MEMBER(tessedit_enable_bigram_correction, true,
149  "Enable correction based on the word bigram dictionary.",
150  this->params()),
151  BOOL_MEMBER(tessedit_enable_dict_correction, false,
152  "Enable single word correction based on the dictionary.",
153  this->params()),
154  INT_MEMBER(tessedit_bigram_debug, 0,
155  "Amount of debug output for bigram correction.",
156  this->params()),
157  BOOL_MEMBER(enable_noise_removal, true,
158  "Remove and conditionally reassign small outlines when they"
159  " confuse layout analysis, determining diacritics vs noise",
160  this->params()),
161  INT_MEMBER(debug_noise_removal, 0, "Debug reassignment of small outlines",
162  this->params()),
163  // Worst (min) certainty, for which a diacritic is allowed to make the
164  // base
165  // character worse and still be included.
166  double_MEMBER(noise_cert_basechar, -8.0,
167  "Hingepoint for base char certainty", this->params()),
168  // Worst (min) certainty, for which a non-overlapping diacritic is allowed
169  // to make the base character worse and still be included.
170  double_MEMBER(noise_cert_disjoint, -1.0,
171  "Hingepoint for disjoint certainty", this->params()),
172  // Worst (min) certainty, for which a diacritic is allowed to make a new
173  // stand-alone blob.
174  double_MEMBER(noise_cert_punc, -3.0,
175  "Threshold for new punc char certainty", this->params()),
176  // Factor of certainty margin for adding diacritics to not count as worse.
177  double_MEMBER(noise_cert_factor, 0.375,
178  "Scaling on certainty diff from Hingepoint",
179  this->params()),
180  INT_MEMBER(noise_maxperblob, 8, "Max diacritics to apply to a blob",
181  this->params()),
182  INT_MEMBER(noise_maxperword, 16, "Max diacritics to apply to a word",
183  this->params()),
184  INT_MEMBER(debug_x_ht_level, 0, "Reestimate debug", this->params()),
185  STRING_MEMBER(chs_leading_punct, "('`\"", "Leading punctuation",
186  this->params()),
187  STRING_MEMBER(chs_trailing_punct1, ").,;:?!", "1st Trailing punctuation",
188  this->params()),
189  STRING_MEMBER(chs_trailing_punct2, ")'`\"", "2nd Trailing punctuation",
190  this->params()),
191  double_MEMBER(quality_rej_pc, 0.08,
192  "good_quality_doc lte rejection limit", this->params()),
193  double_MEMBER(quality_blob_pc, 0.0,
194  "good_quality_doc gte good blobs limit", this->params()),
195  double_MEMBER(quality_outline_pc, 1.0,
196  "good_quality_doc lte outline error limit", this->params()),
197  double_MEMBER(quality_char_pc, 0.95,
198  "good_quality_doc gte good char limit", this->params()),
199  INT_MEMBER(quality_min_initial_alphas_reqd, 2, "alphas in a good word",
200  this->params()),
201  INT_MEMBER(tessedit_tess_adaption_mode, 0x27,
202  "Adaptation decision algorithm for tess", this->params()),
203  BOOL_MEMBER(tessedit_minimal_rej_pass1, false,
204  "Do minimal rejection on pass 1 output", this->params()),
205  BOOL_MEMBER(tessedit_test_adaption, false, "Test adaption criteria",
206  this->params()),
207  BOOL_MEMBER(test_pt, false, "Test for point", this->params()),
208  double_MEMBER(test_pt_x, 99999.99, "xcoord", this->params()),
209  double_MEMBER(test_pt_y, 99999.99, "ycoord", this->params()),
210  INT_MEMBER(multilang_debug_level, 0, "Print multilang debug info.",
211  this->params()),
212  INT_MEMBER(paragraph_debug_level, 0, "Print paragraph debug info.",
213  this->params()),
214  BOOL_MEMBER(paragraph_text_based, true,
215  "Run paragraph detection on the post-text-recognition "
216  "(more accurate)",
217  this->params()),
218  BOOL_MEMBER(lstm_use_matrix, 1,
219  "Use ratings matrix/beam search with lstm", this->params()),
220  STRING_MEMBER(outlines_odd, "%| ", "Non standard number of outlines",
221  this->params()),
222  STRING_MEMBER(outlines_2, "ij!?%\":;", "Non standard number of outlines",
223  this->params()),
224  BOOL_MEMBER(tessedit_good_quality_unrej, true,
225  "Reduce rejection on good docs", this->params()),
226  BOOL_MEMBER(tessedit_use_reject_spaces, true, "Reject spaces?",
227  this->params()),
228  double_MEMBER(tessedit_reject_doc_percent, 65.00,
229  "%rej allowed before rej whole doc", this->params()),
230  double_MEMBER(tessedit_reject_block_percent, 45.00,
231  "%rej allowed before rej whole block", this->params()),
232  double_MEMBER(tessedit_reject_row_percent, 40.00,
233  "%rej allowed before rej whole row", this->params()),
234  double_MEMBER(tessedit_whole_wd_rej_row_percent, 70.00,
235  "Number of row rejects in whole word rejects"
236  " which prevents whole row rejection",
237  this->params()),
238  BOOL_MEMBER(tessedit_preserve_blk_rej_perfect_wds, true,
239  "Only rej partially rejected words in block rejection",
240  this->params()),
241  BOOL_MEMBER(tessedit_preserve_row_rej_perfect_wds, true,
242  "Only rej partially rejected words in row rejection",
243  this->params()),
244  BOOL_MEMBER(tessedit_dont_blkrej_good_wds, false,
245  "Use word segmentation quality metric", this->params()),
246  BOOL_MEMBER(tessedit_dont_rowrej_good_wds, false,
247  "Use word segmentation quality metric", this->params()),
248  INT_MEMBER(tessedit_preserve_min_wd_len, 2,
249  "Only preserve wds longer than this", this->params()),
250  BOOL_MEMBER(tessedit_row_rej_good_docs, true,
251  "Apply row rejection to good docs", this->params()),
252  double_MEMBER(tessedit_good_doc_still_rowrej_wd, 1.1,
253  "rej good doc wd if more than this fraction rejected",
254  this->params()),
255  BOOL_MEMBER(tessedit_reject_bad_qual_wds, true,
256  "Reject all bad quality wds", this->params()),
257  BOOL_MEMBER(tessedit_debug_doc_rejection, false, "Page stats",
258  this->params()),
259  BOOL_MEMBER(tessedit_debug_quality_metrics, false,
260  "Output data to debug file", this->params()),
261  BOOL_MEMBER(bland_unrej, false, "unrej potential with no checks",
262  this->params()),
263  double_MEMBER(quality_rowrej_pc, 1.1,
264  "good_quality_doc gte good char limit", this->params()),
265  BOOL_MEMBER(unlv_tilde_crunching, false,
266  "Mark v.bad words for tilde crunch", this->params()),
267  BOOL_MEMBER(hocr_font_info, false, "Add font info to hocr output",
268  this->params()),
269  BOOL_MEMBER(hocr_char_boxes, false, "Add coordinates for each character to hocr output",
270  this->params()),
271  BOOL_MEMBER(crunch_early_merge_tess_fails, true, "Before word crunch?",
272  this->params()),
273  BOOL_MEMBER(crunch_early_convert_bad_unlv_chs, false,
274  "Take out ~^ early?", this->params()),
275  double_MEMBER(crunch_terrible_rating, 80.0, "crunch rating lt this",
276  this->params()),
277  BOOL_MEMBER(crunch_terrible_garbage, true, "As it says", this->params()),
278  double_MEMBER(crunch_poor_garbage_cert, -9.0,
279  "crunch garbage cert lt this", this->params()),
280  double_MEMBER(crunch_poor_garbage_rate, 60,
281  "crunch garbage rating lt this", this->params()),
282  double_MEMBER(crunch_pot_poor_rate, 40, "POTENTIAL crunch rating lt this",
283  this->params()),
284  double_MEMBER(crunch_pot_poor_cert, -8.0, "POTENTIAL crunch cert lt this",
285  this->params()),
286  double_MEMBER(crunch_del_rating, 60, "POTENTIAL crunch rating lt this",
287  this->params()),
288  double_MEMBER(crunch_del_cert, -10.0, "POTENTIAL crunch cert lt this",
289  this->params()),
290  double_MEMBER(crunch_del_min_ht, 0.7, "Del if word ht lt xht x this",
291  this->params()),
292  double_MEMBER(crunch_del_max_ht, 3.0, "Del if word ht gt xht x this",
293  this->params()),
294  double_MEMBER(crunch_del_min_width, 3.0,
295  "Del if word width lt xht x this", this->params()),
296  double_MEMBER(crunch_del_high_word, 1.5,
297  "Del if word gt xht x this above bl", this->params()),
298  double_MEMBER(crunch_del_low_word, 0.5,
299  "Del if word gt xht x this below bl", this->params()),
300  double_MEMBER(crunch_small_outlines_size, 0.6, "Small if lt xht x this",
301  this->params()),
302  INT_MEMBER(crunch_rating_max, 10, "For adj length in rating per ch",
303  this->params()),
304  INT_MEMBER(crunch_pot_indicators, 1,
305  "How many potential indicators needed", this->params()),
306  BOOL_MEMBER(crunch_leave_ok_strings, true, "Don't touch sensible strings",
307  this->params()),
308  BOOL_MEMBER(crunch_accept_ok, true, "Use acceptability in okstring",
309  this->params()),
310  BOOL_MEMBER(crunch_leave_accept_strings, false,
311  "Don't pot crunch sensible strings", this->params()),
312  BOOL_MEMBER(crunch_include_numerals, false, "Fiddle alpha figures",
313  this->params()),
314  INT_MEMBER(crunch_leave_lc_strings, 4,
315  "Don't crunch words with long lower case strings",
316  this->params()),
317  INT_MEMBER(crunch_leave_uc_strings, 4,
318  "Don't crunch words with long lower case strings",
319  this->params()),
320  INT_MEMBER(crunch_long_repetitions, 3,
321  "Crunch words with long repetitions", this->params()),
322  INT_MEMBER(crunch_debug, 0, "As it says", this->params()),
323  INT_MEMBER(fixsp_non_noise_limit, 1,
324  "How many non-noise blbs either side?", this->params()),
325  double_MEMBER(fixsp_small_outlines_size, 0.28, "Small if lt xht x this",
326  this->params()),
327  BOOL_MEMBER(tessedit_prefer_joined_punct, false,
328  "Reward punctuation joins", this->params()),
329  INT_MEMBER(fixsp_done_mode, 1, "What constitues done for spacing",
330  this->params()),
331  INT_MEMBER(debug_fix_space_level, 0, "Contextual fixspace debug",
332  this->params()),
333  STRING_MEMBER(numeric_punctuation, ".,",
334  "Punct. chs expected WITHIN numbers", this->params()),
335  INT_MEMBER(x_ht_acceptance_tolerance, 8,
336  "Max allowed deviation of blob top outside of font data",
337  this->params()),
338  INT_MEMBER(x_ht_min_change, 8,
339  "Min change in xht before actually trying it", this->params()),
340  INT_MEMBER(superscript_debug, 0,
341  "Debug level for sub & superscript fixer", this->params()),
343  superscript_worse_certainty, 2.0,
344  "How many times worse "
345  "certainty does a superscript position glyph need to be for "
346  "us to try classifying it as a char with a different "
347  "baseline?",
348  this->params()),
350  superscript_bettered_certainty, 0.97,
351  "What reduction in "
352  "badness do we think sufficient to choose a superscript "
353  "over what we'd thought. For example, a value of 0.6 means "
354  "we want to reduce badness of certainty by at least 40%",
355  this->params()),
356  double_MEMBER(superscript_scaledown_ratio, 0.4,
357  "A superscript scaled down more than this is unbelievably "
358  "small. For example, 0.3 means we expect the font size to "
359  "be no smaller than 30% of the text line font size.",
360  this->params()),
361  double_MEMBER(subscript_max_y_top, 0.5,
362  "Maximum top of a character measured as a multiple of "
363  "x-height above the baseline for us to reconsider whether "
364  "it's a subscript.",
365  this->params()),
366  double_MEMBER(superscript_min_y_bottom, 0.3,
367  "Minimum bottom of a character measured as a multiple of "
368  "x-height above the baseline for us to reconsider whether "
369  "it's a superscript.",
370  this->params()),
371  BOOL_MEMBER(tessedit_write_block_separators, false,
372  "Write block separators in output", this->params()),
373  BOOL_MEMBER(tessedit_write_rep_codes, false, "Write repetition char code",
374  this->params()),
375  BOOL_MEMBER(tessedit_write_unlv, false, "Write .unlv output file",
376  this->params()),
377  BOOL_MEMBER(tessedit_create_txt, false, "Write .txt output file",
378  this->params()),
379  BOOL_MEMBER(tessedit_create_hocr, false, "Write .html hOCR output file",
380  this->params()),
381  BOOL_MEMBER(tessedit_create_alto, false, "Write .xml ALTO file",
382  this->params()),
383  BOOL_MEMBER(tessedit_create_lstmbox, false, "Write .box file for LSTM training",
384  this->params()),
385  BOOL_MEMBER(tessedit_create_tsv, false, "Write .tsv output file",
386  this->params()),
387  BOOL_MEMBER(tessedit_create_wordstrbox, false, "Write WordStr format .box output file",
388  this->params()),
389  BOOL_MEMBER(tessedit_create_pdf, false, "Write .pdf output file",
390  this->params()),
391  BOOL_MEMBER(textonly_pdf, false,
392  "Create PDF with only one invisible text layer",
393  this->params()),
394  INT_MEMBER(jpg_quality, 85, "Set JPEG quality level", this->params()),
395  INT_MEMBER(user_defined_dpi, 0, "Specify DPI for input image",
396  this->params()),
397  INT_MEMBER(min_characters_to_try, 50,
398  "Specify minimum characters to try during OSD",
399  this->params()),
400  STRING_MEMBER(unrecognised_char, "|",
401  "Output char for unidentified blobs", this->params()),
402  INT_MEMBER(suspect_level, 99, "Suspect marker level", this->params()),
403  INT_MEMBER(suspect_short_words, 2,
404  "Don't suspect dict wds longer than this", this->params()),
405  BOOL_MEMBER(suspect_constrain_1Il, false, "UNLV keep 1Il chars rejected",
406  this->params()),
407  double_MEMBER(suspect_rating_per_ch, 999.9,
408  "Don't touch bad rating limit", this->params()),
409  double_MEMBER(suspect_accept_rating, -999.9, "Accept good rating limit",
410  this->params()),
411  BOOL_MEMBER(tessedit_minimal_rejection, false,
412  "Only reject tess failures", this->params()),
413  BOOL_MEMBER(tessedit_zero_rejection, false, "Don't reject ANYTHING",
414  this->params()),
415  BOOL_MEMBER(tessedit_word_for_word, false,
416  "Make output have exactly one word per WERD", this->params()),
417  BOOL_MEMBER(tessedit_zero_kelvin_rejection, false,
418  "Don't reject ANYTHING AT ALL", this->params()),
419  INT_MEMBER(tessedit_reject_mode, 0, "Rejection algorithm",
420  this->params()),
421  BOOL_MEMBER(tessedit_rejection_debug, false, "Adaption debug",
422  this->params()),
423  BOOL_MEMBER(tessedit_flip_0O, true, "Contextual 0O O0 flips",
424  this->params()),
425  double_MEMBER(tessedit_lower_flip_hyphen, 1.5,
426  "Aspect ratio dot/hyphen test", this->params()),
427  double_MEMBER(tessedit_upper_flip_hyphen, 1.8,
428  "Aspect ratio dot/hyphen test", this->params()),
429  BOOL_MEMBER(rej_trust_doc_dawg, false,
430  "Use DOC dawg in 11l conf. detector", this->params()),
431  BOOL_MEMBER(rej_1Il_use_dict_word, false, "Use dictword test",
432  this->params()),
433  BOOL_MEMBER(rej_1Il_trust_permuter_type, true, "Don't double check",
434  this->params()),
435  BOOL_MEMBER(rej_use_tess_accepted, true, "Individual rejection control",
436  this->params()),
437  BOOL_MEMBER(rej_use_tess_blanks, true, "Individual rejection control",
438  this->params()),
439  BOOL_MEMBER(rej_use_good_perm, true, "Individual rejection control",
440  this->params()),
441  BOOL_MEMBER(rej_use_sensible_wd, false, "Extend permuter check",
442  this->params()),
443  BOOL_MEMBER(rej_alphas_in_number_perm, false, "Extend permuter check",
444  this->params()),
445  double_MEMBER(rej_whole_of_mostly_reject_word_fract, 0.85,
446  "if >this fract", this->params()),
447  INT_MEMBER(tessedit_image_border, 2, "Rej blbs near image edge limit",
448  this->params()),
449  STRING_MEMBER(ok_repeated_ch_non_alphanum_wds, "-?*\075",
450  "Allow NN to unrej", this->params()),
451  STRING_MEMBER(conflict_set_I_l_1, "Il1[]", "Il1 conflict set",
452  this->params()),
453  INT_MEMBER(min_sane_x_ht_pixels, 8, "Reject any x-ht lt or eq than this",
454  this->params()),
455  BOOL_MEMBER(tessedit_create_boxfile, false, "Output text with boxes",
456  this->params()),
457  INT_MEMBER(tessedit_page_number, -1,
458  "-1 -> All pages, else specific page to process",
459  this->params()),
460  BOOL_MEMBER(tessedit_write_images, false,
461  "Capture the image from the IPE", this->params()),
462  BOOL_MEMBER(interactive_display_mode, false, "Run interactively?",
463  this->params()),
464  STRING_MEMBER(file_type, ".tif", "Filename extension", this->params()),
465  BOOL_MEMBER(tessedit_override_permuter, true, "According to dict_word",
466  this->params()),
467  STRING_MEMBER(tessedit_load_sublangs, "",
468  "List of languages to load with this one", this->params()),
469  BOOL_MEMBER(tessedit_use_primary_params_model, false,
470  "In multilingual mode use params model of the"
471  " primary language",
472  this->params()),
473  double_MEMBER(min_orientation_margin, 7.0,
474  "Min acceptable orientation margin", this->params()),
475  BOOL_MEMBER(textord_tabfind_show_vlines, false, "Debug line finding",
476  this->params()),
477  BOOL_MEMBER(textord_use_cjk_fp_model, false, "Use CJK fixed pitch model",
478  this->params()),
479  BOOL_MEMBER(poly_allow_detailed_fx, false,
480  "Allow feature extractors to see the original outline",
481  this->params()),
482  BOOL_INIT_MEMBER(tessedit_init_config_only, false,
483  "Only initialize with the config file. Useful if the "
484  "instance is not going to be used for OCR but say only "
485  "for layout analysis.",
486  this->params()),
487  BOOL_MEMBER(textord_equation_detect, false, "Turn on equation detector",
488  this->params()),
489  BOOL_MEMBER(textord_tabfind_vertical_text, true,
490  "Enable vertical detection", this->params()),
491  BOOL_MEMBER(textord_tabfind_force_vertical_text, false,
492  "Force using vertical text page mode", this->params()),
494  textord_tabfind_vertical_text_ratio, 0.5,
495  "Fraction of textlines deemed vertical to use vertical page "
496  "mode",
497  this->params()),
499  textord_tabfind_aligned_gap_fraction, 0.75,
500  "Fraction of height used as a minimum gap for aligned blobs.",
501  this->params()),
502  INT_MEMBER(tessedit_parallelize, 0, "Run in parallel where possible",
503  this->params()),
504  BOOL_MEMBER(preserve_interword_spaces, false,
505  "Preserve multiple interword spaces", this->params()),
506  STRING_MEMBER(page_separator, "\f",
507  "Page separator (default is form feed control character)",
508  this->params()),
509  INT_MEMBER(lstm_choice_mode, 0,
510  "Allows to include alternative symbols choices in the hOCR output. "
511  "Valid input values are 0, 1 and 2. 0 is the default value. "
512  "With 1 the alternative symbol choices per timestep are included. "
513  "With 2 alternative symbol choices are extracted from the CTC "
514  "process instead of the lattice. The choices are mapped per "
515  "character.",
516  this->params()),
517  INT_MEMBER(
518  lstm_choice_iterations, 5,
519  "Sets the number of cascading iterations for the Beamsearch in "
520  "lstm_choice_mode. Note that lstm_choice_mode must be set to a "
521  "value greater than 0 to produce results.",
522  this->params()),
524  lstm_rating_coefficient, 5,
525  "Sets the rating coefficient for the lstm choices. The smaller the "
526  "coefficient, the better are the ratings for each choice and less "
527  "information is lost due to the cut off at 0. The standard value is "
528  "5", this->params()),
529  BOOL_MEMBER(pageseg_apply_music_mask, true,
530  "Detect music staff and remove intersecting components", this->params()),
531 
532  backup_config_file_(nullptr),
533  pix_binary_(nullptr),
534  pix_grey_(nullptr),
535  pix_original_(nullptr),
536  pix_thresholds_(nullptr),
537  source_resolution_(0),
538  textord_(this),
539  right_to_left_(false),
540  scaled_color_(nullptr),
541  scaled_factor_(-1),
542  deskew_(1.0f, 0.0f),
543  reskew_(1.0f, 0.0f),
544  most_recently_used_(this),
545  font_table_size_(0),
546  equ_detect_(nullptr),
547 #ifndef ANDROID_BUILD
548  lstm_recognizer_(nullptr),
549 #endif
550  train_line_page_num_(0) {
551 }
552 
554  Clear();
555  pixDestroy(&pix_original_);
556  end_tesseract();
557  sub_langs_.delete_data_pointers();
558 #ifndef ANDROID_BUILD
559  delete lstm_recognizer_;
560  lstm_recognizer_ = nullptr;
561 #endif
562 }
563 
565  if (0 == Classify::getDict().NumDawgs() && AnyLSTMLang()) {
566  if (lstm_recognizer_ && lstm_recognizer_->GetDict()) {
567  return *lstm_recognizer_->GetDict();
568  }
569  }
570  return Classify::getDict();
571 }
572 
573 
575  STRING debug_name = imagebasename + "_debug.pdf";
576  pixa_debug_.WritePDF(debug_name.c_str());
577  pixDestroy(&pix_binary_);
578  pixDestroy(&pix_grey_);
579  pixDestroy(&pix_thresholds_);
580  pixDestroy(&scaled_color_);
581  deskew_ = FCOORD(1.0f, 0.0f);
582  reskew_ = FCOORD(1.0f, 0.0f);
583  splitter_.Clear();
584  scaled_factor_ = -1;
585  for (int i = 0; i < sub_langs_.size(); ++i)
586  sub_langs_[i]->Clear();
587 }
588 
589 #ifndef DISABLED_LEGACY_ENGINE
590 
592  equ_detect_ = detector;
593  equ_detect_->SetLangTesseract(this);
594 }
595 
596 // Clear all memory of adaption for this and all subclassifiers.
599  for (int i = 0; i < sub_langs_.size(); ++i) {
600  sub_langs_[i]->ResetAdaptiveClassifierInternal();
601  }
602 }
603 
604 #endif //ndef DISABLED_LEGACY_ENGINE
605 
606 // Clear the document dictionary for this and all subclassifiers.
609  for (int i = 0; i < sub_langs_.size(); ++i) {
610  sub_langs_[i]->getDict().ResetDocumentDictionary();
611  }
612 }
613 
615  // Set the white and blacklists (if any)
617  tessedit_char_whitelist.c_str(),
618  tessedit_char_unblacklist.c_str());
619  if (lstm_recognizer_) {
620  UNICHARSET& lstm_unicharset = lstm_recognizer_->GetUnicharset();
621  lstm_unicharset.set_black_and_whitelist(tessedit_char_blacklist.c_str(),
622  tessedit_char_whitelist.c_str(),
623  tessedit_char_unblacklist.c_str());
624  }
625  // Black and white lists should apply to all loaded classifiers.
626  for (int i = 0; i < sub_langs_.size(); ++i) {
627  sub_langs_[i]->unicharset.set_black_and_whitelist(
629  tessedit_char_unblacklist.c_str());
630  if (sub_langs_[i]->lstm_recognizer_) {
631  UNICHARSET& lstm_unicharset = sub_langs_[i]->lstm_recognizer_->GetUnicharset();
632  lstm_unicharset.set_black_and_whitelist(tessedit_char_blacklist.c_str(),
633  tessedit_char_whitelist.c_str(),
634  tessedit_char_unblacklist.c_str());
635  }
636  }
637 }
638 
639 // Perform steps to prepare underlying binary image/other data structures for
640 // page segmentation.
643  // Find the max splitter strategy over all langs.
644  auto max_pageseg_strategy =
645  static_cast<ShiroRekhaSplitter::SplitStrategy>(
646  static_cast<int32_t>(pageseg_devanagari_split_strategy));
647  for (int i = 0; i < sub_langs_.size(); ++i) {
648  auto pageseg_strategy =
649  static_cast<ShiroRekhaSplitter::SplitStrategy>(
650  static_cast<int32_t>(sub_langs_[i]->pageseg_devanagari_split_strategy));
651  if (pageseg_strategy > max_pageseg_strategy)
652  max_pageseg_strategy = pageseg_strategy;
653  pixDestroy(&sub_langs_[i]->pix_binary_);
654  sub_langs_[i]->pix_binary_ = pixClone(pix_binary());
655  }
656  // Perform shiro-rekha (top-line) splitting and replace the current image by
657  // the newly split image.
658  splitter_.set_orig_pix(pix_binary());
659  splitter_.set_pageseg_split_strategy(max_pageseg_strategy);
660  if (splitter_.Split(true, &pixa_debug_)) {
661  ASSERT_HOST(splitter_.splitted_image());
662  pixDestroy(&pix_binary_);
663  pix_binary_ = pixClone(splitter_.splitted_image());
664  }
665 }
666 
667 // Perform steps to prepare underlying binary image/other data structures for
668 // OCR. The current segmentation is required by this method.
669 // Note that this method resets pix_binary_ to the original binarized image,
670 // which may be different from the image actually used for OCR depending on the
671 // value of devanagari_ocr_split_strategy.
672 void Tesseract::PrepareForTessOCR(BLOCK_LIST* block_list,
673  Tesseract* osd_tess, OSResults* osr) {
674  // Find the max splitter strategy over all langs.
675  auto max_ocr_strategy =
676  static_cast<ShiroRekhaSplitter::SplitStrategy>(
677  static_cast<int32_t>(ocr_devanagari_split_strategy));
678  for (int i = 0; i < sub_langs_.size(); ++i) {
679  auto ocr_strategy =
680  static_cast<ShiroRekhaSplitter::SplitStrategy>(
681  static_cast<int32_t>(sub_langs_[i]->ocr_devanagari_split_strategy));
682  if (ocr_strategy > max_ocr_strategy)
683  max_ocr_strategy = ocr_strategy;
684  }
685  // Utilize the segmentation information available.
686  splitter_.set_segmentation_block_list(block_list);
687  splitter_.set_ocr_split_strategy(max_ocr_strategy);
688  // Run the splitter for OCR
689  bool split_for_ocr = splitter_.Split(false, &pixa_debug_);
690  // Restore pix_binary to the binarized original pix for future reference.
691  ASSERT_HOST(splitter_.orig_pix());
692  pixDestroy(&pix_binary_);
693  pix_binary_ = pixClone(splitter_.orig_pix());
694  // If the pageseg and ocr strategies are different, refresh the block list
695  // (from the last SegmentImage call) with blobs from the real image to be used
696  // for OCR.
697  if (splitter_.HasDifferentSplitStrategies()) {
698  BLOCK block("", true, 0, 0, 0, 0, pixGetWidth(pix_binary_),
699  pixGetHeight(pix_binary_));
700  Pix* pix_for_ocr = split_for_ocr ? splitter_.splitted_image() :
701  splitter_.orig_pix();
702  extract_edges(pix_for_ocr, &block);
703  splitter_.RefreshSegmentationWithNewBlobs(block.blob_list());
704  }
705  // The splitter isn't needed any more after this, so save memory by clearing.
706  splitter_.Clear();
707 }
708 
709 } // namespace tesseract
tesseract::ShiroRekhaSplitter::set_ocr_split_strategy
void set_ocr_split_strategy(SplitStrategy strategy)
Definition: devanagari_processing.h:138
tesseract::Tesseract::PrepareForTessOCR
void PrepareForTessOCR(BLOCK_LIST *block_list, Tesseract *osd_tess, OSResults *osr)
Definition: tesseractclass.cpp:672
tesseract::Textord::set_use_cjk_fp_model
void set_use_cjk_fp_model(bool flag)
Definition: textord.h:95
tesseract::ShiroRekhaSplitter::set_pageseg_split_strategy
void set_pageseg_split_strategy(SplitStrategy strategy)
Definition: devanagari_processing.h:146
tesseract::Tesseract::pageseg_devanagari_split_strategy
int pageseg_devanagari_split_strategy
Definition: tesseractclass.h:813
tesseract::Tesseract::ResetDocumentDictionary
void ResetDocumentDictionary()
Definition: tesseractclass.cpp:607
tesseract::ShiroRekhaSplitter::set_orig_pix
void set_orig_pix(Pix *pix)
Definition: devanagari_processing.cpp:68
tesseract::EquationDetect
Definition: equationdetect.h:38
tesseract::Tesseract::textord_use_cjk_fp_model
bool textord_use_cjk_fp_model
Definition: tesseractclass.h:1059
tesseractclass.h
ASSERT_HOST
#define ASSERT_HOST(x)
Definition: errcode.h:87
INT_MEMBER
#define INT_MEMBER(name, val, comment, vec)
Definition: params.h:312
tesseract::DebugPixa::WritePDF
void WritePDF(const char *filename)
Definition: debugpixa.h:36
tesseract::Tesseract::SetEquationDetect
void SetEquationDetect(EquationDetect *detector)
Definition: tesseractclass.cpp:591
tesseract::Tesseract
Definition: tesseractclass.h:172
OSResults
Definition: osdetect.h:50
tesseract::EquationDetect::SetLangTesseract
void SetLangTesseract(Tesseract *lang_tesseract)
Definition: equationdetect.cpp:123
STRING
Definition: strngs.h:45
tesseract::ShiroRekhaSplitter::Clear
void Clear()
Definition: devanagari_processing.cpp:56
tesseract::PSM_SINGLE_BLOCK
Assume a single uniform block of text. (Default.)
Definition: publictypes.h:168
tesseract::ShiroRekhaSplitter::set_segmentation_block_list
void set_segmentation_block_list(BLOCK_LIST *block_list)
Definition: devanagari_processing.h:104
tesseract::ShiroRekhaSplitter::splitted_image
Pix * splitted_image()
Definition: devanagari_processing.h:121
FCOORD
Definition: points.h:187
tesseract::LSTMRecognizer::GetUnicharset
const UNICHARSET & GetUnicharset() const
Definition: lstmrecognizer.h:132
tesseract::ShiroRekhaSplitter::Split
bool Split(bool split_for_pageseg, DebugPixa *pixa_debug)
Definition: devanagari_processing.cpp:80
tesseract::CCUtil::unicharset
UNICHARSET unicharset
Definition: ccutil.h:57
BOOL_INIT_MEMBER
#define BOOL_INIT_MEMBER(name, val, comment, vec)
Definition: params.h:327
tesseract::Classify::getDict
virtual Dict & getDict()
Definition: classify.h:107
INT_INIT_MEMBER
#define INT_INIT_MEMBER(name, val, comment, vec)
Definition: params.h:324
tesseract::ShiroRekhaSplitter::orig_pix
Pix * orig_pix()
Definition: devanagari_processing.h:130
extract_edges
void extract_edges(Pix *pix, BLOCK *block)
Definition: edgblob.cpp:329
BLOCK
Definition: ocrblock.h:28
STRING_MEMBER
#define STRING_MEMBER(name, val, comment, vec)
Definition: params.h:318
UNICHARSET::set_black_and_whitelist
void set_black_and_whitelist(const char *blacklist, const char *whitelist, const char *unblacklist)
Definition: unicharset.cpp:969
STRING::c_str
const char * c_str() const
Definition: strngs.cpp:192
tesseract::ShiroRekhaSplitter::RefreshSegmentationWithNewBlobs
void RefreshSegmentationWithNewBlobs(C_BLOB_LIST *new_blobs)
Definition: devanagari_processing.cpp:356
tesseract::Tesseract::tessedit_char_whitelist
char * tessedit_char_whitelist
Definition: tesseractclass.h:805
edgblob.h
tesseract::Tesseract::end_tesseract
void end_tesseract()
Definition: tessedit.cpp:482
equationdetect.h
tesseract::OEM_DEFAULT
Definition: publictypes.h:271
tesseract::Tesseract::PrepareForPageseg
void PrepareForPageseg()
Definition: tesseractclass.cpp:641
UNICHARSET
Definition: unicharset.h:145
tesseract::ShiroRekhaSplitter
Definition: devanagari_processing.h:71
double_MEMBER
#define double_MEMBER(name, val, comment, vec)
Definition: params.h:321
tesseract::Tesseract::getDict
Dict & getDict() override
Definition: tesseractclass.cpp:564
tesseract::ShiroRekhaSplitter::HasDifferentSplitStrategies
bool HasDifferentSplitStrategies() const
Definition: devanagari_processing.h:97
lstmrecognizer.h
tesseract::Tesseract::SetBlackAndWhitelist
void SetBlackAndWhitelist()
Definition: tesseractclass.cpp:614
tesseract::Tesseract::~Tesseract
~Tesseract() override
Definition: tesseractclass.cpp:553
tesseract
Definition: baseapi.h:65
tesseract::Tesseract::AnyLSTMLang
bool AnyLSTMLang() const
Definition: tesseractclass.h:293
tesseract::Tesseract::ocr_devanagari_split_strategy
int ocr_devanagari_split_strategy
Definition: tesseractclass.h:817
tesseract::Tesseract::tessedit_char_blacklist
char * tessedit_char_blacklist
Definition: tesseractclass.h:804
tesseract::Tesseract::Clear
void Clear()
Definition: tesseractclass.cpp:574
tesseract::Dict
Definition: dict.h:91
tesseract::Tesseract::Tesseract
Tesseract()
Definition: tesseractclass.cpp:52
tesseract::Tesseract::tessedit_char_unblacklist
char * tessedit_char_unblacklist
Definition: tesseractclass.h:807
tesseract::Tesseract::pix_binary
Pix * pix_binary() const
Definition: tesseractclass.h:200
BLOCK::blob_list
C_BLOB_LIST * blob_list()
get blobs
Definition: ocrblock.h:127
tesseract::LSTMRecognizer::GetDict
const Dict * GetDict() const
Definition: lstmrecognizer.h:137
tesseract::Classify::ResetAdaptiveClassifierInternal
void ResetAdaptiveClassifierInternal()
Definition: adaptmatch.cpp:598
tesseract::CCUtil::imagebasename
STRING imagebasename
Definition: ccutil.h:54
tesseract::Tesseract::ResetAdaptiveClassifier
void ResetAdaptiveClassifier()
Definition: tesseractclass.cpp:597
BOOL_MEMBER
#define BOOL_MEMBER(name, val, comment, vec)
Definition: params.h:315
tesseract::Dict::ResetDocumentDictionary
void ResetDocumentDictionary()
Definition: dict.h:326