tesseract  4.1.0
TBLOB Struct Reference

#include <blobs.h>

Public Member Functions

 TBLOB ()
 
 TBLOB (const TBLOB &src)
 
 ~TBLOB ()
 
TBLOBoperator= (const TBLOB &src)
 
TBLOBClassifyNormalizeIfNeeded () const
 
void CopyFrom (const TBLOB &src)
 
void Clear ()
 
void Normalize (const BLOCK *block, const FCOORD *rotation, const DENORM *predecessor, float x_origin, float y_origin, float x_scale, float y_scale, float final_xshift, float final_yshift, bool inverse, Pix *pix)
 
void Rotate (const FCOORD rotation)
 
void Move (const ICOORD vec)
 
void Scale (float factor)
 
void ComputeBoundingBoxes ()
 
int NumOutlines () const
 
TBOX bounding_box () const
 
bool SegmentCrossesOutline (const TPOINT &pt1, const TPOINT &pt2) const
 
bool Contains (const TPOINT &pt) const
 
void EliminateDuplicateOutlines ()
 
void CorrectBlobOrder (TBLOB *next)
 
const DENORMdenorm () const
 
void plot (ScrollView *window, ScrollView::Color color, ScrollView::Color child_color)
 
int BBArea () const
 
int ComputeMoments (FCOORD *center, FCOORD *second_moments) const
 
void GetPreciseBoundingBox (TBOX *precise_box) const
 
void GetEdgeCoords (const TBOX &box, GenericVector< GenericVector< int > > *x_coords, GenericVector< GenericVector< int > > *y_coords) const
 

Static Public Member Functions

static TBLOBPolygonalCopy (bool allow_detailed_fx, C_BLOB *src)
 
static TBLOBShallowCopy (const TBLOB &src)
 

Public Attributes

TESSLINEoutlines
 

Detailed Description

Definition at line 263 of file blobs.h.

Constructor & Destructor Documentation

TBLOB::TBLOB ( )
inline

Definition at line 264 of file blobs.h.

264 : outlines(nullptr) {}
TESSLINE * outlines
Definition: blobs.h:379
TBLOB::TBLOB ( const TBLOB src)
inline

Definition at line 265 of file blobs.h.

265  : outlines(nullptr) {
266  CopyFrom(src);
267  }
void CopyFrom(const TBLOB &src)
Definition: blobs.cpp:374
TESSLINE * outlines
Definition: blobs.h:379
TBLOB::~TBLOB ( )
inline

Definition at line 268 of file blobs.h.

268  {
269  Clear();
270  }
void Clear()
Definition: blobs.cpp:390

Member Function Documentation

int TBLOB::BBArea ( ) const
inline

Definition at line 351 of file blobs.h.

351  {
352  int total_area = 0;
353  for (TESSLINE* outline = outlines; outline != nullptr; outline = outline->next)
354  total_area += outline->BBArea();
355  return total_area;
356  }
TESSLINE * next
Definition: blobs.h:260
TESSLINE * outlines
Definition: blobs.h:379
TBOX TBLOB::bounding_box ( ) const

Definition at line 472 of file blobs.cpp.

472  {
473  if (outlines == nullptr) return TBOX(0, 0, 0, 0);
474  TESSLINE* outline = outlines;
475  TBOX box = outline->bounding_box();
476  for (outline = outline->next; outline != nullptr; outline = outline->next) {
477  box += outline->bounding_box();
478  }
479  return box;
480 }
TESSLINE * next
Definition: blobs.h:260
Definition: rect.h:34
TESSLINE * outlines
Definition: blobs.h:379
TBOX bounding_box() const
Definition: blobs.cpp:261
TBLOB * TBLOB::ClassifyNormalizeIfNeeded ( ) const

Definition at line 350 of file blobs.cpp.

350  {
351  TBLOB* rotated_blob = nullptr;
352  // If necessary, copy the blob and rotate it. The rotation is always
353  // +/- 90 degrees, as 180 was already taken care of.
354  if (denorm_.block() != nullptr &&
355  denorm_.block()->classify_rotation().y() != 0.0) {
356  TBOX box = bounding_box();
357  int x_middle = (box.left() + box.right()) / 2;
358  int y_middle = (box.top() + box.bottom()) / 2;
359  rotated_blob = new TBLOB(*this);
360  const FCOORD& rotation = denorm_.block()->classify_rotation();
361  // Move the rotated blob back to the same y-position so that we
362  // can still distinguish similar glyphs with differeny y-position.
363  float target_y =
365  (rotation.y() > 0 ? x_middle - box.left() : box.right() - x_middle);
366  rotated_blob->Normalize(nullptr, &rotation, &denorm_, x_middle, y_middle,
367  1.0f, 1.0f, 0.0f, target_y, denorm_.inverse(),
368  denorm_.pix());
369  }
370  return rotated_blob;
371 }
const BLOCK * block() const
Definition: normalis.h:273
int16_t top() const
Definition: rect.h:58
Definition: rect.h:34
Definition: points.h:188
FCOORD classify_rotation() const
Definition: ocrblock.h:141
TBLOB()
Definition: blobs.h:264
TBOX bounding_box() const
Definition: blobs.cpp:472
Definition: blobs.h:263
float y() const
Definition: points.h:210
const int kBlnBaselineOffset
Definition: normalis.h:25
int16_t right() const
Definition: rect.h:79
int16_t bottom() const
Definition: rect.h:65
bool inverse() const
Definition: normalis.h:252
int16_t left() const
Definition: rect.h:72
Pix * pix() const
Definition: normalis.h:246
void Normalize(const BLOCK *block, const FCOORD *rotation, const DENORM *predecessor, float x_origin, float y_origin, float x_scale, float y_scale, float final_xshift, float final_yshift, bool inverse, Pix *pix)
Definition: blobs.cpp:401
void TBLOB::Clear ( )

Definition at line 390 of file blobs.cpp.

390  {
391  for (TESSLINE* next_outline = nullptr; outlines != nullptr;
392  outlines = next_outline) {
393  next_outline = outlines->next;
394  delete outlines;
395  }
396 }
TESSLINE * next
Definition: blobs.h:260
TESSLINE * outlines
Definition: blobs.h:379
void TBLOB::ComputeBoundingBoxes ( )

Definition at line 450 of file blobs.cpp.

450  {
451  for (TESSLINE* outline = outlines; outline != nullptr;
452  outline = outline->next) {
453  outline->ComputeBoundingBox();
454  }
455 }
TESSLINE * next
Definition: blobs.h:260
TESSLINE * outlines
Definition: blobs.h:379
int TBLOB::ComputeMoments ( FCOORD center,
FCOORD second_moments 
) const

Definition at line 526 of file blobs.cpp.

526  {
527  // Compute 1st and 2nd moments of the original outline.
528  LLSQ accumulator;
529  TBOX box = bounding_box();
530  // Iterate the outlines, accumulating edges relative the box.botleft().
531  CollectEdges(box, nullptr, &accumulator, nullptr, nullptr);
532  *center = accumulator.mean_point() + box.botleft();
533  // The 2nd moments are just the standard deviation of the point positions.
534  double x2nd = sqrt(accumulator.x_variance());
535  double y2nd = sqrt(accumulator.y_variance());
536  if (x2nd < 1.0) x2nd = 1.0;
537  if (y2nd < 1.0) y2nd = 1.0;
538  second_moments->set_x(x2nd);
539  second_moments->set_y(y2nd);
540  return accumulator.count();
541 }
Definition: rect.h:34
void set_x(float xin)
rewrite function
Definition: points.h:214
TBOX bounding_box() const
Definition: blobs.cpp:472
void set_y(float yin)
rewrite function
Definition: points.h:218
const ICOORD & botleft() const
Definition: rect.h:92
double x_variance() const
Definition: linlsq.h:81
Definition: linlsq.h:28
double y_variance() const
Definition: linlsq.h:87
FCOORD mean_point() const
Definition: linlsq.cpp:166
int32_t count() const
Definition: linlsq.h:43
bool TBLOB::Contains ( const TPOINT pt) const
inline

Definition at line 326 of file blobs.h.

326  {
327  for (const TESSLINE* outline = outlines; outline != nullptr;
328  outline = outline->next) {
329  if (outline->Contains(pt)) return true;
330  }
331  return false;
332  }
TESSLINE * next
Definition: blobs.h:260
TESSLINE * outlines
Definition: blobs.h:379
void TBLOB::CopyFrom ( const TBLOB src)

Definition at line 374 of file blobs.cpp.

374  {
375  Clear();
376  TESSLINE* prev_outline = nullptr;
377  for (TESSLINE* srcline = src.outlines; srcline != nullptr;
378  srcline = srcline->next) {
379  auto* new_outline = new TESSLINE(*srcline);
380  if (outlines == nullptr)
381  outlines = new_outline;
382  else
383  prev_outline->next = new_outline;
384  prev_outline = new_outline;
385  }
386  denorm_ = src.denorm_;
387 }
TESSLINE * next
Definition: blobs.h:260
TESSLINE * outlines
Definition: blobs.h:379
void Clear()
Definition: blobs.cpp:390
void TBLOB::CorrectBlobOrder ( TBLOB next)

Definition at line 505 of file blobs.cpp.

505  {
506  TBOX box = bounding_box();
507  TBOX next_box = next->bounding_box();
508  if (box.x_middle() > next_box.x_middle()) {
509  Swap(&outlines, &next->outlines);
510  }
511 }
Definition: rect.h:34
void Swap(T *p1, T *p2)
Definition: helpers.h:95
TBOX bounding_box() const
Definition: blobs.cpp:472
TESSLINE * outlines
Definition: blobs.h:379
int x_middle() const
Definition: rect.h:85
const DENORM& TBLOB::denorm ( ) const
inline

Definition at line 342 of file blobs.h.

342  {
343  return denorm_;
344  }
void TBLOB::EliminateDuplicateOutlines ( )

Definition at line 484 of file blobs.cpp.

484  {
485  for (TESSLINE* outline = outlines; outline != nullptr;
486  outline = outline->next) {
487  TESSLINE* last_outline = outline;
488  for (TESSLINE* other_outline = outline->next; other_outline != nullptr;
489  last_outline = other_outline, other_outline = other_outline->next) {
490  if (outline->SameBox(*other_outline)) {
491  last_outline->next = other_outline->next;
492  // This doesn't leak - the outlines share the EDGEPTs.
493  other_outline->loop = nullptr;
494  delete other_outline;
495  other_outline = last_outline;
496  // If it is part of a cut, then it can't be a hole any more.
497  outline->is_hole = false;
498  }
499  }
500  }
501 }
TESSLINE * next
Definition: blobs.h:260
TESSLINE * outlines
Definition: blobs.h:379
EDGEPT * loop
Definition: blobs.h:259
bool is_hole
Definition: blobs.h:258
void TBLOB::GetEdgeCoords ( const TBOX box,
GenericVector< GenericVector< int > > *  x_coords,
GenericVector< GenericVector< int > > *  y_coords 
) const

Definition at line 561 of file blobs.cpp.

563  {
564  GenericVector<int> empty;
565  x_coords->init_to_size(box.height(), empty);
566  y_coords->init_to_size(box.width(), empty);
567  CollectEdges(box, nullptr, nullptr, x_coords, y_coords);
568  // Sort the output vectors.
569  for (int i = 0; i < x_coords->size(); ++i) (*x_coords)[i].sort();
570  for (int i = 0; i < y_coords->size(); ++i) (*y_coords)[i].sort();
571 }
void init_to_size(int size, const T &t)
int16_t height() const
Definition: rect.h:108
int16_t width() const
Definition: rect.h:115
int size() const
Definition: genericvector.h:70
void TBLOB::GetPreciseBoundingBox ( TBOX precise_box) const

Definition at line 545 of file blobs.cpp.

545  {
546  TBOX box = bounding_box();
547  *precise_box = TBOX();
548  CollectEdges(box, precise_box, nullptr, nullptr, nullptr);
549  precise_box->move(box.botleft());
550 }
Definition: rect.h:34
TBOX bounding_box() const
Definition: blobs.cpp:472
const ICOORD & botleft() const
Definition: rect.h:92
void move(const ICOORD vec)
Definition: rect.h:157
void TBLOB::Move ( const ICOORD  vec)

Definition at line 434 of file blobs.cpp.

434  {
435  for (TESSLINE* outline = outlines; outline != nullptr;
436  outline = outline->next) {
437  outline->Move(vec);
438  }
439 }
TESSLINE * next
Definition: blobs.h:260
TESSLINE * outlines
Definition: blobs.h:379
void TBLOB::Normalize ( const BLOCK block,
const FCOORD rotation,
const DENORM predecessor,
float  x_origin,
float  y_origin,
float  x_scale,
float  y_scale,
float  final_xshift,
float  final_yshift,
bool  inverse,
Pix *  pix 
)

Definition at line 401 of file blobs.cpp.

404  {
405  denorm_.SetupNormalization(block, rotation, predecessor, x_origin, y_origin,
406  x_scale, y_scale, final_xshift, final_yshift);
407  denorm_.set_inverse(inverse);
408  denorm_.set_pix(pix);
409  // TODO(rays) outline->Normalize is more accurate, but breaks tests due
410  // the changes it makes. Reinstate this code with a retraining.
411  // The reason this change is troublesome is that it normalizes for the
412  // baseline value computed independently at each x-coord. If the baseline
413  // is not horizontal, this introduces shear into the normalized blob, which
414  // is useful on the rare occasions that the baseline is really curved, but
415  // the baselines need to be stabilized the rest of the time.
416 #if 0
417  for (TESSLINE* outline = outlines; outline != nullptr; outline = outline->next) {
418  outline->Normalize(denorm_);
419  }
420 #else
421  denorm_.LocalNormBlob(this);
422 #endif
423 }
TESSLINE * next
Definition: blobs.h:260
TESSLINE * outlines
Definition: blobs.h:379
void set_pix(Pix *pix)
Definition: normalis.h:249
void LocalNormBlob(TBLOB *blob) const
Definition: normalis.cpp:412
void SetupNormalization(const BLOCK *block, const FCOORD *rotation, const DENORM *predecessor, float x_origin, float y_origin, float x_scale, float y_scale, float final_xshift, float final_yshift)
Definition: normalis.cpp:96
void set_inverse(bool value)
Definition: normalis.h:255
int TBLOB::NumOutlines ( ) const

Definition at line 458 of file blobs.cpp.

458  {
459  int result = 0;
460  for (TESSLINE* outline = outlines; outline != nullptr;
461  outline = outline->next)
462  ++result;
463  return result;
464 }
TESSLINE * next
Definition: blobs.h:260
TESSLINE * outlines
Definition: blobs.h:379
TBLOB& TBLOB::operator= ( const TBLOB src)
inline

Definition at line 271 of file blobs.h.

271  {
272  CopyFrom(src);
273  return *this;
274  }
void CopyFrom(const TBLOB &src)
Definition: blobs.cpp:374
void TBLOB::plot ( ScrollView window,
ScrollView::Color  color,
ScrollView::Color  child_color 
)

Definition at line 514 of file blobs.cpp.

515  {
516  for (TESSLINE* outline = outlines; outline != nullptr;
517  outline = outline->next)
518  outline->plot(window, color, child_color);
519 }
TESSLINE * next
Definition: blobs.h:260
TESSLINE * outlines
Definition: blobs.h:379
TBLOB * TBLOB::PolygonalCopy ( bool  allow_detailed_fx,
C_BLOB src 
)
static

Definition at line 331 of file blobs.cpp.

331  {
332  auto* tblob = new TBLOB;
333  ApproximateOutlineList(allow_detailed_fx, src->out_list(), false,
334  &tblob->outlines);
335  return tblob;
336 }
C_OUTLINE_LIST * out_list()
Definition: stepblob.h:70
TBLOB()
Definition: blobs.h:264
void TBLOB::Rotate ( const FCOORD  rotation)

Definition at line 426 of file blobs.cpp.

426  {
427  for (TESSLINE* outline = outlines; outline != nullptr;
428  outline = outline->next) {
429  outline->Rotate(rotation);
430  }
431 }
TESSLINE * next
Definition: blobs.h:260
TESSLINE * outlines
Definition: blobs.h:379
void TBLOB::Scale ( float  factor)

Definition at line 442 of file blobs.cpp.

442  {
443  for (TESSLINE* outline = outlines; outline != nullptr;
444  outline = outline->next) {
445  outline->Scale(factor);
446  }
447 }
TESSLINE * next
Definition: blobs.h:260
TESSLINE * outlines
Definition: blobs.h:379
bool TBLOB::SegmentCrossesOutline ( const TPOINT pt1,
const TPOINT pt2 
) const
inline

Definition at line 318 of file blobs.h.

318  {
319  for (const TESSLINE* outline = outlines; outline != nullptr;
320  outline = outline->next) {
321  if (outline->SegmentCrosses(pt1, pt2)) return true;
322  }
323  return false;
324  }
TESSLINE * next
Definition: blobs.h:260
TESSLINE * outlines
Definition: blobs.h:379
TBLOB * TBLOB::ShallowCopy ( const TBLOB src)
static

Definition at line 339 of file blobs.cpp.

339  {
340  auto* blob = new TBLOB;
341  blob->denorm_ = src.denorm_;
342  return blob;
343 }
TBLOB()
Definition: blobs.h:264

Member Data Documentation

TESSLINE* TBLOB::outlines

Definition at line 379 of file blobs.h.


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