tesseract  5.0.0
tesseract::ShapeClassifier Class Referenceabstract

#include <shapeclassifier.h>

Inheritance diagram for tesseract::ShapeClassifier:
MockClassifier tesseract::TessClassifier

Public Member Functions

virtual ~ShapeClassifier ()=default
 
virtual int UnicharClassifySample (const TrainingSample &sample, Image page_pix, int debug, UNICHAR_ID keep_this, std::vector< UnicharRating > *results)
 
virtual int BestShapeForUnichar (const TrainingSample &sample, Image page_pix, UNICHAR_ID unichar_id, ShapeRating *result)
 
virtual const ShapeTableGetShapeTable () const =0
 
virtual const UNICHARSETGetUnicharset () const
 
void DebugDisplay (const TrainingSample &sample, Image page_pix, UNICHAR_ID unichar_id)
 
virtual int DisplayClassifyAs (const TrainingSample &sample, Image page_pix, UNICHAR_ID unichar_id, int index, std::vector< ScrollView * > &windows)
 
virtual void UnicharPrintResults (const char *context, const std::vector< UnicharRating > &results) const
 
virtual void PrintResults (const char *context, const std::vector< ShapeRating > &results) const
 

Protected Member Functions

virtual int ClassifySample (const TrainingSample &sample, Image page_pix, int debug, UNICHAR_ID keep_this, std::vector< ShapeRating > *results)
 
void FilterDuplicateUnichars (std::vector< ShapeRating > *results) const
 

Detailed Description

Definition at line 43 of file shapeclassifier.h.

Constructor & Destructor Documentation

◆ ~ShapeClassifier()

virtual tesseract::ShapeClassifier::~ShapeClassifier ( )
virtualdefault

Member Function Documentation

◆ BestShapeForUnichar()

int tesseract::ShapeClassifier::BestShapeForUnichar ( const TrainingSample sample,
Image  page_pix,
UNICHAR_ID  unichar_id,
ShapeRating result 
)
virtual

Definition at line 68 of file shapeclassifier.cpp.

69  {
70  std::vector<ShapeRating> results;
71  const ShapeTable *shapes = GetShapeTable();
72  int num_results = ClassifySample(sample, page_pix, 0, unichar_id, &results);
73  for (int r = 0; r < num_results; ++r) {
74  if (shapes->GetShape(results[r].shape_id).ContainsUnichar(unichar_id)) {
75  if (result != nullptr) {
76  *result = results[r];
77  }
78  return results[r].shape_id;
79  }
80  }
81  return -1;
82 }
virtual int ClassifySample(const TrainingSample &sample, Image page_pix, int debug, UNICHAR_ID keep_this, std::vector< ShapeRating > *results)
virtual const ShapeTable * GetShapeTable() const =0

◆ ClassifySample()

int tesseract::ShapeClassifier::ClassifySample ( const TrainingSample sample,
Image  page_pix,
int  debug,
UNICHAR_ID  keep_this,
std::vector< ShapeRating > *  results 
)
protectedvirtual

Reimplemented in MockClassifier.

Definition at line 58 of file shapeclassifier.cpp.

59  {
60  ASSERT_HOST("Must implement ClassifySample!" == nullptr);
61  return 0;
62 }
#define ASSERT_HOST(x)
Definition: errcode.h:59

◆ DebugDisplay()

void tesseract::ShapeClassifier::DebugDisplay ( const TrainingSample sample,
Image  page_pix,
UNICHAR_ID  unichar_id 
)

Definition at line 97 of file shapeclassifier.cpp.

98  {
99  static ScrollView *terminator = nullptr;
100  if (terminator == nullptr) {
101  terminator = new ScrollView("XIT", 0, 0, 50, 50, 50, 50, true);
102  }
103  ScrollView *debug_win = CreateFeatureSpaceWindow("ClassifierDebug", 0, 0);
104  // Provide a right-click menu to choose the class.
105  auto *popup_menu = new SVMenuNode();
106  popup_menu->AddChild("Choose class to debug", 0, "x", "Class to debug");
107  popup_menu->BuildMenu(debug_win, false);
108  // Display the features in green.
109  const INT_FEATURE_STRUCT *features = sample.features();
110  uint32_t num_features = sample.num_features();
111  for (uint32_t f = 0; f < num_features; ++f) {
112  RenderIntFeature(debug_win, &features[f], ScrollView::GREEN);
113  }
114  debug_win->Update();
115  std::vector<UnicharRating> results;
116  // Debug classification until the user quits.
117  const UNICHARSET &unicharset = GetUnicharset();
118  SVEvent *ev;
119  SVEventType ev_type;
120  do {
121  std::vector<ScrollView *> windows;
122  if (unichar_id >= 0) {
123  tprintf("Debugging class %d = %s\n", unichar_id, unicharset.id_to_unichar(unichar_id));
124  UnicharClassifySample(sample, page_pix, 1, unichar_id, &results);
125  DisplayClassifyAs(sample, page_pix, unichar_id, 1, windows);
126  } else {
127  tprintf("Invalid unichar_id: %d\n", unichar_id);
128  UnicharClassifySample(sample, page_pix, 1, -1, &results);
129  }
130  if (unichar_id >= 0) {
131  tprintf("Debugged class %d = %s\n", unichar_id, unicharset.id_to_unichar(unichar_id));
132  }
133  tprintf("Right-click in ClassifierDebug window to choose debug class,");
134  tprintf(" Left-click or close window to quit...\n");
135  UNICHAR_ID old_unichar_id;
136  do {
137  old_unichar_id = unichar_id;
138  ev = debug_win->AwaitEvent(SVET_ANY);
139  ev_type = ev->type;
140  if (ev_type == SVET_POPUP) {
141  if (unicharset.contains_unichar(ev->parameter)) {
142  unichar_id = unicharset.unichar_to_id(ev->parameter);
143  } else {
144  tprintf("Char class '%s' not found in unicharset", ev->parameter);
145  }
146  }
147  delete ev;
148  } while (unichar_id == old_unichar_id && ev_type != SVET_CLICK && ev_type != SVET_DESTROY);
149  for (auto window : windows) {
150  delete window;
151  }
152  } while (ev_type != SVET_CLICK && ev_type != SVET_DESTROY);
153  delete debug_win;
154 }
void tprintf(const char *format,...)
Definition: tprintf.cpp:41
@ SVET_DESTROY
Definition: scrollview.h:53
@ SVET_POPUP
Definition: scrollview.h:61
@ SVET_CLICK
Definition: scrollview.h:55
ScrollView * CreateFeatureSpaceWindow(const char *name, int xpos, int ypos)
Definition: intproto.cpp:1622
void RenderIntFeature(ScrollView *window, const INT_FEATURE_STRUCT *Feature, ScrollView::Color color)
Definition: intproto.cpp:1500
int UNICHAR_ID
Definition: unichar.h:36
virtual int UnicharClassifySample(const TrainingSample &sample, Image page_pix, int debug, UNICHAR_ID keep_this, std::vector< UnicharRating > *results)
virtual const UNICHARSET & GetUnicharset() const
virtual int DisplayClassifyAs(const TrainingSample &sample, Image page_pix, UNICHAR_ID unichar_id, int index, std::vector< ScrollView * > &windows)

◆ DisplayClassifyAs()

int tesseract::ShapeClassifier::DisplayClassifyAs ( const TrainingSample sample,
Image  page_pix,
UNICHAR_ID  unichar_id,
int  index,
std::vector< ScrollView * > &  windows 
)
virtual

Reimplemented in tesseract::TessClassifier.

Definition at line 163 of file shapeclassifier.cpp.

165  {
166  // Does nothing in the default implementation.
167  return index;
168 }

◆ FilterDuplicateUnichars()

void tesseract::ShapeClassifier::FilterDuplicateUnichars ( std::vector< ShapeRating > *  results) const
protected

Definition at line 203 of file shapeclassifier.cpp.

203  {
204  std::vector<ShapeRating> filtered_results;
205  // Copy results to filtered results and knock out duplicate unichars.
206  const ShapeTable *shapes = GetShapeTable();
207  for (unsigned r = 0; r < results->size(); ++r) {
208  if (r > 0) {
209  const Shape &shape_r = shapes->GetShape((*results)[r].shape_id);
210  int c;
211  for (c = 0; c < shape_r.size(); ++c) {
212  int unichar_id = shape_r[c].unichar_id;
213  unsigned s;
214  for (s = 0; s < r; ++s) {
215  const Shape &shape_s = shapes->GetShape((*results)[s].shape_id);
216  if (shape_s.ContainsUnichar(unichar_id)) {
217  break; // We found unichar_id.
218  }
219  }
220  if (s == r) {
221  break; // We didn't find unichar_id.
222  }
223  }
224  if (c == shape_r.size()) {
225  continue; // We found all the unichar ids in previous answers.
226  }
227  }
228  filtered_results.push_back((*results)[r]);
229  }
230  *results = filtered_results;
231 }

◆ GetShapeTable()

virtual const ShapeTable* tesseract::ShapeClassifier::GetShapeTable ( ) const
pure virtual

◆ GetUnicharset()

const UNICHARSET & tesseract::ShapeClassifier::GetUnicharset ( ) const
virtual

Reimplemented in tesseract::TessClassifier.

Definition at line 86 of file shapeclassifier.cpp.

86  {
87  return GetShapeTable()->unicharset();
88 }
const UNICHARSET & unicharset() const
Definition: shapetable.h:251

◆ PrintResults()

void tesseract::ShapeClassifier::PrintResults ( const char *  context,
const std::vector< ShapeRating > &  results 
) const
virtual

Definition at line 186 of file shapeclassifier.cpp.

187  {
188  tprintf("%s\n", context);
189  for (const auto &result : results) {
190  tprintf("%g:", result.rating);
191  if (result.joined) {
192  tprintf("[J]");
193  }
194  if (result.broken) {
195  tprintf("[B]");
196  }
197  tprintf(" %s\n", GetShapeTable()->DebugStr(result.shape_id).c_str());
198  }
199 }

◆ UnicharClassifySample()

int tesseract::ShapeClassifier::UnicharClassifySample ( const TrainingSample sample,
Image  page_pix,
int  debug,
UNICHAR_ID  keep_this,
std::vector< UnicharRating > *  results 
)
virtual

Reimplemented in tesseract::TessClassifier.

Definition at line 41 of file shapeclassifier.cpp.

43  {
44  results->clear();
45  std::vector<ShapeRating> shape_results;
46  int num_shape_results = ClassifySample(sample, page_pix, debug, keep_this, &shape_results);
47  const ShapeTable *shapes = GetShapeTable();
48  std::vector<int> unichar_map(shapes->unicharset().size(), -1);
49  for (int r = 0; r < num_shape_results; ++r) {
50  shapes->AddShapeToResults(shape_results[r], &unichar_map, results);
51  }
52  return results->size();
53 }

◆ UnicharPrintResults()

void tesseract::ShapeClassifier::UnicharPrintResults ( const char *  context,
const std::vector< UnicharRating > &  results 
) const
virtual

Definition at line 171 of file shapeclassifier.cpp.

172  {
173  tprintf("%s\n", context);
174  for (const auto &result : results) {
175  tprintf("%g: c_id=%d=%s", result.rating, result.unichar_id,
176  GetUnicharset().id_to_unichar(result.unichar_id));
177  if (!result.fonts.empty()) {
178  tprintf(" Font Vector:");
179  for (auto font : result.fonts) {
180  tprintf(" %d", font.fontinfo_id);
181  }
182  }
183  tprintf("\n");
184  }
185 }

The documentation for this class was generated from the following files: