tesseract  4.00.00dev
blobs.cpp File Reference
#include "blobs.h"
#include "ccstruct.h"
#include "clst.h"
#include "cutil.h"
#include "emalloc.h"
#include "helpers.h"
#include "linlsq.h"
#include "ndminx.h"
#include "normalis.h"
#include "ocrblock.h"
#include "ocrrow.h"
#include "points.h"
#include "polyaprx.h"
#include "structures.h"
#include "werd.h"

Go to the source code of this file.

Functions

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

Variables

const TPOINT kDivisibleVerticalUpright (0, 1)
 
const TPOINT kDivisibleVerticalItalic (1, 5)
 

Function Documentation

◆ CLISTIZE()

CLISTIZE ( EDGEPT  )

◆ divide_blobs()

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

Definition at line 981 of file blobs.cpp.

982  {
983  TPOINT vertical = italic_blob ? kDivisibleVerticalItalic
985  TESSLINE *outline1 = NULL;
986  TESSLINE *outline2 = NULL;
987 
988  TESSLINE *outline = blob->outlines;
989  blob->outlines = NULL;
990  int location_prod = CROSS(location, vertical);
991 
992  while (outline != NULL) {
993  TPOINT mid_pt(
994  static_cast<inT16>((outline->topleft.x + outline->botright.x) / 2),
995  static_cast<inT16>((outline->topleft.y + outline->botright.y) / 2));
996  int mid_prod = CROSS(mid_pt, vertical);
997  if (mid_prod < location_prod) {
998  // Outline is in left blob.
999  if (outline1)
1000  outline1->next = outline;
1001  else
1002  blob->outlines = outline;
1003  outline1 = outline;
1004  } else {
1005  // Outline is in right blob.
1006  if (outline2)
1007  outline2->next = outline;
1008  else
1009  other_blob->outlines = outline;
1010  outline2 = outline;
1011  }
1012  outline = outline->next;
1013  }
1014 
1015  if (outline1)
1016  outline1->next = NULL;
1017  if (outline2)
1018  outline2->next = NULL;
1019 }
TESSLINE * next
Definition: blobs.h:258
const TPOINT kDivisibleVerticalUpright(0, 1)
#define CROSS(a, b)
Definition: vecfuncs.h:52
TESSLINE * outlines
Definition: blobs.h:377
TPOINT botright
Definition: blobs.h:254
inT16 x
Definition: blobs.h:71
TPOINT topleft
Definition: blobs.h:253
inT16 y
Definition: blobs.h:72
const TPOINT kDivisibleVerticalItalic(1, 5)
Definition: blobs.h:50

◆ divisible_blob()

bool divisible_blob ( TBLOB blob,
bool  italic_blob,
TPOINT location 
)

Definition at line 932 of file blobs.cpp.

932  {
933  if (blob->outlines == NULL || blob->outlines->next == NULL)
934  return false; // Need at least 2 outlines for it to be possible.
935  int max_gap = 0;
936  TPOINT vertical = italic_blob ? kDivisibleVerticalItalic
938  for (TESSLINE* outline1 = blob->outlines; outline1 != NULL;
939  outline1 = outline1->next) {
940  if (outline1->is_hole)
941  continue; // Holes do not count as separable.
942  TPOINT mid_pt1(
943  static_cast<inT16>((outline1->topleft.x + outline1->botright.x) / 2),
944  static_cast<inT16>((outline1->topleft.y + outline1->botright.y) / 2));
945  int mid_prod1 = CROSS(mid_pt1, vertical);
946  int min_prod1, max_prod1;
947  outline1->MinMaxCrossProduct(vertical, &min_prod1, &max_prod1);
948  for (TESSLINE* outline2 = outline1->next; outline2 != NULL;
949  outline2 = outline2->next) {
950  if (outline2->is_hole)
951  continue; // Holes do not count as separable.
952  TPOINT mid_pt2(
953  static_cast<inT16>((outline2->topleft.x + outline2->botright.x) / 2),
954  static_cast<inT16>((outline2->topleft.y + outline2->botright.y) / 2));
955  int mid_prod2 = CROSS(mid_pt2, vertical);
956  int min_prod2, max_prod2;
957  outline2->MinMaxCrossProduct(vertical, &min_prod2, &max_prod2);
958  int mid_gap = abs(mid_prod2 - mid_prod1);
959  int overlap = MIN(max_prod1, max_prod2) - MAX(min_prod1, min_prod2);
960  if (mid_gap - overlap / 4 > max_gap) {
961  max_gap = mid_gap - overlap / 4;
962  *location = mid_pt1;
963  *location += mid_pt2;
964  *location /= 2;
965  }
966  }
967  }
968  // Use the y component of the vertical vector as an approximation to its
969  // length.
970  return max_gap > vertical.y;
971 }
TESSLINE * next
Definition: blobs.h:258
const TPOINT kDivisibleVerticalUpright(0, 1)
#define CROSS(a, b)
Definition: vecfuncs.h:52
TESSLINE * outlines
Definition: blobs.h:377
#define MAX(x, y)
Definition: ndminx.h:24
inT16 y
Definition: blobs.h:72
const TPOINT kDivisibleVerticalItalic(1, 5)
#define MIN(x, y)
Definition: ndminx.h:28
Definition: blobs.h:50

Variable Documentation

◆ kDivisibleVerticalItalic

const TPOINT kDivisibleVerticalItalic(1, 5)

◆ kDivisibleVerticalUpright

const TPOINT kDivisibleVerticalUpright(0, 1)