Tesseract
3.02
|
#include <con_comp.h>
Public Member Functions | |
ConComp () | |
virtual | ~ConComp () |
ConCompPt * | Head () |
int | Left () const |
int | Top () const |
int | Right () const |
int | Bottom () const |
int | Width () const |
int | Height () const |
bool | LeftMost () const |
bool | RightMost () const |
void | SetLeftMost (bool left_most) |
void | SetRightMost (bool right_most) |
int | ID () const |
void | SetID (int id) |
int | PtCnt () const |
bool | Add (int x, int y) |
bool | Merge (ConComp *con_comp) |
void | Shift (int dx, int dy) |
ConComp ** | Segment (int max_hist_wnd, int *concomp_cnt) |
int * | CreateHistogram (int max_hist_wnd) |
int * | SegmentHistogram (int *hist_array, int *seg_pt_cnt) |
Static Public Member Functions | |
static int | Left2RightComparer (const void *comp1, const void *comp2) |
static int | Right2LeftComparer (const void *comp1, const void *comp2) |
Definition at line 59 of file con_comp.h.
tesseract::ConComp::ConComp | ( | ) |
Definition at line 27 of file con_comp.cpp.
tesseract::ConComp::~ConComp | ( | ) | [virtual] |
Definition at line 40 of file con_comp.cpp.
bool tesseract::ConComp::Add | ( | int | x, |
int | y | ||
) |
Definition at line 53 of file con_comp.cpp.
{ ConCompPt *pt_ptr = new ConCompPt(x, y); if (pt_ptr == NULL) { return false; } if (head_ == NULL) { left_ = x; right_ = x; top_ = y; bottom_ = y; head_ = pt_ptr; } else { left_ = left_ <= x ? left_ : x; top_ = top_ <= y ? top_ : y; right_ = right_ >= x ? right_ : x; bottom_ = bottom_ >= y ? bottom_ : y; } if (tail_ != NULL) { tail_->SetNext(pt_ptr); } tail_ = pt_ptr; pt_cnt_++; return true; }
int tesseract::ConComp::Bottom | ( | ) | const [inline] |
Definition at line 68 of file con_comp.h.
{ return bottom_; }
int * tesseract::ConComp::CreateHistogram | ( | int | max_hist_wnd | ) |
Definition at line 106 of file con_comp.cpp.
{ int wid = right_ - left_ + 1, hgt = bottom_ - top_ + 1, hist_wnd = static_cast<int>(hgt * HIST_WND_RATIO); if (hist_wnd > max_hist_wnd) { hist_wnd = max_hist_wnd; } // alloc memo for histogram int *hist_array = new int[wid]; if (hist_array == NULL) { return NULL; } memset(hist_array, 0, wid * sizeof(*hist_array)); // compute windowed histogram ConCompPt *pt_ptr = head_; while (pt_ptr != NULL) { int x = pt_ptr->x() - left_, xw = x - hist_wnd; for (int xdel = -hist_wnd; xdel <= hist_wnd; xdel++, xw++) { if (xw >= 0 && xw < wid) { hist_array[xw]++; } } pt_ptr = pt_ptr->Next(); } return hist_array; }
ConCompPt* tesseract::ConComp::Head | ( | ) | [inline] |
Definition at line 64 of file con_comp.h.
{ return head_; }
int tesseract::ConComp::Height | ( | ) | const [inline] |
Definition at line 70 of file con_comp.h.
{ return bottom_ - top_ + 1; }
int tesseract::ConComp::ID | ( | ) | const [inline] |
Definition at line 94 of file con_comp.h.
{ return id_; }
int tesseract::ConComp::Left | ( | ) | const [inline] |
Definition at line 65 of file con_comp.h.
{ return left_; }
static int tesseract::ConComp::Left2RightComparer | ( | const void * | comp1, |
const void * | comp2 | ||
) | [inline, static] |
Definition at line 73 of file con_comp.h.
bool tesseract::ConComp::LeftMost | ( | ) | const [inline] |
Definition at line 89 of file con_comp.h.
{ return left_most_; }
bool tesseract::ConComp::Merge | ( | ConComp * | con_comp | ) |
Definition at line 83 of file con_comp.cpp.
{ if (head_ == NULL || tail_ == NULL || concomp->head_ == NULL || concomp->tail_ == NULL) { return false; } tail_->SetNext(concomp->head_); tail_ = concomp->tail_; left_ = left_ <= concomp->left_ ? left_ : concomp->left_; top_ = top_ <= concomp->top_ ? top_ : concomp->top_; right_ = right_ >= concomp->right_ ? right_ : concomp->right_; bottom_ = bottom_ >= concomp->bottom_ ? bottom_ : concomp->bottom_; pt_cnt_ += concomp->pt_cnt_; concomp->head_ = NULL; concomp->tail_ = NULL; return true; }
int tesseract::ConComp::PtCnt | ( | ) | const [inline] |
Definition at line 96 of file con_comp.h.
{ return pt_cnt_; }
int tesseract::ConComp::Right | ( | ) | const [inline] |
Definition at line 67 of file con_comp.h.
{ return right_; }
static int tesseract::ConComp::Right2LeftComparer | ( | const void * | comp1, |
const void * | comp2 | ||
) | [inline, static] |
Definition at line 82 of file con_comp.h.
{ return (*(reinterpret_cast<ConComp * const *>(comp2)))->right_ - (*(reinterpret_cast<ConComp * const *>(comp1)))->right_; }
bool tesseract::ConComp::RightMost | ( | ) | const [inline] |
Definition at line 90 of file con_comp.h.
{ return right_most_; }
ConComp ** tesseract::ConComp::Segment | ( | int | max_hist_wnd, |
int * | concomp_cnt | ||
) |
Definition at line 189 of file con_comp.cpp.
{ // init (*concomp_cnt) = 0; // No pts if (head_ == NULL) { return NULL; } int seg_pt_cnt = 0; // create the histogram int *hist_array = CreateHistogram(max_hist_wnd); if (hist_array == NULL) { return NULL; } int *x_seg_pt = SegmentHistogram(hist_array, &seg_pt_cnt); // free histogram delete []hist_array; // no segments, nothing to do if (seg_pt_cnt == 0) { return NULL; } // create concomp array ConComp **concomp_array = new ConComp *[seg_pt_cnt + 1]; if (concomp_array == NULL) { delete []x_seg_pt; return NULL; } for (int concomp = 0; concomp <= seg_pt_cnt; concomp++) { concomp_array[concomp] = new ConComp(); if (concomp_array[concomp] == NULL) { delete []x_seg_pt; delete []concomp_array; return NULL; } // split concomps inherit the ID this concomp concomp_array[concomp]->SetID(id_); } // set the left and right most attributes of the // appropriate concomps concomp_array[0]->left_most_ = true; concomp_array[seg_pt_cnt]->right_most_ = true; // assign pts to concomps ConCompPt *pt_ptr = head_; while (pt_ptr != NULL) { int seg_pt; // find the first seg-pt that exceeds the x value // of the pt for (seg_pt = 0; seg_pt < seg_pt_cnt; seg_pt++) { if ((x_seg_pt[seg_pt] + left_) > pt_ptr->x()) { break; } } // add the pt to the proper concomp if (concomp_array[seg_pt]->Add(pt_ptr->x(), pt_ptr->y()) == false) { delete []x_seg_pt; delete []concomp_array; return NULL; } pt_ptr = pt_ptr->Next(); } delete []x_seg_pt; (*concomp_cnt) = (seg_pt_cnt + 1); return concomp_array; }
int * tesseract::ConComp::SegmentHistogram | ( | int * | hist_array, |
int * | seg_pt_cnt | ||
) |
Definition at line 143 of file con_comp.cpp.
{ // init (*seg_pt_cnt) = 0; int wid = right_ - left_ + 1, hgt = bottom_ - top_ + 1; int *x_seg_pt = new int[wid]; if (x_seg_pt == NULL) { return NULL; } int seg_pt_wnd = static_cast<int>(hgt * SEG_PT_WND_RATIO); if (seg_pt_wnd > 1) { seg_pt_wnd = 1; } for (int x = 2; x < (wid - 2); x++) { if (hist_array[x] < hist_array[x - 1] && hist_array[x] < hist_array[x - 2] && hist_array[x] <= hist_array[x + 1] && hist_array[x] <= hist_array[x + 2]) { x_seg_pt[(*seg_pt_cnt)++] = x; x += seg_pt_wnd; } else if (hist_array[x] <= hist_array[x - 1] && hist_array[x] <= hist_array[x - 2] && hist_array[x] < hist_array[x + 1] && hist_array[x] < hist_array[x + 2]) { x_seg_pt[(*seg_pt_cnt)++] = x; x += seg_pt_wnd; } } // no segments, nothing to do if ((*seg_pt_cnt) == 0) { delete []x_seg_pt; return NULL; } return x_seg_pt; }
void tesseract::ConComp::SetID | ( | int | id | ) | [inline] |
Definition at line 95 of file con_comp.h.
{ id_ = id; }
void tesseract::ConComp::SetLeftMost | ( | bool | left_most | ) | [inline] |
Definition at line 91 of file con_comp.h.
{ left_most_ = left_most; }
void tesseract::ConComp::SetRightMost | ( | bool | right_most | ) | [inline] |
Definition at line 92 of file con_comp.h.
{ right_most_ = right_most; }
void tesseract::ConComp::Shift | ( | int | dx, |
int | dy | ||
) |
Definition at line 271 of file con_comp.cpp.
{ ConCompPt *pt_ptr = head_; while (pt_ptr != NULL) { pt_ptr->Shift(dx, dy); pt_ptr = pt_ptr->Next(); } left_ += dx; right_ += dx; top_ += dy; bottom_ += dy; }
int tesseract::ConComp::Top | ( | ) | const [inline] |
Definition at line 66 of file con_comp.h.
{ return top_; }
int tesseract::ConComp::Width | ( | ) | const [inline] |
Definition at line 69 of file con_comp.h.
{ return right_ - left_ + 1; }