tesseract  4.00.00dev
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 // Created: Fri Mar 07 08:17:01 PST 2008
23 //
24 // (C) Copyright 2008, Google Inc.
25 // Licensed under the Apache License, Version 2.0 (the "License");
26 // you may not use this file except in compliance with the License.
27 // You may obtain a copy of the License at
28 // http://www.apache.org/licenses/LICENSE-2.0
29 // Unless required by applicable law or agreed to in writing, software
30 // distributed under the License is distributed on an "AS IS" BASIS,
31 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
32 // See the License for the specific language governing permissions and
33 // limitations under the License.
34 //
36 
37 // Include automatically generated configuration file if running autoconf.
38 #ifdef HAVE_CONFIG_H
39 #include "config_auto.h"
40 #endif
41 
42 #include "tesseractclass.h"
43 
44 #include "allheaders.h"
45 #include "edgblob.h"
46 #include "equationdetect.h"
47 #include "globals.h"
48 #ifndef ANDROID_BUILD
49 #include "lstmrecognizer.h"
50 #endif
51 
52 namespace tesseract {
53 
55  : BOOL_MEMBER(tessedit_resegment_from_boxes, false,
56  "Take segmentation and labeling from box file",
57  this->params()),
58  BOOL_MEMBER(tessedit_resegment_from_line_boxes, false,
59  "Conversion of word/line box file to char box file",
60  this->params()),
61  BOOL_MEMBER(tessedit_train_from_boxes, false,
62  "Generate training data from boxed chars", this->params()),
63  BOOL_MEMBER(tessedit_make_boxes_from_boxes, false,
64  "Generate more boxes from boxed chars", this->params()),
65  BOOL_MEMBER(tessedit_train_line_recognizer, false,
66  "Break input into lines and remap boxes if present",
67  this->params()),
68  BOOL_MEMBER(tessedit_dump_pageseg_images, false,
69  "Dump intermediate images made during page segmentation",
70  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, 3=col, 4=block,"
76  " 5=line, 6=word, 7=char"
77  " (Values from PageSegMode enum in publictypes.h)",
78  this->params()),
79  INT_INIT_MEMBER(tessedit_ocr_engine_mode, tesseract::OEM_DEFAULT,
80  "Which OCR engine(s) to run (Tesseract, LSTM, both)."
81  " Defaults to loading and running the most accurate"
82  " available.",
83  this->params()),
84  STRING_MEMBER(tessedit_char_blacklist, "",
85  "Blacklist of chars not to recognize", this->params()),
86  STRING_MEMBER(tessedit_char_whitelist, "",
87  "Whitelist of chars to recognize", this->params()),
88  STRING_MEMBER(tessedit_char_unblacklist, "",
89  "List of chars to override tessedit_char_blacklist",
90  this->params()),
91  BOOL_MEMBER(tessedit_ambigs_training, false,
92  "Perform training for ambiguities", this->params()),
93  INT_MEMBER(pageseg_devanagari_split_strategy,
94  tesseract::ShiroRekhaSplitter::NO_SPLIT,
95  "Whether to use the top-line splitting process for Devanagari "
96  "documents while performing page-segmentation.",
97  this->params()),
98  INT_MEMBER(ocr_devanagari_split_strategy,
99  tesseract::ShiroRekhaSplitter::NO_SPLIT,
100  "Whether to use the top-line splitting process for Devanagari "
101  "documents while performing ocr.",
102  this->params()),
103  STRING_MEMBER(tessedit_write_params_to_file, "",
104  "Write all parameters to the given file.", this->params()),
105  BOOL_MEMBER(tessedit_adaption_debug, false,
106  "Generate and print debug"
107  " information for adaption",
108  this->params()),
109  INT_MEMBER(bidi_debug, 0, "Debug level for BiDi", this->params()),
110  INT_MEMBER(applybox_debug, 1, "Debug level", this->params()),
111  INT_MEMBER(applybox_page, 0, "Page number to apply boxes from",
112  this->params()),
113  STRING_MEMBER(applybox_exposure_pattern, ".exp",
114  "Exposure value follows"
115  " this pattern in the image filename. The name of the image"
116  " files are expected to be in the form"
117  " [lang].[fontname].exp[num].tif",
118  this->params()),
119  BOOL_MEMBER(applybox_learn_chars_and_char_frags_mode, false,
120  "Learn both character fragments (as is done in the"
121  " special low exposure mode) as well as unfragmented"
122  " characters.",
123  this->params()),
124  BOOL_MEMBER(applybox_learn_ngrams_mode, false,
125  "Each bounding box"
126  " is assumed to contain ngrams. Only learn the ngrams"
127  " whose outlines overlap horizontally.",
128  this->params()),
129  BOOL_MEMBER(tessedit_display_outwords, false, "Draw output words",
130  this->params()),
131  BOOL_MEMBER(tessedit_dump_choices, false, "Dump char choices",
132  this->params()),
133  BOOL_MEMBER(tessedit_timing_debug, false, "Print timing stats",
134  this->params()),
135  BOOL_MEMBER(tessedit_fix_fuzzy_spaces, true,
136  "Try to improve fuzzy spaces", this->params()),
137  BOOL_MEMBER(tessedit_unrej_any_wd, false,
138  "Don't bother with word plausibility", this->params()),
139  BOOL_MEMBER(tessedit_fix_hyphens, true, "Crunch double hyphens?",
140  this->params()),
141  BOOL_MEMBER(tessedit_redo_xheight, true, "Check/Correct x-height",
142  this->params()),
143  BOOL_MEMBER(tessedit_enable_doc_dict, true,
144  "Add words to the document dictionary", this->params()),
145  BOOL_MEMBER(tessedit_debug_fonts, false, "Output font info per char",
146  this->params()),
147  BOOL_MEMBER(tessedit_debug_block_rejection, false, "Block and Row stats",
148  this->params()),
149  BOOL_MEMBER(tessedit_enable_bigram_correction, true,
150  "Enable correction based on the word bigram dictionary.",
151  this->params()),
152  BOOL_MEMBER(tessedit_enable_dict_correction, false,
153  "Enable single word correction based on the dictionary.",
154  this->params()),
155  INT_MEMBER(tessedit_bigram_debug, 0,
156  "Amount of debug output for bigram correction.",
157  this->params()),
158  BOOL_MEMBER(enable_noise_removal, true,
159  "Remove and conditionally reassign small outlines when they"
160  " confuse layout analysis, determining diacritics vs noise",
161  this->params()),
162  INT_MEMBER(debug_noise_removal, 0, "Debug reassignment of small outlines",
163  this->params()),
164  // Worst (min) certainty, for which a diacritic is allowed to make the
165  // base
166  // character worse and still be included.
167  double_MEMBER(noise_cert_basechar, -8.0,
168  "Hingepoint for base char certainty", this->params()),
169  // Worst (min) certainty, for which a non-overlapping diacritic is allowed
170  // to make the base character worse and still be included.
171  double_MEMBER(noise_cert_disjoint, -1.0,
172  "Hingepoint for disjoint certainty", this->params()),
173  // Worst (min) certainty, for which a diacritic is allowed to make a new
174  // stand-alone blob.
175  double_MEMBER(noise_cert_punc, -3.0,
176  "Threshold for new punc char certainty", this->params()),
177  // Factor of certainty margin for adding diacritics to not count as worse.
178  double_MEMBER(noise_cert_factor, 0.375,
179  "Scaling on certainty diff from Hingepoint",
180  this->params()),
181  INT_MEMBER(noise_maxperblob, 8, "Max diacritics to apply to a blob",
182  this->params()),
183  INT_MEMBER(noise_maxperword, 16, "Max diacritics to apply to a word",
184  this->params()),
185  INT_MEMBER(debug_x_ht_level, 0, "Reestimate debug", this->params()),
186  BOOL_MEMBER(debug_acceptable_wds, false, "Dump word pass/fail chk",
187  this->params()),
188  STRING_MEMBER(chs_leading_punct, "('`\"", "Leading punctuation",
189  this->params()),
190  STRING_MEMBER(chs_trailing_punct1, ").,;:?!", "1st Trailing punctuation",
191  this->params()),
192  STRING_MEMBER(chs_trailing_punct2, ")'`\"", "2nd Trailing punctuation",
193  this->params()),
194  double_MEMBER(quality_rej_pc, 0.08,
195  "good_quality_doc lte rejection limit", this->params()),
196  double_MEMBER(quality_blob_pc, 0.0,
197  "good_quality_doc gte good blobs limit", this->params()),
198  double_MEMBER(quality_outline_pc, 1.0,
199  "good_quality_doc lte outline error limit", this->params()),
200  double_MEMBER(quality_char_pc, 0.95,
201  "good_quality_doc gte good char limit", this->params()),
202  INT_MEMBER(quality_min_initial_alphas_reqd, 2, "alphas in a good word",
203  this->params()),
204  INT_MEMBER(tessedit_tess_adaption_mode, 0x27,
205  "Adaptation decision algorithm for tess", this->params()),
206  BOOL_MEMBER(tessedit_minimal_rej_pass1, false,
207  "Do minimal rejection on pass 1 output", this->params()),
208  BOOL_MEMBER(tessedit_test_adaption, false, "Test adaption criteria",
209  this->params()),
210  BOOL_MEMBER(tessedit_matcher_log, false, "Log matcher activity",
211  this->params()),
212  INT_MEMBER(tessedit_test_adaption_mode, 3,
213  "Adaptation decision algorithm for tess", this->params()),
214  BOOL_MEMBER(test_pt, false, "Test for point", this->params()),
215  double_MEMBER(test_pt_x, 99999.99, "xcoord", this->params()),
216  double_MEMBER(test_pt_y, 99999.99, "ycoord", this->params()),
217  INT_MEMBER(multilang_debug_level, 0, "Print multilang debug info.",
218  this->params()),
219  INT_MEMBER(paragraph_debug_level, 0, "Print paragraph debug info.",
220  this->params()),
221  BOOL_MEMBER(paragraph_text_based, true,
222  "Run paragraph detection on the post-text-recognition "
223  "(more accurate)",
224  this->params()),
225  BOOL_MEMBER(lstm_use_matrix, 1,
226  "Use ratings matrix/beam search with lstm", this->params()),
227  STRING_MEMBER(outlines_odd, "%| ", "Non standard number of outlines",
228  this->params()),
229  STRING_MEMBER(outlines_2, "ij!?%\":;", "Non standard number of outlines",
230  this->params()),
231  BOOL_MEMBER(docqual_excuse_outline_errs, false,
232  "Allow outline errs in unrejection?", this->params()),
233  BOOL_MEMBER(tessedit_good_quality_unrej, true,
234  "Reduce rejection on good docs", this->params()),
235  BOOL_MEMBER(tessedit_use_reject_spaces, true, "Reject spaces?",
236  this->params()),
237  double_MEMBER(tessedit_reject_doc_percent, 65.00,
238  "%rej allowed before rej whole doc", this->params()),
239  double_MEMBER(tessedit_reject_block_percent, 45.00,
240  "%rej allowed before rej whole block", this->params()),
241  double_MEMBER(tessedit_reject_row_percent, 40.00,
242  "%rej allowed before rej whole row", this->params()),
243  double_MEMBER(tessedit_whole_wd_rej_row_percent, 70.00,
244  "Number of row rejects in whole word rejects"
245  " which prevents whole row rejection",
246  this->params()),
247  BOOL_MEMBER(tessedit_preserve_blk_rej_perfect_wds, true,
248  "Only rej partially rejected words in block rejection",
249  this->params()),
250  BOOL_MEMBER(tessedit_preserve_row_rej_perfect_wds, true,
251  "Only rej partially rejected words in row rejection",
252  this->params()),
253  BOOL_MEMBER(tessedit_dont_blkrej_good_wds, false,
254  "Use word segmentation quality metric", this->params()),
255  BOOL_MEMBER(tessedit_dont_rowrej_good_wds, false,
256  "Use word segmentation quality metric", this->params()),
257  INT_MEMBER(tessedit_preserve_min_wd_len, 2,
258  "Only preserve wds longer than this", this->params()),
259  BOOL_MEMBER(tessedit_row_rej_good_docs, true,
260  "Apply row rejection to good docs", this->params()),
261  double_MEMBER(tessedit_good_doc_still_rowrej_wd, 1.1,
262  "rej good doc wd if more than this fraction rejected",
263  this->params()),
264  BOOL_MEMBER(tessedit_reject_bad_qual_wds, true,
265  "Reject all bad quality wds", this->params()),
266  BOOL_MEMBER(tessedit_debug_doc_rejection, false, "Page stats",
267  this->params()),
268  BOOL_MEMBER(tessedit_debug_quality_metrics, false,
269  "Output data to debug file", this->params()),
270  BOOL_MEMBER(bland_unrej, false, "unrej potential with no checks",
271  this->params()),
272  double_MEMBER(quality_rowrej_pc, 1.1,
273  "good_quality_doc gte good char limit", this->params()),
274  BOOL_MEMBER(unlv_tilde_crunching, true,
275  "Mark v.bad words for tilde crunch", this->params()),
276  BOOL_MEMBER(hocr_font_info, false, "Add font info to hocr output",
277  this->params()),
278  BOOL_MEMBER(crunch_early_merge_tess_fails, true, "Before word crunch?",
279  this->params()),
280  BOOL_MEMBER(crunch_early_convert_bad_unlv_chs, false,
281  "Take out ~^ early?", this->params()),
282  double_MEMBER(crunch_terrible_rating, 80.0, "crunch rating lt this",
283  this->params()),
284  BOOL_MEMBER(crunch_terrible_garbage, true, "As it says", this->params()),
285  double_MEMBER(crunch_poor_garbage_cert, -9.0,
286  "crunch garbage cert lt this", this->params()),
287  double_MEMBER(crunch_poor_garbage_rate, 60,
288  "crunch garbage rating lt this", this->params()),
289  double_MEMBER(crunch_pot_poor_rate, 40, "POTENTIAL crunch rating lt this",
290  this->params()),
291  double_MEMBER(crunch_pot_poor_cert, -8.0, "POTENTIAL crunch cert lt this",
292  this->params()),
293  BOOL_MEMBER(crunch_pot_garbage, true, "POTENTIAL crunch garbage",
294  this->params()),
295  double_MEMBER(crunch_del_rating, 60, "POTENTIAL crunch rating lt this",
296  this->params()),
297  double_MEMBER(crunch_del_cert, -10.0, "POTENTIAL crunch cert lt this",
298  this->params()),
299  double_MEMBER(crunch_del_min_ht, 0.7, "Del if word ht lt xht x this",
300  this->params()),
301  double_MEMBER(crunch_del_max_ht, 3.0, "Del if word ht gt xht x this",
302  this->params()),
303  double_MEMBER(crunch_del_min_width, 3.0,
304  "Del if word width lt xht x this", this->params()),
305  double_MEMBER(crunch_del_high_word, 1.5,
306  "Del if word gt xht x this above bl", this->params()),
307  double_MEMBER(crunch_del_low_word, 0.5,
308  "Del if word gt xht x this below bl", this->params()),
309  double_MEMBER(crunch_small_outlines_size, 0.6, "Small if lt xht x this",
310  this->params()),
311  INT_MEMBER(crunch_rating_max, 10, "For adj length in rating per ch",
312  this->params()),
313  INT_MEMBER(crunch_pot_indicators, 1,
314  "How many potential indicators needed", this->params()),
315  BOOL_MEMBER(crunch_leave_ok_strings, true, "Don't touch sensible strings",
316  this->params()),
317  BOOL_MEMBER(crunch_accept_ok, true, "Use acceptability in okstring",
318  this->params()),
319  BOOL_MEMBER(crunch_leave_accept_strings, false,
320  "Don't pot crunch sensible strings", this->params()),
321  BOOL_MEMBER(crunch_include_numerals, false, "Fiddle alpha figures",
322  this->params()),
323  INT_MEMBER(crunch_leave_lc_strings, 4,
324  "Don't crunch words with long lower case strings",
325  this->params()),
326  INT_MEMBER(crunch_leave_uc_strings, 4,
327  "Don't crunch words with long lower case strings",
328  this->params()),
329  INT_MEMBER(crunch_long_repetitions, 3,
330  "Crunch words with long repetitions", this->params()),
331  INT_MEMBER(crunch_debug, 0, "As it says", this->params()),
332  INT_MEMBER(fixsp_non_noise_limit, 1,
333  "How many non-noise blbs either side?", this->params()),
334  double_MEMBER(fixsp_small_outlines_size, 0.28, "Small if lt xht x this",
335  this->params()),
336  BOOL_MEMBER(tessedit_prefer_joined_punct, false,
337  "Reward punctation joins", this->params()),
338  INT_MEMBER(fixsp_done_mode, 1, "What constitues done for spacing",
339  this->params()),
340  INT_MEMBER(debug_fix_space_level, 0, "Contextual fixspace debug",
341  this->params()),
342  STRING_MEMBER(numeric_punctuation, ".,",
343  "Punct. chs expected WITHIN numbers", this->params()),
344  INT_MEMBER(x_ht_acceptance_tolerance, 8,
345  "Max allowed deviation of blob top outside of font data",
346  this->params()),
347  INT_MEMBER(x_ht_min_change, 8,
348  "Min change in xht before actually trying it", this->params()),
349  INT_MEMBER(superscript_debug, 0,
350  "Debug level for sub & superscript fixer", this->params()),
352  superscript_worse_certainty, 2.0,
353  "How many times worse "
354  "certainty does a superscript position glyph need to be for "
355  "us to try classifying it as a char with a different "
356  "baseline?",
357  this->params()),
359  superscript_bettered_certainty, 0.97,
360  "What reduction in "
361  "badness do we think sufficient to choose a superscript "
362  "over what we'd thought. For example, a value of 0.6 means "
363  "we want to reduce badness of certainty by at least 40%",
364  this->params()),
365  double_MEMBER(superscript_scaledown_ratio, 0.4,
366  "A superscript scaled down more than this is unbelievably "
367  "small. For example, 0.3 means we expect the font size to "
368  "be no smaller than 30% of the text line font size.",
369  this->params()),
370  double_MEMBER(subscript_max_y_top, 0.5,
371  "Maximum top of a character measured as a multiple of "
372  "x-height above the baseline for us to reconsider whether "
373  "it's a subscript.",
374  this->params()),
375  double_MEMBER(superscript_min_y_bottom, 0.3,
376  "Minimum bottom of a character measured as a multiple of "
377  "x-height above the baseline for us to reconsider whether "
378  "it's a superscript.",
379  this->params()),
380  BOOL_MEMBER(tessedit_write_block_separators, false,
381  "Write block separators in output", this->params()),
382  BOOL_MEMBER(tessedit_write_rep_codes, false, "Write repetition char code",
383  this->params()),
384  BOOL_MEMBER(tessedit_write_unlv, false, "Write .unlv output file",
385  this->params()),
386  BOOL_MEMBER(tessedit_create_txt, false, "Write .txt output file",
387  this->params()),
388  BOOL_MEMBER(tessedit_create_hocr, false, "Write .html hOCR output file",
389  this->params()),
390  BOOL_MEMBER(tessedit_create_tsv, false, "Write .tsv output file",
391  this->params()),
392  BOOL_MEMBER(tessedit_create_pdf, false, "Write .pdf output file",
393  this->params()),
394  BOOL_MEMBER(textonly_pdf, false,
395  "Create PDF with only one invisible text layer",
396  this->params()),
397  STRING_MEMBER(unrecognised_char, "|",
398  "Output char for unidentified blobs", this->params()),
399  INT_MEMBER(suspect_level, 99, "Suspect marker level", this->params()),
400  INT_MEMBER(suspect_space_level, 100,
401  "Min suspect level for rejecting spaces", this->params()),
402  INT_MEMBER(suspect_short_words, 2,
403  "Don't suspect dict wds longer than this", this->params()),
404  BOOL_MEMBER(suspect_constrain_1Il, false, "UNLV keep 1Il chars rejected",
405  this->params()),
406  double_MEMBER(suspect_rating_per_ch, 999.9,
407  "Don't touch bad rating limit", this->params()),
408  double_MEMBER(suspect_accept_rating, -999.9, "Accept good rating limit",
409  this->params()),
410  BOOL_MEMBER(tessedit_minimal_rejection, false,
411  "Only reject tess failures", this->params()),
412  BOOL_MEMBER(tessedit_zero_rejection, false, "Don't reject ANYTHING",
413  this->params()),
414  BOOL_MEMBER(tessedit_word_for_word, false,
415  "Make output have exactly one word per WERD", this->params()),
416  BOOL_MEMBER(tessedit_zero_kelvin_rejection, false,
417  "Don't reject ANYTHING AT ALL", this->params()),
418  BOOL_MEMBER(tessedit_consistent_reps, true,
419  "Force all rep chars the same", this->params()),
420  INT_MEMBER(tessedit_reject_mode, 0, "Rejection algorithm",
421  this->params()),
422  BOOL_MEMBER(tessedit_rejection_debug, false, "Adaption debug",
423  this->params()),
424  BOOL_MEMBER(tessedit_flip_0O, true, "Contextual 0O O0 flips",
425  this->params()),
426  double_MEMBER(tessedit_lower_flip_hyphen, 1.5,
427  "Aspect ratio dot/hyphen test", this->params()),
428  double_MEMBER(tessedit_upper_flip_hyphen, 1.8,
429  "Aspect ratio dot/hyphen test", this->params()),
430  BOOL_MEMBER(rej_trust_doc_dawg, false,
431  "Use DOC dawg in 11l conf. detector", this->params()),
432  BOOL_MEMBER(rej_1Il_use_dict_word, false, "Use dictword test",
433  this->params()),
434  BOOL_MEMBER(rej_1Il_trust_permuter_type, true, "Don't double check",
435  this->params()),
436  BOOL_MEMBER(rej_use_tess_accepted, true, "Individual rejection control",
437  this->params()),
438  BOOL_MEMBER(rej_use_tess_blanks, true, "Individual rejection control",
439  this->params()),
440  BOOL_MEMBER(rej_use_good_perm, true, "Individual rejection control",
441  this->params()),
442  BOOL_MEMBER(rej_use_sensible_wd, false, "Extend permuter check",
443  this->params()),
444  BOOL_MEMBER(rej_alphas_in_number_perm, false, "Extend permuter check",
445  this->params()),
446  double_MEMBER(rej_whole_of_mostly_reject_word_fract, 0.85,
447  "if >this fract", this->params()),
448  INT_MEMBER(tessedit_image_border, 2, "Rej blbs near image edge limit",
449  this->params()),
450  STRING_MEMBER(ok_repeated_ch_non_alphanum_wds, "-?*\075",
451  "Allow NN to unrej", this->params()),
452  STRING_MEMBER(conflict_set_I_l_1, "Il1[]", "Il1 conflict set",
453  this->params()),
454  INT_MEMBER(min_sane_x_ht_pixels, 8, "Reject any x-ht lt or eq than this",
455  this->params()),
456  BOOL_MEMBER(tessedit_create_boxfile, false, "Output text with boxes",
457  this->params()),
458  INT_MEMBER(tessedit_page_number, -1,
459  "-1 -> All pages"
460  " , else specific page to process",
461  this->params()),
462  BOOL_MEMBER(tessedit_write_images, false,
463  "Capture the image from the IPE", this->params()),
464  BOOL_MEMBER(interactive_display_mode, false, "Run interactively?",
465  this->params()),
466  STRING_MEMBER(file_type, ".tif", "Filename extension", this->params()),
467  BOOL_MEMBER(tessedit_override_permuter, true, "According to dict_word",
468  this->params()),
469  STRING_MEMBER(tessedit_load_sublangs, "",
470  "List of languages to load with this one", this->params()),
471  BOOL_MEMBER(tessedit_use_primary_params_model, false,
472  "In multilingual mode use params model of the"
473  " primary language",
474  this->params()),
475  double_MEMBER(min_orientation_margin, 7.0,
476  "Min acceptable orientation margin", this->params()),
477  BOOL_MEMBER(textord_tabfind_show_vlines, false, "Debug line finding",
478  this->params()),
479  BOOL_MEMBER(textord_use_cjk_fp_model, FALSE, "Use CJK fixed pitch model",
480  this->params()),
481  BOOL_MEMBER(poly_allow_detailed_fx, false,
482  "Allow feature extractors to see the original outline",
483  this->params()),
484  BOOL_INIT_MEMBER(tessedit_init_config_only, false,
485  "Only initialize with the config file. Useful if the "
486  "instance is not going to be used for OCR but say only "
487  "for layout analysis.",
488  this->params()),
489  BOOL_MEMBER(textord_equation_detect, false, "Turn on equation detector",
490  this->params()),
491  BOOL_MEMBER(textord_tabfind_vertical_text, true,
492  "Enable vertical detection", this->params()),
493  BOOL_MEMBER(textord_tabfind_force_vertical_text, false,
494  "Force using vertical text page mode", this->params()),
496  textord_tabfind_vertical_text_ratio, 0.5,
497  "Fraction of textlines deemed vertical to use vertical page "
498  "mode",
499  this->params()),
501  textord_tabfind_aligned_gap_fraction, 0.75,
502  "Fraction of height used as a minimum gap for aligned blobs.",
503  this->params()),
504  INT_MEMBER(tessedit_parallelize, 0, "Run in parallel where possible",
505  this->params()),
506  BOOL_MEMBER(preserve_interword_spaces, false,
507  "Preserve multiple interword spaces", this->params()),
508  STRING_MEMBER(page_separator, "\f",
509  "Page separator (default is form feed control character)",
510  this->params()),
511 
512  // The following parameters were deprecated and removed from their
513  // original
514  // locations. The parameters are temporarily kept here to give Tesseract
515  // users a chance to updated their [lang].traineddata and config files
516  // without introducing failures during Tesseract initialization.
517  // TODO(ocr-team): remove these parameters from the code once we are
518  // reasonably sure that Tesseract users have updated their data files.
519  //
520  // BEGIN DEPRECATED PARAMETERS
521  BOOL_MEMBER(textord_tabfind_vertical_horizontal_mix, true,
522  "find horizontal lines such as headers in vertical page mode",
523  this->params()),
524  INT_MEMBER(tessedit_ok_mode, 5, "Acceptance decision algorithm",
525  this->params()),
526  BOOL_INIT_MEMBER(load_fixed_length_dawgs, true,
527  "Load fixed length dawgs"
528  " (e.g. for non-space delimited languages)",
529  this->params()),
530  INT_MEMBER(segment_debug, 0, "Debug the whole segmentation process",
531  this->params()),
532  BOOL_MEMBER(permute_debug, 0, "Debug char permutation process",
533  this->params()),
534  double_MEMBER(bestrate_pruning_factor, 2.0,
535  "Multiplying factor of"
536  " current best rate to prune other hypotheses",
537  this->params()),
538  BOOL_MEMBER(permute_script_word, 0,
539  "Turn on word script consistency permuter", this->params()),
540  BOOL_MEMBER(segment_segcost_rating, 0,
541  "incorporate segmentation cost in word rating?",
542  this->params()),
543  double_MEMBER(segment_reward_script, 0.95,
544  "Score multipler for script consistency within a word. "
545  "Being a 'reward' factor, it should be <= 1. "
546  "Smaller value implies bigger reward.",
547  this->params()),
548  BOOL_MEMBER(permute_fixed_length_dawg, 0,
549  "Turn on fixed-length phrasebook search permuter",
550  this->params()),
551  BOOL_MEMBER(permute_chartype_word, 0,
552  "Turn on character type (property) consistency permuter",
553  this->params()),
554  double_MEMBER(segment_reward_chartype, 0.97,
555  "Score multipler for char type consistency within a word. ",
556  this->params()),
557  double_MEMBER(segment_reward_ngram_best_choice, 0.99,
558  "Score multipler for ngram permuter's best choice"
559  " (only used in the Han script path).",
560  this->params()),
561  BOOL_MEMBER(ngram_permuter_activated, false,
562  "Activate character-level n-gram-based permuter",
563  this->params()),
564  BOOL_MEMBER(permute_only_top, false, "Run only the top choice permuter",
565  this->params()),
566  INT_MEMBER(language_model_fixed_length_choices_depth, 3,
567  "Depth of blob choice lists to explore"
568  " when fixed length dawgs are on",
569  this->params()),
570  BOOL_MEMBER(use_new_state_cost, FALSE,
571  "use new state cost heuristics for segmentation state"
572  " evaluation",
573  this->params()),
574  double_MEMBER(heuristic_segcost_rating_base, 1.25,
575  "Base factor for adding segmentation cost into word rating."
576  " It's a multiplying factor, the larger the value above 1,"
577  " the bigger the effect of segmentation cost.",
578  this->params()),
579  double_MEMBER(heuristic_weight_rating, 1.0,
580  "weight associated with char rating in combined cost of"
581  " state",
582  this->params()),
583  double_MEMBER(heuristic_weight_width, 1000.0,
584  "weight associated with width evidence in combined cost of"
585  " state",
586  this->params()),
587  double_MEMBER(heuristic_weight_seamcut, 0.0,
588  "weight associated with seam cut in combined cost of state",
589  this->params()),
590  double_MEMBER(heuristic_max_char_wh_ratio, 2.0,
591  "max char width-to-height ratio allowed in segmentation",
592  this->params()),
593  BOOL_MEMBER(enable_new_segsearch, true,
594  "Enable new segmentation search path.", this->params()),
595  double_MEMBER(segsearch_max_fixed_pitch_char_wh_ratio, 2.0,
596  "Maximum character width-to-height ratio for"
597  " fixed-pitch fonts",
598  this->params()),
599  // END DEPRECATED PARAMETERS
600 
601  backup_config_file_(NULL),
602  pix_binary_(NULL),
603  pix_grey_(NULL),
604  pix_original_(NULL),
605  pix_thresholds_(NULL),
606  source_resolution_(0),
607  textord_(this),
608  right_to_left_(false),
609  scaled_color_(NULL),
610  scaled_factor_(-1),
611  deskew_(1.0f, 0.0f),
612  reskew_(1.0f, 0.0f),
613  most_recently_used_(this),
614  font_table_size_(0),
615  equ_detect_(NULL),
616 #ifndef ANDROID_BUILD
617  lstm_recognizer_(NULL),
618 #endif
619  train_line_page_num_(0) {
620 }
621 
623  Clear();
624  pixDestroy(&pix_original_);
625  end_tesseract();
626  sub_langs_.delete_data_pointers();
627 #ifndef ANDROID_BUILD
628  delete lstm_recognizer_;
629  lstm_recognizer_ = NULL;
630 #endif
631 }
632 
634 {
635  if (0 == Classify::getDict().NumDawgs() && AnyLSTMLang())
636  {
637  if (lstm_recognizer_ && lstm_recognizer_->GetDict())
638  {
639  return *const_cast<Dict*>(lstm_recognizer_->GetDict());
640  }
641  }
642  return Classify::getDict();
643  }
644 
645 
647  STRING debug_name = imagebasename + "_debug.pdf";
648  pixa_debug_.WritePDF(debug_name.string());
649  pixDestroy(&pix_binary_);
650  pixDestroy(&pix_grey_);
651  pixDestroy(&pix_thresholds_);
652  pixDestroy(&scaled_color_);
653  deskew_ = FCOORD(1.0f, 0.0f);
654  reskew_ = FCOORD(1.0f, 0.0f);
655  splitter_.Clear();
656  scaled_factor_ = -1;
657  for (int i = 0; i < sub_langs_.size(); ++i)
658  sub_langs_[i]->Clear();
659 }
660 
662  equ_detect_ = detector;
663  equ_detect_->SetLangTesseract(this);
664 }
665 
666 // Clear all memory of adaption for this and all subclassifiers.
669  for (int i = 0; i < sub_langs_.size(); ++i) {
670  sub_langs_[i]->ResetAdaptiveClassifierInternal();
671  }
672 }
673 
674 // Clear the document dictionary for this and all subclassifiers.
677  for (int i = 0; i < sub_langs_.size(); ++i) {
678  sub_langs_[i]->getDict().ResetDocumentDictionary();
679  }
680 }
681 
683  // Set the white and blacklists (if any)
685  tessedit_char_whitelist.string(),
686  tessedit_char_unblacklist.string());
687  // Black and white lists should apply to all loaded classifiers.
688  for (int i = 0; i < sub_langs_.size(); ++i) {
689  sub_langs_[i]->unicharset.set_black_and_whitelist(
691  tessedit_char_unblacklist.string());
692  }
693 }
694 
695 // Perform steps to prepare underlying binary image/other data structures for
696 // page segmentation.
699  // Find the max splitter strategy over all langs.
700  ShiroRekhaSplitter::SplitStrategy max_pageseg_strategy =
703  for (int i = 0; i < sub_langs_.size(); ++i) {
704  ShiroRekhaSplitter::SplitStrategy pageseg_strategy =
706  static_cast<inT32>(sub_langs_[i]->pageseg_devanagari_split_strategy));
707  if (pageseg_strategy > max_pageseg_strategy)
708  max_pageseg_strategy = pageseg_strategy;
709  pixDestroy(&sub_langs_[i]->pix_binary_);
710  sub_langs_[i]->pix_binary_ = pixClone(pix_binary());
711  }
712  // Perform shiro-rekha (top-line) splitting and replace the current image by
713  // the newly splitted image.
714  splitter_.set_orig_pix(pix_binary());
715  splitter_.set_pageseg_split_strategy(max_pageseg_strategy);
716  if (splitter_.Split(true, &pixa_debug_)) {
717  ASSERT_HOST(splitter_.splitted_image());
718  pixDestroy(&pix_binary_);
719  pix_binary_ = pixClone(splitter_.splitted_image());
720  }
721 }
722 
723 // Perform steps to prepare underlying binary image/other data structures for
724 // OCR. The current segmentation is required by this method.
725 // Note that this method resets pix_binary_ to the original binarized image,
726 // which may be different from the image actually used for OCR depending on the
727 // value of devanagari_ocr_split_strategy.
728 void Tesseract::PrepareForTessOCR(BLOCK_LIST* block_list,
729  Tesseract* osd_tess, OSResults* osr) {
730  // Find the max splitter strategy over all langs.
731  ShiroRekhaSplitter::SplitStrategy max_ocr_strategy =
733  static_cast<inT32>(ocr_devanagari_split_strategy));
734  for (int i = 0; i < sub_langs_.size(); ++i) {
735  ShiroRekhaSplitter::SplitStrategy ocr_strategy =
737  static_cast<inT32>(sub_langs_[i]->ocr_devanagari_split_strategy));
738  if (ocr_strategy > max_ocr_strategy)
739  max_ocr_strategy = ocr_strategy;
740  }
741  // Utilize the segmentation information available.
742  splitter_.set_segmentation_block_list(block_list);
743  splitter_.set_ocr_split_strategy(max_ocr_strategy);
744  // Run the splitter for OCR
745  bool split_for_ocr = splitter_.Split(false, &pixa_debug_);
746  // Restore pix_binary to the binarized original pix for future reference.
747  ASSERT_HOST(splitter_.orig_pix());
748  pixDestroy(&pix_binary_);
749  pix_binary_ = pixClone(splitter_.orig_pix());
750  // If the pageseg and ocr strategies are different, refresh the block list
751  // (from the last SegmentImage call) with blobs from the real image to be used
752  // for OCR.
753  if (splitter_.HasDifferentSplitStrategies()) {
754  BLOCK block("", TRUE, 0, 0, 0, 0, pixGetWidth(pix_binary_),
755  pixGetHeight(pix_binary_));
756  Pix* pix_for_ocr = split_for_ocr ? splitter_.splitted_image() :
757  splitter_.orig_pix();
758  extract_edges(pix_for_ocr, &block);
759  splitter_.RefreshSegmentationWithNewBlobs(block.blob_list());
760  }
761  // The splitter isn't needed any more after this, so save memory by clearing.
762  splitter_.Clear();
763 }
764 
765 } // namespace tesseract
void set_pageseg_split_strategy(SplitStrategy strategy)
Definition: points.h:189
C_BLOB_LIST * blob_list()
get blobs
Definition: ocrblock.h:132
Dict & getDict() override
void ResetDocumentDictionary()
Definition: dict.h:310
#define TRUE
Definition: capi.h:45
Pix * pix_binary() const
bool Split(bool split_for_pageseg, DebugPixa *pixa_debug)
Assume a single uniform block of text. (Default.)
Definition: publictypes.h:172
void WritePDF(const char *filename)
Definition: debugpixa.h:36
virtual Dict & getDict()
Definition: classify.h:65
void ResetAdaptiveClassifierInternal()
Definition: adaptmatch.cpp:599
void SetEquationDetect(EquationDetect *detector)
Definition: ocrblock.h:30
UNICHARSET unicharset
Definition: ccutil.h:68
void SetLangTesseract(Tesseract *lang_tesseract)
const char * string() const
Definition: strngs.cpp:198
#define FALSE
Definition: capi.h:46
#define STRING_MEMBER(name, val, comment, vec)
Definition: params.h:306
void PrepareForTessOCR(BLOCK_LIST *block_list, Tesseract *osd_tess, OSResults *osr)
bool AnyLSTMLang() const
Definition: strngs.h:45
int32_t inT32
Definition: host.h:38
#define ASSERT_HOST(x)
Definition: errcode.h:84
void RefreshSegmentationWithNewBlobs(C_BLOB_LIST *new_blobs)
#define BOOL_INIT_MEMBER(name, val, comment, vec)
Definition: params.h:315
void set_black_and_whitelist(const char *blacklist, const char *whitelist, const char *unblacklist)
Definition: unicharset.cpp:977
#define INT_INIT_MEMBER(name, val, comment, vec)
Definition: params.h:312
#define BOOL_MEMBER(name, val, comment, vec)
Definition: params.h:303
void extract_edges(Pix *pix, BLOCK *block)
Definition: edgblob.cpp:334
#define INT_MEMBER(name, val, comment, vec)
Definition: params.h:300
void set_ocr_split_strategy(SplitStrategy strategy)
void set_use_cjk_fp_model(bool flag)
Definition: textord.h:95
#define double_MEMBER(name, val, comment, vec)
Definition: params.h:309
void set_segmentation_block_list(BLOCK_LIST *block_list)
const Dict * GetDict() const
STRING imagebasename
Definition: ccutil.h:65