tesseract  4.1.1
blobbox.cpp File Reference
#include "blobbox.h"
#include <algorithm>
#include <cstdint>
#include "allheaders.h"
#include "blobs.h"
#include "coutln.h"
#include "environ.h"
#include "helpers.h"
#include "host.h"
#include "points.h"

Go to the source code of this file.

Macros

#define PROJECTION_MARGIN   10
 

Functions

void find_cblob_limits (C_BLOB *blob, float leftx, float rightx, FCOORD rotation, float &ymin, float &ymax)
 
void find_cblob_vlimits (C_BLOB *blob, float leftx, float rightx, float &ymin, float &ymax)
 
void find_cblob_hlimits (C_BLOB *blob, float bottomy, float topy, float &xmin, float &xmax)
 
C_BLOBcrotate_cblob (C_BLOB *blob, FCOORD rotation)
 
TBOX box_next (BLOBNBOX_IT *it)
 
TBOX box_next_pre_chopped (BLOBNBOX_IT *it)
 
void vertical_cblob_projection (C_BLOB *blob, STATS *stats)
 
void vertical_coutline_projection (C_OUTLINE *outline, STATS *stats)
 
void plot_blob_list (ScrollView *win, BLOBNBOX_LIST *list, ScrollView::Color body_colour, ScrollView::Color child_colour)
 

Variables

const double kCosSmallAngle = 0.866
 
const double kDefiniteAspectRatio = 2.0
 
const double kComplexShapePerimeterRatio = 1.5
 
const double kMinMediumSizeRatio = 0.25
 
const double kMaxMediumSizeRatio = 4.0
 

Macro Definition Documentation

◆ PROJECTION_MARGIN

#define PROJECTION_MARGIN   10

Definition at line 37 of file blobbox.cpp.

Function Documentation

◆ box_next()

TBOX box_next ( BLOBNBOX_IT *  it)

Definition at line 636 of file blobbox.cpp.

638  {
639  BLOBNBOX *blob; //current blob
640  TBOX result; //total box
641 
642  blob = it->data ();
643  result = blob->bounding_box ();
644  do {
645  it->forward ();
646  blob = it->data ();
647  if (blob->cblob() == nullptr)
648  //was pre-chopped
649  result += blob->bounding_box ();
650  }
651  //until next real blob
652  while ((blob->cblob() == nullptr) || blob->joined_to_prev());
653  return result;
654 }
C_BLOB * cblob() const
Definition: blobbox.h:268
bool joined_to_prev() const
Definition: blobbox.h:256
const TBOX & bounding_box() const
Definition: blobbox.h:230
Definition: rect.h:34

◆ box_next_pre_chopped()

TBOX box_next_pre_chopped ( BLOBNBOX_IT *  it)

Definition at line 665 of file blobbox.cpp.

667  {
668  BLOBNBOX *blob; //current blob
669  TBOX result; //total box
670 
671  blob = it->data ();
672  result = blob->bounding_box ();
673  do {
674  it->forward ();
675  blob = it->data ();
676  }
677  //until next real blob
678  while (blob->joined_to_prev ());
679  return result;
680 }

◆ crotate_cblob()

C_BLOB* crotate_cblob ( C_BLOB blob,
FCOORD  rotation 
)

Definition at line 611 of file blobbox.cpp.

614  {
615  C_OUTLINE_LIST out_list; //output outlines
616  //input outlines
617  C_OUTLINE_IT in_it = blob->out_list ();
618  //output outlines
619  C_OUTLINE_IT out_it = &out_list;
620 
621  for (in_it.mark_cycle_pt (); !in_it.cycled_list (); in_it.forward ()) {
622  out_it.add_after_then_move (new C_OUTLINE (in_it.data (), rotation));
623  }
624  return new C_BLOB (&out_list);
625 }
C_OUTLINE_LIST * out_list()
Definition: stepblob.h:70

◆ find_cblob_hlimits()

void find_cblob_hlimits ( C_BLOB blob,
float  bottomy,
float  topy,
float &  xmin,
float &  xmax 
)

Definition at line 576 of file blobbox.cpp.

581  {
582  int16_t stepindex; //current point
583  ICOORD pos; //current coords
584  ICOORD vec; //rotated step
585  C_OUTLINE *outline; //current outline
586  //outlines
587  C_OUTLINE_IT out_it = blob->out_list ();
588 
589  xmin = static_cast<float>(INT32_MAX);
590  xmax = static_cast<float>(-INT32_MAX);
591  for (out_it.mark_cycle_pt (); !out_it.cycled_list (); out_it.forward ()) {
592  outline = out_it.data ();
593  pos = outline->start_pos (); //get coords
594  for (stepindex = 0; stepindex < outline->pathlength (); stepindex++) {
595  //inside
596  if (pos.y () >= bottomy && pos.y () <= topy) {
597  UpdateRange(pos.x(), &xmin, &xmax);
598  }
599  vec = outline->step (stepindex);
600  pos += vec; //move to next
601  }
602  }
603 }
void UpdateRange(const T1 &x, T2 *lower_bound, T2 *upper_bound)
Definition: helpers.h:120
ICOORD step(int index) const
Definition: coutln.h:144
const ICOORD & start_pos() const
Definition: coutln.h:148
int32_t pathlength() const
Definition: coutln.h:135
integer coordinate
Definition: points.h:32
int16_t y() const
access_function
Definition: points.h:56
int16_t x() const
access function
Definition: points.h:52

◆ find_cblob_limits()

void find_cblob_limits ( C_BLOB blob,
float  leftx,
float  rightx,
FCOORD  rotation,
float &  ymin,
float &  ymax 
)

Definition at line 499 of file blobbox.cpp.

505  {
506  int16_t stepindex; //current point
507  ICOORD pos; //current coords
508  ICOORD vec; //rotated step
509  C_OUTLINE *outline; //current outline
510  //outlines
511  C_OUTLINE_IT out_it = blob->out_list ();
512 
513  ymin = static_cast<float>(INT32_MAX);
514  ymax = static_cast<float>(-INT32_MAX);
515  for (out_it.mark_cycle_pt (); !out_it.cycled_list (); out_it.forward ()) {
516  outline = out_it.data ();
517  pos = outline->start_pos (); //get coords
518  pos.rotate (rotation);
519  for (stepindex = 0; stepindex < outline->pathlength (); stepindex++) {
520  //inside
521  if (pos.x () >= leftx && pos.x () <= rightx) {
522  UpdateRange(pos.y(), &ymin, &ymax);
523  }
524  vec = outline->step (stepindex);
525  vec.rotate (rotation);
526  pos += vec; //move to next
527  }
528  }
529 }
void rotate(const FCOORD &vec)
Definition: points.h:536

◆ find_cblob_vlimits()

void find_cblob_vlimits ( C_BLOB blob,
float  leftx,
float  rightx,
float &  ymin,
float &  ymax 
)

Definition at line 539 of file blobbox.cpp.

544  {
545  int16_t stepindex; //current point
546  ICOORD pos; //current coords
547  ICOORD vec; //rotated step
548  C_OUTLINE *outline; //current outline
549  //outlines
550  C_OUTLINE_IT out_it = blob->out_list ();
551 
552  ymin = static_cast<float>(INT32_MAX);
553  ymax = static_cast<float>(-INT32_MAX);
554  for (out_it.mark_cycle_pt (); !out_it.cycled_list (); out_it.forward ()) {
555  outline = out_it.data ();
556  pos = outline->start_pos (); //get coords
557  for (stepindex = 0; stepindex < outline->pathlength (); stepindex++) {
558  //inside
559  if (pos.x () >= leftx && pos.x () <= rightx) {
560  UpdateRange(pos.y(), &ymin, &ymax);
561  }
562  vec = outline->step (stepindex);
563  pos += vec; //move to next
564  }
565  }
566 }

◆ plot_blob_list()

void plot_blob_list ( ScrollView win,
BLOBNBOX_LIST *  list,
ScrollView::Color  body_colour,
ScrollView::Color  child_colour 
)

Definition at line 1086 of file blobbox.cpp.

1089  { // colour of child
1090  BLOBNBOX_IT it = list;
1091  for (it.mark_cycle_pt(); !it.cycled_list(); it.forward()) {
1092  it.data()->plot(win, body_colour, child_colour);
1093  }
1094 }

◆ vertical_cblob_projection()

void vertical_cblob_projection ( C_BLOB blob,
STATS stats 
)

Definition at line 868 of file blobbox.cpp.

871  {
872  //outlines of blob
873  C_OUTLINE_IT out_it = blob->out_list ();
874 
875  for (out_it.mark_cycle_pt (); !out_it.cycled_list (); out_it.forward ()) {
876  vertical_coutline_projection (out_it.data (), stats);
877  }
878 }
void vertical_coutline_projection(C_OUTLINE *outline, STATS *stats)
Definition: blobbox.cpp:888

◆ vertical_coutline_projection()

void vertical_coutline_projection ( C_OUTLINE outline,
STATS stats 
)

Definition at line 888 of file blobbox.cpp.

891  {
892  ICOORD pos; //current point
893  ICOORD step; //edge step
894  int32_t length; //of outline
895  int16_t stepindex; //current step
896  C_OUTLINE_IT out_it = outline->child ();
897 
898  pos = outline->start_pos ();
899  length = outline->pathlength ();
900  for (stepindex = 0; stepindex < length; stepindex++) {
901  step = outline->step (stepindex);
902  if (step.x () > 0) {
903  stats->add (pos.x (), -pos.y ());
904  } else if (step.x () < 0) {
905  stats->add (pos.x () - 1, pos.y ());
906  }
907  pos += step;
908  }
909 
910  for (out_it.mark_cycle_pt (); !out_it.cycled_list (); out_it.forward ()) {
911  vertical_coutline_projection (out_it.data (), stats);
912  }
913 }
C_OUTLINE_LIST * child()
Definition: coutln.h:108
void add(int32_t value, int32_t count)
Definition: statistc.cpp:93

Variable Documentation

◆ kComplexShapePerimeterRatio

const double kComplexShapePerimeterRatio = 1.5

Definition at line 48 of file blobbox.cpp.

◆ kCosSmallAngle

const double kCosSmallAngle = 0.866

Definition at line 44 of file blobbox.cpp.

◆ kDefiniteAspectRatio

const double kDefiniteAspectRatio = 2.0

Definition at line 46 of file blobbox.cpp.

◆ kMaxMediumSizeRatio

const double kMaxMediumSizeRatio = 4.0

Definition at line 52 of file blobbox.cpp.

◆ kMinMediumSizeRatio

const double kMinMediumSizeRatio = 0.25

Definition at line 50 of file blobbox.cpp.