Tesseract
3.02
|
#include <cube_search_object.h>
Public Member Functions | |
CubeSearchObject (CubeRecoContext *cntxt, CharSamp *samp) | |
~CubeSearchObject () | |
int | SegPtCnt () |
CharAltList * | RecognizeSegment (int start_pt, int end_pt) |
CharSamp * | CharSample (int start_pt, int end_pt) |
Box * | CharBox (int start_pt, int end_pt) |
int | SpaceCost (int seg_pt) |
int | NoSpaceCost (int seg_pt) |
int | NoSpaceCost (int seg_pt, int end_pt) |
Definition at line 41 of file cube_search_object.h.
tesseract::CubeSearchObject::CubeSearchObject | ( | CubeRecoContext * | cntxt, |
CharSamp * | samp | ||
) |
Definition at line 28 of file cube_search_object.cpp.
: SearchObject(cntxt) { init_ = false; reco_cache_ = NULL; samp_cache_ = NULL; segments_ = NULL; segment_cnt_ = 0; samp_ = samp; left_ = 0; itop_ = 0; space_cost_ = NULL; no_space_cost_ = NULL; wid_ = samp_->Width(); hgt_ = samp_->Height(); max_seg_per_char_ = cntxt_->Params()->MaxSegPerChar(); rtl_ = (cntxt_->ReadingOrder() == CubeRecoContext::R2L); min_spc_gap_ = static_cast<int>(hgt_ * cntxt_->Params()->MinSpaceHeightRatio()); max_spc_gap_ = static_cast<int>(hgt_ * cntxt_->Params()->MaxSpaceHeightRatio()); }
tesseract::CubeSearchObject::~CubeSearchObject | ( | ) |
Definition at line 50 of file cube_search_object.cpp.
{ Cleanup(); }
Box * tesseract::CubeSearchObject::CharBox | ( | int | start_pt, |
int | end_pt | ||
) | [virtual] |
Implements tesseract::SearchObject.
Definition at line 228 of file cube_search_object.cpp.
{ if (!init_ && !Init()) return NULL; if (!IsValidSegmentRange(start_pt, end_pt)) { fprintf(stderr, "Cube ERROR (CubeSearchObject::CharBox): invalid " "segment range (%d, %d)\n", start_pt, end_pt); return NULL; } // create a char samp object from the specified range of segments, // extract its dimensions into a leptonica box, and delete it bool left_most; bool right_most; CharSamp *samp = CharSamp::FromConComps(segments_, start_pt + 1, end_pt - start_pt, NULL, &left_most, &right_most, hgt_); if (!samp) return NULL; if (kUseCroppedChars) { CharSamp *cropped_samp = samp->Crop(); delete samp; if (!cropped_samp) { return NULL; } samp = cropped_samp; } Box *box = boxCreate(samp->Left(), samp->Top(), samp->Width(), samp->Height()); delete samp; return box; }
CharSamp * tesseract::CubeSearchObject::CharSample | ( | int | start_pt, |
int | end_pt | ||
) | [virtual] |
Implements tesseract::SearchObject.
Definition at line 168 of file cube_search_object.cpp.
{ // init if necessary if (!init_ && !Init()) return NULL; // validate segment range if (!IsValidSegmentRange(start_pt, end_pt)) return NULL; // look for the samp in the cache if (samp_cache_ && samp_cache_[start_pt + 1] && samp_cache_[start_pt + 1][end_pt]) { return samp_cache_[start_pt + 1][end_pt]; } // create a char samp object from the specified range of segments bool left_most; bool right_most; CharSamp *samp = CharSamp::FromConComps(segments_, start_pt + 1, end_pt - start_pt, NULL, &left_most, &right_most, hgt_); if (!samp) return NULL; if (kUseCroppedChars) { CharSamp *cropped_samp = samp->Crop(); // we no longer need the orig sample delete samp; if (!cropped_samp) return NULL; samp = cropped_samp; } // get the dimensions of the new cropped sample int char_top = samp->Top(); int char_wid = samp->Width(); int char_hgt = samp->Height(); // for cursive languages, these features correspond to whether // the charsamp is at the beginning or end of conncomp if (cntxt_->Cursive() == true) { // first and last char flags depend on reading order bool first_char = rtl_ ? right_most : left_most; bool last_char = rtl_ ? left_most : right_most; samp->SetFirstChar(first_char ? 255 : 0); samp->SetLastChar(last_char ? 255 : 0); } else { // for non cursive languages, these features correspond // to whether the charsamp is at the begining or end of the word samp->SetFirstChar((start_pt == -1) ? 255 : 0); samp->SetLastChar((end_pt == (segment_cnt_ - 1)) ? 255 : 0); } samp->SetNormTop(255 * char_top / hgt_); samp->SetNormBottom(255 * (char_top + char_hgt) / hgt_); samp->SetNormAspectRatio(255 * char_wid / (char_wid + char_hgt)); // add to cache & return samp_cache_[start_pt + 1][end_pt] = samp; return samp; }
int tesseract::CubeSearchObject::NoSpaceCost | ( | int | seg_pt | ) | [virtual] |
Implements tesseract::SearchObject.
Definition at line 437 of file cube_search_object.cpp.
{ // If failed to compute costs, return a 1.0 prob if (!space_cost_ && !ComputeSpaceCosts()) return CubeUtils::Prob2Cost(0.0); return no_space_cost_[pt_idx]; }
int tesseract::CubeSearchObject::NoSpaceCost | ( | int | seg_pt, |
int | end_pt | ||
) | [virtual] |
Implements tesseract::SearchObject.
Definition at line 446 of file cube_search_object.cpp.
{ // If fail to compute costs, return a 1.0 prob if (!space_cost_ && !ComputeSpaceCosts()) return CubeUtils::Prob2Cost(1.0); int no_spc_cost = 0; for (int pt_idx = st_pt + 1; pt_idx < end_pt; pt_idx++) no_spc_cost += NoSpaceCost(pt_idx); return no_spc_cost; }
CharAltList * tesseract::CubeSearchObject::RecognizeSegment | ( | int | start_pt, |
int | end_pt | ||
) | [virtual] |
Implements tesseract::SearchObject.
Definition at line 262 of file cube_search_object.cpp.
{ // init if necessary if (!init_ && !Init()) { fprintf(stderr, "Cube ERROR (CubeSearchObject::RecognizeSegment): could " "not initialize CubeSearchObject\n"); return NULL; } // validate segment range if (!IsValidSegmentRange(start_pt, end_pt)) { fprintf(stderr, "Cube ERROR (CubeSearchObject::RecognizeSegment): invalid " "segment range (%d, %d)\n", start_pt, end_pt); return NULL; } // look for the recognition results in cache in the cache if (reco_cache_ && reco_cache_[start_pt + 1] && reco_cache_[start_pt + 1][end_pt]) { return reco_cache_[start_pt + 1][end_pt]; } // create the char sample corresponding to the blob CharSamp *samp = CharSample(start_pt, end_pt); if (!samp) { fprintf(stderr, "Cube ERROR (CubeSearchObject::RecognizeSegment): could " "not construct CharSamp\n"); return NULL; } // recognize the char sample CharClassifier *char_classifier = cntxt_->Classifier(); if (char_classifier) { reco_cache_[start_pt + 1][end_pt] = char_classifier->Classify(samp); } else { // no classifer: all characters are equally probable; add a penalty // that favors 2-segment characters and aspect ratios (w/h) > 1 fprintf(stderr, "Cube WARNING (CubeSearchObject::RecognizeSegment): cube " "context has no character classifier!! Inventing a probability " "distribution.\n"); int class_cnt = cntxt_->CharacterSet()->ClassCount(); CharAltList *alt_list = new CharAltList(cntxt_->CharacterSet(), class_cnt); int seg_cnt = end_pt - start_pt; double prob_val = (1.0 / class_cnt) * exp(-abs(seg_cnt - 2.0)) * exp(-samp->Width() / static_cast<double>(samp->Height())); if (alt_list) { for (int class_idx = 0; class_idx < class_cnt; class_idx++) { alt_list->Insert(class_idx, CubeUtils::Prob2Cost(prob_val)); } reco_cache_[start_pt + 1][end_pt] = alt_list; } } return reco_cache_[start_pt + 1][end_pt]; }
int tesseract::CubeSearchObject::SegPtCnt | ( | ) | [virtual] |
Implements tesseract::SearchObject.
Definition at line 114 of file cube_search_object.cpp.
{ if (!init_ && !Init()) return -1; return segment_cnt_ - 1; }
int tesseract::CubeSearchObject::SpaceCost | ( | int | seg_pt | ) | [virtual] |
Implements tesseract::SearchObject.
Definition at line 427 of file cube_search_object.cpp.
{ if (!space_cost_ && !ComputeSpaceCosts()) { // Failed to compute costs return a zero prob return CubeUtils::Prob2Cost(0.0); } return space_cost_[pt_idx]; }