tesseract 4.1.1
Loading...
Searching...
No Matches
tesseractclass.cpp
Go to the documentation of this file.
1
2// 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
50namespace 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.
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 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,
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, 2 and 3. 0 is the default value. "
512 "With 1 the alternative symbol choices per timestep are included. "
513 "With 2 the alternative symbol choices are accumulated per "
514 "character. ",
515 this->params()),
516 BOOL_MEMBER(pageseg_apply_music_mask, true,
517 "Detect music staff and remove intersecting components", this->params()),
518
519 backup_config_file_(nullptr),
520 pix_binary_(nullptr),
521 pix_grey_(nullptr),
522 pix_original_(nullptr),
523 pix_thresholds_(nullptr),
524 source_resolution_(0),
525 textord_(this),
526 right_to_left_(false),
527 scaled_color_(nullptr),
528 scaled_factor_(-1),
529 deskew_(1.0f, 0.0f),
530 reskew_(1.0f, 0.0f),
531 most_recently_used_(this),
532 font_table_size_(0),
533 equ_detect_(nullptr),
534#ifndef ANDROID_BUILD
535 lstm_recognizer_(nullptr),
536#endif
537 train_line_page_num_(0) {
538}
539
541 Clear();
542 pixDestroy(&pix_original_);
544 sub_langs_.delete_data_pointers();
545#ifndef ANDROID_BUILD
546 delete lstm_recognizer_;
547 lstm_recognizer_ = nullptr;
548#endif
549}
550
552{
553 if (0 == Classify::getDict().NumDawgs() && AnyLSTMLang())
554 {
555 if (lstm_recognizer_ && lstm_recognizer_->GetDict())
556 {
557 return *const_cast<Dict*>(lstm_recognizer_->GetDict());
558 }
559 }
560 return Classify::getDict();
561 }
562
563
565 STRING debug_name = imagebasename + "_debug.pdf";
566 pixa_debug_.WritePDF(debug_name.string());
567 pixDestroy(&pix_binary_);
568 pixDestroy(&pix_grey_);
569 pixDestroy(&pix_thresholds_);
570 pixDestroy(&scaled_color_);
571 deskew_ = FCOORD(1.0f, 0.0f);
572 reskew_ = FCOORD(1.0f, 0.0f);
573 splitter_.Clear();
574 scaled_factor_ = -1;
575 for (int i = 0; i < sub_langs_.size(); ++i)
576 sub_langs_[i]->Clear();
577}
578
579#ifndef DISABLED_LEGACY_ENGINE
580
582 equ_detect_ = detector;
583 equ_detect_->SetLangTesseract(this);
584}
585
586// Clear all memory of adaption for this and all subclassifiers.
589 for (int i = 0; i < sub_langs_.size(); ++i) {
590 sub_langs_[i]->ResetAdaptiveClassifierInternal();
591 }
592}
593
594#endif //ndef DISABLED_LEGACY_ENGINE
595
596// Clear the document dictionary for this and all subclassifiers.
599 for (int i = 0; i < sub_langs_.size(); ++i) {
600 sub_langs_[i]->getDict().ResetDocumentDictionary();
601 }
602}
603
605 // Set the white and blacklists (if any)
609 if (lstm_recognizer_) {
610 UNICHARSET& lstm_unicharset = const_cast<UNICHARSET&> (lstm_recognizer_->GetUnicharset());
611 lstm_unicharset.set_black_and_whitelist(tessedit_char_blacklist.string(),
614 }
615 // Black and white lists should apply to all loaded classifiers.
616 for (int i = 0; i < sub_langs_.size(); ++i) {
617 sub_langs_[i]->unicharset.set_black_and_whitelist(
620 if (sub_langs_[i]->lstm_recognizer_) {
621 UNICHARSET& lstm_unicharset = const_cast<UNICHARSET&> (sub_langs_[i]->lstm_recognizer_->GetUnicharset());
622 lstm_unicharset.set_black_and_whitelist(tessedit_char_blacklist.string(),
625 }
626 }
627}
628
629// Perform steps to prepare underlying binary image/other data structures for
630// page segmentation.
633 // Find the max splitter strategy over all langs.
634 auto max_pageseg_strategy =
636 static_cast<int32_t>(pageseg_devanagari_split_strategy));
637 for (int i = 0; i < sub_langs_.size(); ++i) {
638 auto pageseg_strategy =
640 static_cast<int32_t>(sub_langs_[i]->pageseg_devanagari_split_strategy));
641 if (pageseg_strategy > max_pageseg_strategy)
642 max_pageseg_strategy = pageseg_strategy;
643 pixDestroy(&sub_langs_[i]->pix_binary_);
644 sub_langs_[i]->pix_binary_ = pixClone(pix_binary());
645 }
646 // Perform shiro-rekha (top-line) splitting and replace the current image by
647 // the newly split image.
648 splitter_.set_orig_pix(pix_binary());
649 splitter_.set_pageseg_split_strategy(max_pageseg_strategy);
650 if (splitter_.Split(true, &pixa_debug_)) {
651 ASSERT_HOST(splitter_.splitted_image());
652 pixDestroy(&pix_binary_);
653 pix_binary_ = pixClone(splitter_.splitted_image());
654 }
655}
656
657// Perform steps to prepare underlying binary image/other data structures for
658// OCR. The current segmentation is required by this method.
659// Note that this method resets pix_binary_ to the original binarized image,
660// which may be different from the image actually used for OCR depending on the
661// value of devanagari_ocr_split_strategy.
662void Tesseract::PrepareForTessOCR(BLOCK_LIST* block_list,
663 Tesseract* osd_tess, OSResults* osr) {
664 // Find the max splitter strategy over all langs.
665 auto max_ocr_strategy =
667 static_cast<int32_t>(ocr_devanagari_split_strategy));
668 for (int i = 0; i < sub_langs_.size(); ++i) {
669 auto ocr_strategy =
671 static_cast<int32_t>(sub_langs_[i]->ocr_devanagari_split_strategy));
672 if (ocr_strategy > max_ocr_strategy)
673 max_ocr_strategy = ocr_strategy;
674 }
675 // Utilize the segmentation information available.
676 splitter_.set_segmentation_block_list(block_list);
677 splitter_.set_ocr_split_strategy(max_ocr_strategy);
678 // Run the splitter for OCR
679 bool split_for_ocr = splitter_.Split(false, &pixa_debug_);
680 // Restore pix_binary to the binarized original pix for future reference.
681 ASSERT_HOST(splitter_.orig_pix());
682 pixDestroy(&pix_binary_);
683 pix_binary_ = pixClone(splitter_.orig_pix());
684 // If the pageseg and ocr strategies are different, refresh the block list
685 // (from the last SegmentImage call) with blobs from the real image to be used
686 // for OCR.
687 if (splitter_.HasDifferentSplitStrategies()) {
688 BLOCK block("", true, 0, 0, 0, 0, pixGetWidth(pix_binary_),
689 pixGetHeight(pix_binary_));
690 Pix* pix_for_ocr = split_for_ocr ? splitter_.splitted_image() :
691 splitter_.orig_pix();
692 extract_edges(pix_for_ocr, &block);
694 }
695 // The splitter isn't needed any more after this, so save memory by clearing.
696 splitter_.Clear();
697}
698
699} // namespace tesseract
#define ASSERT_HOST(x)
Definition: errcode.h:88
#define INT_MEMBER(name, val, comment, vec)
Definition: params.h:315
#define INT_INIT_MEMBER(name, val, comment, vec)
Definition: params.h:327
#define BOOL_INIT_MEMBER(name, val, comment, vec)
Definition: params.h:330
#define double_MEMBER(name, val, comment, vec)
Definition: params.h:324
#define STRING_MEMBER(name, val, comment, vec)
Definition: params.h:321
#define BOOL_MEMBER(name, val, comment, vec)
Definition: params.h:318
void extract_edges(Pix *pix, BLOCK *block)
Definition: edgblob.cpp:329
@ PSM_SINGLE_BLOCK
Assume a single uniform block of text. (Default.)
Definition: publictypes.h:172
void SetLangTesseract(Tesseract *lang_tesseract)
void SetEquationDetect(EquationDetect *detector)
Pix * pix_binary() const
Dict & getDict() override
void PrepareForTessOCR(BLOCK_LIST *block_list, Tesseract *osd_tess, OSResults *osr)
bool AnyLSTMLang() const
void WritePDF(const char *filename)
Definition: debugpixa.h:36
Definition: ocrblock.h:31
C_BLOB_LIST * blob_list()
get blobs
Definition: ocrblock.h:128
Definition: points.h:189
UNICHARSET unicharset
Definition: ccutil.h:73
STRING imagebasename
Definition: ccutil.h:70
Definition: strngs.h:45
const char * string() const
Definition: strngs.cpp:194
void set_black_and_whitelist(const char *blacklist, const char *whitelist, const char *unblacklist)
void ResetAdaptiveClassifierInternal()
Definition: adaptmatch.cpp:598
virtual Dict & getDict()
Definition: classify.h:107
void ResetDocumentDictionary()
Definition: dict.h:326
const Dict * GetDict() const
const UNICHARSET & GetUnicharset() const
void set_pageseg_split_strategy(SplitStrategy strategy)
void RefreshSegmentationWithNewBlobs(C_BLOB_LIST *new_blobs)
bool Split(bool split_for_pageseg, DebugPixa *pixa_debug)
void set_segmentation_block_list(BLOCK_LIST *block_list)
void set_ocr_split_strategy(SplitStrategy strategy)
void set_use_cjk_fp_model(bool flag)
Definition: textord.h:95