|
tesseract 3.04.01
|
#include <shapeclassifier.h>
Public Member Functions | |
| virtual | ~ShapeClassifier () |
| virtual int | UnicharClassifySample (const TrainingSample &sample, Pix *page_pix, int debug, UNICHAR_ID keep_this, GenericVector< UnicharRating > *results) |
| virtual int | BestShapeForUnichar (const TrainingSample &sample, Pix *page_pix, UNICHAR_ID unichar_id, ShapeRating *result) |
| virtual const ShapeTable * | GetShapeTable () const =0 |
| virtual const UNICHARSET & | GetUnicharset () const |
| virtual void | DebugDisplay (const TrainingSample &sample, Pix *page_pix, UNICHAR_ID unichar_id) |
| virtual int | DisplayClassifyAs (const TrainingSample &sample, Pix *page_pix, UNICHAR_ID unichar_id, int index, PointerVector< ScrollView > *windows) |
| virtual void | UnicharPrintResults (const char *context, const GenericVector< UnicharRating > &results) const |
| virtual void | PrintResults (const char *context, const GenericVector< ShapeRating > &results) const |
Protected Member Functions | |
| virtual int | ClassifySample (const TrainingSample &sample, Pix *page_pix, int debug, UNICHAR_ID keep_this, GenericVector< ShapeRating > *results) |
| void | FilterDuplicateUnichars (GenericVector< ShapeRating > *results) const |
Definition at line 43 of file shapeclassifier.h.
| virtual tesseract::ShapeClassifier::~ShapeClassifier | ( | ) | [inline, virtual] |
Definition at line 45 of file shapeclassifier.h.
{}
| int tesseract::ShapeClassifier::BestShapeForUnichar | ( | const TrainingSample & | sample, |
| Pix * | page_pix, | ||
| UNICHAR_ID | unichar_id, | ||
| ShapeRating * | result | ||
| ) | [virtual] |
Definition at line 70 of file shapeclassifier.cpp.
{
GenericVector<ShapeRating> results;
const ShapeTable* shapes = GetShapeTable();
int num_results = ClassifySample(sample, page_pix, 0, unichar_id, &results);
for (int r = 0; r < num_results; ++r) {
if (shapes->GetShape(results[r].shape_id).ContainsUnichar(unichar_id)) {
if (result != NULL)
*result = results[r];
return results[r].shape_id;
}
}
return -1;
}
| int tesseract::ShapeClassifier::ClassifySample | ( | const TrainingSample & | sample, |
| Pix * | page_pix, | ||
| int | debug, | ||
| UNICHAR_ID | keep_this, | ||
| GenericVector< ShapeRating > * | results | ||
| ) | [protected, virtual] |
Definition at line 59 of file shapeclassifier.cpp.
{
ASSERT_HOST("Must implement ClassifySample!" == NULL);
return 0;
}
| void tesseract::ShapeClassifier::DebugDisplay | ( | const TrainingSample & | sample, |
| Pix * | page_pix, | ||
| UNICHAR_ID | unichar_id | ||
| ) | [virtual] |
Definition at line 97 of file shapeclassifier.cpp.
{
#ifndef GRAPHICS_DISABLED
static ScrollView* terminator = NULL;
if (terminator == NULL) {
terminator = new ScrollView("XIT", 0, 0, 50, 50, 50, 50, true);
}
ScrollView* debug_win = CreateFeatureSpaceWindow("ClassifierDebug", 0, 0);
// Provide a right-click menu to choose the class.
SVMenuNode* popup_menu = new SVMenuNode();
popup_menu->AddChild("Choose class to debug", 0, "x", "Class to debug");
popup_menu->BuildMenu(debug_win, false);
// Display the features in green.
const INT_FEATURE_STRUCT* features = sample.features();
int num_features = sample.num_features();
for (int f = 0; f < num_features; ++f) {
RenderIntFeature(debug_win, &features[f], ScrollView::GREEN);
}
debug_win->Update();
GenericVector<UnicharRating> results;
// Debug classification until the user quits.
const UNICHARSET& unicharset = GetUnicharset();
SVEvent* ev;
SVEventType ev_type;
do {
PointerVector<ScrollView> windows;
if (unichar_id >= 0) {
tprintf("Debugging class %d = %s\n",
unichar_id, unicharset.id_to_unichar(unichar_id));
UnicharClassifySample(sample, page_pix, 1, unichar_id, &results);
DisplayClassifyAs(sample, page_pix, unichar_id, 1, &windows);
} else {
tprintf("Invalid unichar_id: %d\n", unichar_id);
UnicharClassifySample(sample, page_pix, 1, -1, &results);
}
if (unichar_id >= 0) {
tprintf("Debugged class %d = %s\n",
unichar_id, unicharset.id_to_unichar(unichar_id));
}
tprintf("Right-click in ClassifierDebug window to choose debug class,");
tprintf(" Left-click or close window to quit...\n");
UNICHAR_ID old_unichar_id;
do {
old_unichar_id = unichar_id;
ev = debug_win->AwaitEvent(SVET_ANY);
ev_type = ev->type;
if (ev_type == SVET_POPUP) {
if (unicharset.contains_unichar(ev->parameter)) {
unichar_id = unicharset.unichar_to_id(ev->parameter);
} else {
tprintf("Char class '%s' not found in unicharset", ev->parameter);
}
}
delete ev;
} while (unichar_id == old_unichar_id &&
ev_type != SVET_CLICK && ev_type != SVET_DESTROY);
} while (ev_type != SVET_CLICK && ev_type != SVET_DESTROY);
delete debug_win;
#endif // GRAPHICS_DISABLED
}
| int tesseract::ShapeClassifier::DisplayClassifyAs | ( | const TrainingSample & | sample, |
| Pix * | page_pix, | ||
| UNICHAR_ID | unichar_id, | ||
| int | index, | ||
| PointerVector< ScrollView > * | windows | ||
| ) | [virtual] |
Reimplemented in tesseract::TessClassifier.
Definition at line 164 of file shapeclassifier.cpp.
{
// Does nothing in the default implementation.
return index;
}
| void tesseract::ShapeClassifier::FilterDuplicateUnichars | ( | GenericVector< ShapeRating > * | results | ) | const [protected] |
Definition at line 203 of file shapeclassifier.cpp.
{
GenericVector<ShapeRating> filtered_results;
// Copy results to filtered results and knock out duplicate unichars.
const ShapeTable* shapes = GetShapeTable();
for (int r = 0; r < results->size(); ++r) {
if (r > 0) {
const Shape& shape_r = shapes->GetShape((*results)[r].shape_id);
int c;
for (c = 0; c < shape_r.size(); ++c) {
int unichar_id = shape_r[c].unichar_id;
int s;
for (s = 0; s < r; ++s) {
const Shape& shape_s = shapes->GetShape((*results)[s].shape_id);
if (shape_s.ContainsUnichar(unichar_id))
break; // We found unichar_id.
}
if (s == r)
break; // We didn't find unichar_id.
}
if (c == shape_r.size())
continue; // We found all the unichar ids in previous answers.
}
filtered_results.push_back((*results)[r]);
}
*results = filtered_results;
}
| virtual const ShapeTable* tesseract::ShapeClassifier::GetShapeTable | ( | ) | const [pure virtual] |
Implemented in tesseract::CubeClassifier, tesseract::CubeTessClassifier, and tesseract::TessClassifier.
| const UNICHARSET & tesseract::ShapeClassifier::GetUnicharset | ( | ) | const [virtual] |
Reimplemented in tesseract::TessClassifier.
Definition at line 88 of file shapeclassifier.cpp.
{
return GetShapeTable()->unicharset();
}
| void tesseract::ShapeClassifier::PrintResults | ( | const char * | context, |
| const GenericVector< ShapeRating > & | results | ||
| ) | const [virtual] |
Definition at line 188 of file shapeclassifier.cpp.
| int tesseract::ShapeClassifier::UnicharClassifySample | ( | const TrainingSample & | sample, |
| Pix * | page_pix, | ||
| int | debug, | ||
| UNICHAR_ID | keep_this, | ||
| GenericVector< UnicharRating > * | results | ||
| ) | [virtual] |
Reimplemented in tesseract::CubeClassifier, tesseract::CubeTessClassifier, and tesseract::TessClassifier.
Definition at line 40 of file shapeclassifier.cpp.
{
results->truncate(0);
GenericVector<ShapeRating> shape_results;
int num_shape_results = ClassifySample(sample, page_pix, debug, keep_this,
&shape_results);
const ShapeTable* shapes = GetShapeTable();
GenericVector<int> unichar_map;
unichar_map.init_to_size(shapes->unicharset().size(), -1);
for (int r = 0; r < num_shape_results; ++r) {
shapes->AddShapeToResults(shape_results[r], &unichar_map, results);
}
return results->size();
}
| void tesseract::ShapeClassifier::UnicharPrintResults | ( | const char * | context, |
| const GenericVector< UnicharRating > & | results | ||
| ) | const [virtual] |
Definition at line 173 of file shapeclassifier.cpp.
{
tprintf("%s\n", context);
for (int i = 0; i < results.size(); ++i) {
tprintf("%g: c_id=%d=%s", results[i].rating, results[i].unichar_id,
GetUnicharset().id_to_unichar(results[i].unichar_id));
if (results[i].fonts.size() != 0) {
tprintf(" Font Vector:");
for (int f = 0; f < results[i].fonts.size(); ++f) {
tprintf(" %d", results[i].fonts[f]);
}
}
tprintf("\n");
}
}