Tesseract
3.02
|
#include <matchtab.h>
Public Member Functions | |
BlobMatchTable () | |
~BlobMatchTable () | |
void | init_match_table () |
void | end_match_table () |
void | put_match (TBLOB *blob, BLOB_CHOICE_LIST *ratings) |
BLOB_CHOICE_LIST * | get_match (TBLOB *blob) |
BLOB_CHOICE_LIST * | get_match_by_box (const TBOX &box) |
void | add_to_match (TBLOB *blob, BLOB_CHOICE_LIST *ratings) |
Definition at line 42 of file matchtab.h.
tesseract::BlobMatchTable::BlobMatchTable | ( | ) |
Definition at line 38 of file matchtab.cpp.
: been_initialized_(false), match_table_(NULL) { init_match_table(); }
tesseract::BlobMatchTable::~BlobMatchTable | ( | ) |
Definition at line 43 of file matchtab.cpp.
{ end_match_table(); }
void tesseract::BlobMatchTable::add_to_match | ( | TBLOB * | blob, |
BLOB_CHOICE_LIST * | ratings | ||
) |
Definition at line 183 of file matchtab.cpp.
{ TBOX bbox = blob->bounding_box(); int start = Hash(bbox); int x = start; do { if (IsEmpty(x)) { fprintf(stderr, "Can not update uninitialized entry in match_table\n"); ASSERT_HOST(!IsEmpty(x)); } if (match_table_[x].box == bbox) { // Copy new ratings to match_table_[x].rating. BLOB_CHOICE_IT it; it.set_to_list(match_table_[x].rating); BLOB_CHOICE_IT new_it; new_it.set_to_list(ratings); assert(it.length() <= new_it.length()); for (it.mark_cycle_pt(), new_it.mark_cycle_pt(); !it.cycled_list() && !new_it.cycled_list(); new_it.forward()) { if (it.data()->unichar_id() == new_it.data()->unichar_id()) { it.forward(); } else { it.add_before_stay_put(new BLOB_CHOICE(*(new_it.data()))); } } return; } if (++x >= NUM_MATCH_ENTRIES) x = 0; } while (x != start); }
void tesseract::BlobMatchTable::end_match_table | ( | ) |
Definition at line 71 of file matchtab.cpp.
{ if (been_initialized_) { init_match_table(); delete[] match_table_; match_table_ = NULL; been_initialized_ = false; } }
BLOB_CHOICE_LIST * tesseract::BlobMatchTable::get_match | ( | TBLOB * | blob | ) |
Definition at line 118 of file matchtab.cpp.
{ return get_match_by_box(blob->bounding_box()); }
BLOB_CHOICE_LIST * tesseract::BlobMatchTable::get_match_by_box | ( | const TBOX & | box | ) |
Definition at line 150 of file matchtab.cpp.
{ int start = Hash(box); int x = start; /* Search for match */ do { /* Not found when blank */ if (IsEmpty(x)) break; /* Is this the match ? */ if (match_table_[x].box == box) { BLOB_CHOICE_LIST *blist = new BLOB_CHOICE_LIST(); blist->deep_copy(match_table_[x].rating, &BLOB_CHOICE::deep_copy); return blist; } if (++x >= NUM_MATCH_ENTRIES) x = 0; } while (x != start); return NULL; }
void tesseract::BlobMatchTable::init_match_table | ( | ) |
Definition at line 52 of file matchtab.cpp.
{ if (been_initialized_) { /* Reclaim old choices */ for (int x = 0; x < NUM_MATCH_ENTRIES; x++) { if (!IsEmpty(x)) { match_table_[x].rating->clear(); delete match_table_[x].rating; // Reinitialize the entry. match_table_[x].box = TBOX(); match_table_[x].rating = NULL; } } } else { /* Allocate memory once */ match_table_ = new MATCH[NUM_MATCH_ENTRIES]; been_initialized_ = true; } }
void tesseract::BlobMatchTable::put_match | ( | TBLOB * | blob, |
BLOB_CHOICE_LIST * | ratings | ||
) |
Definition at line 87 of file matchtab.cpp.
{ if (!blob) return; /* Hash into table */ TBOX bbox(blob->bounding_box()); int start = Hash(bbox); /* Look for empty */ int x = start; do { if (IsEmpty(x)) { /* Add this entry */ match_table_[x].box = bbox; // Copy ratings to match_table_[x].rating match_table_[x].rating = new BLOB_CHOICE_LIST(); match_table_[x].rating->deep_copy(ratings, &BLOB_CHOICE::deep_copy); return; } if (++x >= NUM_MATCH_ENTRIES) x = 0; } while (x != start); cprintf ("error: Match table is full\n"); }