tesseract v5.3.3.20231005
tesseract::SEAM Class Reference

#include <seam.h>

Public Member Functions

 SEAM (float priority, const TPOINT &location)
 
 SEAM (float priority, const TPOINT &location, const SPLIT &split)
 
float priority () const
 
void set_priority (float priority)
 
bool HasAnySplits () const
 
TBOX bounding_box () const
 
bool CombineableWith (const SEAM &other, int max_x_dist, float max_total_priority) const
 
void CombineWith (const SEAM &other)
 
bool ContainedByBlob (const TBLOB &blob) const
 
bool UsesPoint (const EDGEPT *point) const
 
bool SharesPosition (const SEAM &other) const
 
bool OverlappingSplits (const SEAM &other) const
 
void Finalize ()
 
bool IsHealthy (const TBLOB &blob, int min_points, int min_area) const
 
bool PrepareToInsertSeam (const std::vector< SEAM * > &seams, const std::vector< TBLOB * > &blobs, int insert_index, bool modify)
 
bool FindBlobWidth (const std::vector< TBLOB * > &blobs, int index, bool modify)
 
void ApplySeam (bool italic_blob, TBLOB *blob, TBLOB *other_blob) const
 
void UndoSeam (TBLOB *blob, TBLOB *other_blob) const
 
void Print (const char *label) const
 
void Mark (ScrollView *window) const
 
void Hide () const
 
void Reveal () const
 
float FullPriority (int xmin, int xmax, double overlap_knob, int centered_maxwidth, double center_knob, double width_change_knob) const
 

Static Public Member Functions

static void PrintSeams (const char *label, const std::vector< SEAM * > &seams)
 
static void BreakPieces (const std::vector< SEAM * > &seams, const std::vector< TBLOB * > &blobs, int first, int last)
 
static void JoinPieces (const std::vector< SEAM * > &seams, const std::vector< TBLOB * > &blobs, int first, int last)
 

Detailed Description

Definition at line 33 of file seam.h.

Constructor & Destructor Documentation

◆ SEAM() [1/2]

tesseract::SEAM::SEAM ( float  priority,
const TPOINT location 
)
inline

Definition at line 36 of file seam.h.

37 : priority_(priority), location_(location), num_splits_(0) {}
float priority() const
Definition: seam.h:46

◆ SEAM() [2/2]

tesseract::SEAM::SEAM ( float  priority,
const TPOINT location,
const SPLIT split 
)
inline

Definition at line 39 of file seam.h.

40 : priority_(priority), location_(location), num_splits_(1) {
41 splits_[0] = split;
42 }
const std::vector< std::string > split(const std::string &s, char c)
Definition: helpers.h:43

Member Function Documentation

◆ ApplySeam()

void tesseract::SEAM::ApplySeam ( bool  italic_blob,
TBLOB blob,
TBLOB other_blob 
) const

Definition at line 106 of file seam.cpp.

106 {
107 for (int s = 0; s < num_splits_; ++s) {
108 splits_[s].SplitOutlineList(blob->outlines);
109 }
110 blob->ComputeBoundingBoxes();
111
112 divide_blobs(blob, other_blob, italic_blob, location_);
113
114 blob->EliminateDuplicateOutlines();
115 other_blob->EliminateDuplicateOutlines();
116
117 blob->CorrectBlobOrder(other_blob);
118}
void divide_blobs(TBLOB *blob, TBLOB *other_blob, bool italic_blob, const TPOINT &location)
Definition: blobs.cpp:970
void SplitOutlineList(TESSLINE *outlines) const
Definition: split.cpp:233

◆ bounding_box()

TBOX tesseract::SEAM::bounding_box ( ) const

Definition at line 33 of file seam.cpp.

33 {
34 TBOX box(location_.x, location_.y, location_.x, location_.y);
35 for (int s = 0; s < num_splits_; ++s) {
36 box += splits_[s].bounding_box();
37 }
38 return box;
39}
@ TBOX
TDimension x
Definition: blobs.h:89
TDimension y
Definition: blobs.h:90
TBOX bounding_box() const
Definition: split.h:38

◆ BreakPieces()

void tesseract::SEAM::BreakPieces ( const std::vector< SEAM * > &  seams,
const std::vector< TBLOB * > &  blobs,
int  first,
int  last 
)
static

Definition at line 181 of file seam.cpp.

182 {
183 for (int x = first; x < last; ++x) {
184 seams[x]->Reveal();
185 }
186
187 TESSLINE *outline = blobs[first]->outlines;
188 int next_blob = first + 1;
189
190 while (outline != nullptr && next_blob <= last) {
191 if (outline->next == blobs[next_blob]->outlines) {
192 outline->next = nullptr;
193 outline = blobs[next_blob]->outlines;
194 ++next_blob;
195 } else {
196 outline = outline->next;
197 }
198 }
199}
LIST last(LIST var_list)
Definition: oldlist.cpp:153

◆ CombineableWith()

bool tesseract::SEAM::CombineableWith ( const SEAM other,
int  max_x_dist,
float  max_total_priority 
) const
inline

Definition at line 60 of file seam.h.

60 {
61 int dist = location_.x - other.location_.x;
62 return -max_x_dist < dist && dist < max_x_dist &&
63 num_splits_ + other.num_splits_ <= kMaxNumSplits &&
64 priority_ + other.priority_ < max_total_priority && !OverlappingSplits(other) &&
65 !SharesPosition(other);
66 }
bool SharesPosition(const SEAM &other) const
Definition: seam.h:100
bool OverlappingSplits(const SEAM &other) const
Definition: seam.h:111

◆ CombineWith()

void tesseract::SEAM::CombineWith ( const SEAM other)
inline

Definition at line 69 of file seam.h.

69 {
70 priority_ += other.priority_;
71 location_ += other.location_;
72 location_ /= 2;
73
74 for (uint8_t s = 0; s < other.num_splits_ && num_splits_ < kMaxNumSplits; ++s) {
75 splits_[num_splits_++] = other.splits_[s];
76 }
77 }

◆ ContainedByBlob()

bool tesseract::SEAM::ContainedByBlob ( const TBLOB blob) const
inline

Definition at line 80 of file seam.h.

80 {
81 for (int s = 0; s < num_splits_; ++s) {
82 if (!splits_[s].ContainedByBlob(blob)) {
83 return false;
84 }
85 }
86 return true;
87 }
bool ContainedByBlob(const TBLOB &blob) const
Definition: seam.h:80

◆ Finalize()

void tesseract::SEAM::Finalize ( )
inline

Definition at line 126 of file seam.h.

126 {
127 for (int s = 0; s < num_splits_; ++s) {
128 splits_[s].point1->MarkChop();
129 splits_[s].point2->MarkChop();
130 }
131 }
void MarkChop()
Definition: blobs.h:187
EDGEPT * point2
Definition: split.h:107
EDGEPT * point1
Definition: split.h:106

◆ FindBlobWidth()

bool tesseract::SEAM::FindBlobWidth ( const std::vector< TBLOB * > &  blobs,
int  index,
bool  modify 
)

Definition at line 74 of file seam.cpp.

74 {
75 int num_found = 0;
76 if (modify) {
77 widthp_ = 0;
78 widthn_ = 0;
79 }
80 for (int s = 0; s < num_splits_; ++s) {
81 const SPLIT &split = splits_[s];
82 bool found_split = split.ContainedByBlob(*blobs[index]);
83 // Look right.
84 for (unsigned b = index + 1; !found_split && b < blobs.size(); ++b) {
85 found_split = split.ContainedByBlob(*blobs[b]);
86 if (found_split && b - index > widthp_ && modify) {
87 widthp_ = b - index;
88 }
89 }
90 // Look left.
91 for (int b = index - 1; !found_split && b >= 0; --b) {
92 found_split = split.ContainedByBlob(*blobs[b]);
93 if (found_split && index - b > widthn_ && modify) {
94 widthn_ = index - b;
95 }
96 }
97 if (found_split) {
98 ++num_found;
99 }
100 }
101 return num_found == num_splits_;
102}

◆ FullPriority()

float tesseract::SEAM::FullPriority ( int  xmin,
int  xmax,
double  overlap_knob,
int  centered_maxwidth,
double  center_knob,
double  width_change_knob 
) const

Definition at line 238 of file seam.cpp.

239 {
240 if (num_splits_ == 0) {
241 return 0.0f;
242 }
243 for (int s = 1; s < num_splits_; ++s) {
244 splits_[s].SplitOutline();
245 }
246 float full_priority =
247 priority_ + splits_[0].FullPriority(xmin, xmax, overlap_knob, centered_maxwidth, center_knob,
248 width_change_knob);
249 for (int s = num_splits_ - 1; s >= 1; --s) {
250 splits_[s].UnsplitOutlines();
251 }
252 return full_priority;
253}
void SplitOutline() const
Definition: split.cpp:254
void UnsplitOutlines() const
Definition: split.cpp:295
float FullPriority(int xmin, int xmax, double overlap_knob, int centered_maxwidth, double center_knob, double width_change_knob) const
Definition: split.cpp:74

◆ HasAnySplits()

bool tesseract::SEAM::HasAnySplits ( ) const
inline

Definition at line 52 of file seam.h.

52 {
53 return num_splits_ > 0;
54 }

◆ Hide()

void tesseract::SEAM::Hide ( ) const

Definition at line 224 of file seam.cpp.

224 {
225 for (int s = 0; s < num_splits_; ++s) {
226 splits_[s].Hide();
227 }
228}
void Hide() const
Definition: split.cpp:44

◆ IsHealthy()

bool tesseract::SEAM::IsHealthy ( const TBLOB blob,
int  min_points,
int  min_area 
) const

Definition at line 44 of file seam.cpp.

44 {
45 // TODO(rays) Try testing all the splits. Duplicating original code for now,
46 // which tested only the first.
47 return num_splits_ == 0 || splits_[0].IsHealthy(blob, min_points, min_area);
48}
bool IsHealthy(const TBLOB &blob, int min_points, int min_area) const
Definition: split.cpp:114

◆ JoinPieces()

void tesseract::SEAM::JoinPieces ( const std::vector< SEAM * > &  seams,
const std::vector< TBLOB * > &  blobs,
int  first,
int  last 
)
static

Definition at line 204 of file seam.cpp.

205 {
206 TESSLINE *outline = blobs[first]->outlines;
207 if (!outline) {
208 return;
209 }
210
211 for (int x = first; x < last; ++x) {
212 SEAM *seam = seams[x];
213 if (x - seam->widthn_ >= first && x + seam->widthp_ < last) {
214 seam->Hide();
215 }
216 while (outline->next) {
217 outline = outline->next;
218 }
219 outline->next = blobs[x + 1]->outlines;
220 }
221}
SEAM(float priority, const TPOINT &location)
Definition: seam.h:36

◆ Mark()

void tesseract::SEAM::Mark ( ScrollView window) const

Definition at line 171 of file seam.cpp.

171 {
172 for (int s = 0; s < num_splits_; ++s) {
173 splits_[s].Mark(window);
174 }
175}
void Mark(ScrollView *window) const
Definition: split.cpp:224

◆ OverlappingSplits()

bool tesseract::SEAM::OverlappingSplits ( const SEAM other) const
inline

Definition at line 111 of file seam.h.

111 {
112 for (int s = 0; s < num_splits_; ++s) {
113 TBOX split1_box = splits_[s].bounding_box();
114 for (int t = 0; t < other.num_splits_; ++t) {
115 TBOX split2_box = other.splits_[t].bounding_box();
116 if (split1_box.y_overlap(split2_box)) {
117 return true;
118 }
119 }
120 }
121 return false;
122 }

◆ PrepareToInsertSeam()

bool tesseract::SEAM::PrepareToInsertSeam ( const std::vector< SEAM * > &  seams,
const std::vector< TBLOB * > &  blobs,
int  insert_index,
bool  modify 
)

Definition at line 54 of file seam.cpp.

55 {
56 for (int s = 0; s < insert_index; ++s) {
57 if (!seams[s]->FindBlobWidth(blobs, s, modify)) {
58 return false;
59 }
60 }
61 if (!FindBlobWidth(blobs, insert_index, modify)) {
62 return false;
63 }
64 for (unsigned s = insert_index; s < seams.size(); ++s) {
65 if (!seams[s]->FindBlobWidth(blobs, s + 1, modify)) {
66 return false;
67 }
68 }
69 return true;
70}
bool FindBlobWidth(const std::vector< TBLOB * > &blobs, int index, bool modify)
Definition: seam.cpp:74

◆ Print()

void tesseract::SEAM::Print ( const char *  label) const

Definition at line 144 of file seam.cpp.

144 {
145 tprintf("%s", label);
146 tprintf(" %6.2f @ (%d,%d), p=%u, n=%u ", priority_, location_.x, location_.y, widthp_, widthn_);
147 for (int s = 0; s < num_splits_; ++s) {
148 splits_[s].Print();
149 if (s + 1 < num_splits_) {
150 tprintf(", ");
151 }
152 }
153 tprintf("\n");
154}
void tprintf(const char *format,...)
Definition: tprintf.cpp:41
void Print() const
Definition: split.cpp:218

◆ PrintSeams()

void tesseract::SEAM::PrintSeams ( const char *  label,
const std::vector< SEAM * > &  seams 
)
static

Definition at line 158 of file seam.cpp.

158 {
159 if (!seams.empty()) {
160 tprintf("%s\n", label);
161 for (unsigned x = 0; x < seams.size(); ++x) {
162 tprintf("%2u: ", x);
163 seams[x]->Print("");
164 }
165 tprintf("\n");
166 }
167}

◆ priority()

float tesseract::SEAM::priority ( ) const
inline

Definition at line 46 of file seam.h.

46 {
47 return priority_;
48 }

◆ Reveal()

void tesseract::SEAM::Reveal ( ) const

Definition at line 231 of file seam.cpp.

231 {
232 for (int s = 0; s < num_splits_; ++s) {
233 splits_[s].Reveal();
234 }
235}
void Reveal() const
Definition: split.cpp:58

◆ set_priority()

void tesseract::SEAM::set_priority ( float  priority)
inline

Definition at line 49 of file seam.h.

49 {
50 priority_ = priority;
51 }

◆ SharesPosition()

bool tesseract::SEAM::SharesPosition ( const SEAM other) const
inline

Definition at line 100 of file seam.h.

100 {
101 for (int s = 0; s < num_splits_; ++s) {
102 for (int t = 0; t < other.num_splits_; ++t) {
103 if (splits_[s].SharesPosition(other.splits_[t])) {
104 return true;
105 }
106 }
107 }
108 return false;
109 }

◆ UndoSeam()

void tesseract::SEAM::UndoSeam ( TBLOB blob,
TBLOB other_blob 
) const

Definition at line 122 of file seam.cpp.

122 {
123 if (blob->outlines == nullptr) {
124 blob->outlines = other_blob->outlines;
125 other_blob->outlines = nullptr;
126 }
127
128 TESSLINE *outline = blob->outlines;
129 while (outline->next) {
130 outline = outline->next;
131 }
132 outline->next = other_blob->outlines;
133 other_blob->outlines = nullptr;
134 delete other_blob;
135
136 for (int s = 0; s < num_splits_; ++s) {
137 splits_[s].UnsplitOutlineList(blob);
138 }
139 blob->ComputeBoundingBoxes();
140 blob->EliminateDuplicateOutlines();
141}
void UnsplitOutlineList(TBLOB *blob) const
Definition: split.cpp:279

◆ UsesPoint()

bool tesseract::SEAM::UsesPoint ( const EDGEPT point) const
inline

Definition at line 91 of file seam.h.

91 {
92 for (int s = 0; s < num_splits_; ++s) {
93 if (splits_[s].UsesPoint(point)) {
94 return true;
95 }
96 }
97 return false;
98 }
bool UsesPoint(const EDGEPT *point) const
Definition: seam.h:91

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