tesseract  4.1.0
blobs.h File Reference
#include <cstdint>
#include <cstring>
#include "clst.h"
#include "genericvector.h"
#include "normalis.h"
#include "points.h"
#include "publictypes.h"
#include "rect.h"
#include "scrollview.h"
#include "vecfuncs.h"

Go to the source code of this file.

Classes

struct  TPOINT
 
struct  EDGEPT
 
struct  TESSLINE
 
struct  TBLOB
 
struct  TWERD
 

Macros

#define EDGEPTFLAGS   4 /*concavity,length etc. */
 

Typedefs

using VECTOR = TPOINT
 

Functions

bool divisible_blob (TBLOB *blob, bool italic_blob, TPOINT *location)
 
void divide_blobs (TBLOB *blob, TBLOB *other_blob, bool italic_blob, const TPOINT &location)
 

Macro Definition Documentation

#define EDGEPTFLAGS   4 /*concavity,length etc. */

Definition at line 50 of file blobs.h.

Typedef Documentation

using VECTOR = TPOINT

Definition at line 76 of file blobs.h.

Function Documentation

void divide_blobs ( TBLOB blob,
TBLOB other_blob,
bool  italic_blob,
const TPOINT location 
)

Definition at line 966 of file blobs.cpp.

967  {
968  TPOINT vertical =
970  TESSLINE* outline1 = nullptr;
971  TESSLINE* outline2 = nullptr;
972 
973  TESSLINE* outline = blob->outlines;
974  blob->outlines = nullptr;
975  int location_prod = CROSS(location, vertical);
976 
977  while (outline != nullptr) {
978  TPOINT mid_pt(
979  static_cast<int16_t>((outline->topleft.x + outline->botright.x) / 2),
980  static_cast<int16_t>((outline->topleft.y + outline->botright.y) / 2));
981  int mid_prod = CROSS(mid_pt, vertical);
982  if (mid_prod < location_prod) {
983  // Outline is in left blob.
984  if (outline1)
985  outline1->next = outline;
986  else
987  blob->outlines = outline;
988  outline1 = outline;
989  } else {
990  // Outline is in right blob.
991  if (outline2)
992  outline2->next = outline;
993  else
994  other_blob->outlines = outline;
995  outline2 = outline;
996  }
997  outline = outline->next;
998  }
999 
1000  if (outline1) outline1->next = nullptr;
1001  if (outline2) outline2->next = nullptr;
1002 }
TESSLINE * next
Definition: blobs.h:260
int16_t x
Definition: blobs.h:73
TESSLINE * outlines
Definition: blobs.h:379
TPOINT topleft
Definition: blobs.h:255
TPOINT botright
Definition: blobs.h:256
const TPOINT kDivisibleVerticalUpright(0, 1)
int16_t y
Definition: blobs.h:74
Definition: blobs.h:52
#define CROSS(a, b)
Definition: vecfuncs.h:47
const TPOINT kDivisibleVerticalItalic(1, 5)
bool divisible_blob ( TBLOB blob,
bool  italic_blob,
TPOINT location 
)

Definition at line 917 of file blobs.cpp.

917  {
918  if (blob->outlines == nullptr || blob->outlines->next == nullptr)
919  return false; // Need at least 2 outlines for it to be possible.
920  int max_gap = 0;
921  TPOINT vertical =
923  for (TESSLINE* outline1 = blob->outlines; outline1 != nullptr;
924  outline1 = outline1->next) {
925  if (outline1->is_hole) continue; // Holes do not count as separable.
926  TPOINT mid_pt1(
927  static_cast<int16_t>((outline1->topleft.x + outline1->botright.x) / 2),
928  static_cast<int16_t>((outline1->topleft.y + outline1->botright.y) / 2));
929  int mid_prod1 = CROSS(mid_pt1, vertical);
930  int min_prod1, max_prod1;
931  outline1->MinMaxCrossProduct(vertical, &min_prod1, &max_prod1);
932  for (TESSLINE* outline2 = outline1->next; outline2 != nullptr;
933  outline2 = outline2->next) {
934  if (outline2->is_hole) continue; // Holes do not count as separable.
935  TPOINT mid_pt2(static_cast<int16_t>(
936  (outline2->topleft.x + outline2->botright.x) / 2),
937  static_cast<int16_t>(
938  (outline2->topleft.y + outline2->botright.y) / 2));
939  int mid_prod2 = CROSS(mid_pt2, vertical);
940  int min_prod2, max_prod2;
941  outline2->MinMaxCrossProduct(vertical, &min_prod2, &max_prod2);
942  int mid_gap = abs(mid_prod2 - mid_prod1);
943  int overlap =
944  std::min(max_prod1, max_prod2) - std::max(min_prod1, min_prod2);
945  if (mid_gap - overlap / 4 > max_gap) {
946  max_gap = mid_gap - overlap / 4;
947  *location = mid_pt1;
948  *location += mid_pt2;
949  *location /= 2;
950  }
951  }
952  }
953  // Use the y component of the vertical vector as an approximation to its
954  // length.
955  return max_gap > vertical.y;
956 }
TESSLINE * next
Definition: blobs.h:260
TESSLINE * outlines
Definition: blobs.h:379
const TPOINT kDivisibleVerticalUpright(0, 1)
int16_t y
Definition: blobs.h:74
Definition: blobs.h:52
#define CROSS(a, b)
Definition: vecfuncs.h:47
const TPOINT kDivisibleVerticalItalic(1, 5)