16#define _USE_MATH_DEFINES
19# include "config_auto.h"
29#include <allheaders.h>
39const int TrainingSample::kYShiftValues[kSampleYShiftSize] = {6, 3, -3, -6, 0};
40const double TrainingSample::kScaleValues[kSampleScaleSize] = {1.0625, 0.9375, 1.0};
44 delete[] micro_features_;
52 if (fwrite(&class_id_,
sizeof(class_id_), 1, fp) != 1) {
55 if (fwrite(&font_id_,
sizeof(font_id_), 1, fp) != 1) {
58 if (fwrite(&page_num_,
sizeof(page_num_), 1, fp) != 1) {
64 if (fwrite(&num_features_,
sizeof(num_features_), 1, fp) != 1) {
67 if (fwrite(&num_micro_features_,
sizeof(num_micro_features_), 1, fp) != 1) {
70 if (fwrite(&outline_length_,
sizeof(outline_length_), 1, fp) != 1) {
73 if (fwrite(features_,
sizeof(*features_), num_features_, fp) != num_features_) {
76 if (fwrite(micro_features_,
sizeof(*micro_features_), num_micro_features_, fp) !=
77 num_micro_features_) {
80 if (fwrite(cn_feature_,
sizeof(*cn_feature_), kNumCNParams, fp) != kNumCNParams) {
93 if (sample->DeSerialize(swap, fp)) {
103 if (fread(&class_id_,
sizeof(class_id_), 1, fp) != 1) {
106 if (fread(&font_id_,
sizeof(font_id_), 1, fp) != 1) {
109 if (fread(&page_num_,
sizeof(page_num_), 1, fp) != 1) {
115 if (fread(&num_features_,
sizeof(num_features_), 1, fp) != 1) {
118 if (fread(&num_micro_features_,
sizeof(num_micro_features_), 1, fp) != 1) {
121 if (fread(&outline_length_,
sizeof(outline_length_), 1, fp) != 1) {
125 ReverseN(&class_id_,
sizeof(class_id_));
126 ReverseN(&num_features_,
sizeof(num_features_));
127 ReverseN(&num_micro_features_,
sizeof(num_micro_features_));
128 ReverseN(&outline_length_,
sizeof(outline_length_));
131 if (num_features_ > UINT16_MAX) {
134 if (num_micro_features_ > UINT16_MAX) {
139 if (fread(features_,
sizeof(*features_), num_features_, fp) != num_features_) {
142 delete[] micro_features_;
143 micro_features_ =
new MicroFeature[num_micro_features_];
144 if (fread(micro_features_,
sizeof(*micro_features_), num_micro_features_, fp) !=
145 num_micro_features_) {
148 if (fread(cn_feature_,
sizeof(*cn_feature_), kNumCNParams, fp) != kNumCNParams) {
159 const TBOX &bounding_box,
165 sample->outline_length_ = fx_info.
Length;
177 sample->features_are_indexed_ =
false;
178 sample->features_are_mapped_ =
false;
185 for (
int i = 0;
i < kNumCNParams; ++
i) {
186 feature->Params[
i] = cn_feature_[
i];
196 if (index >= 0 && index < kSampleRandomSize) {
198 const int yshift = kYShiftValues[index / kSampleScaleSize];
199 double scaling = kScaleValues[index % kSampleScaleSize];
200 for (uint32_t
i = 0;
i < num_features_; ++
i) {
203 sample->features_[
i].
X = ClipToRange<int>(result + 0.5, 0, UINT8_MAX);
206 sample->features_[
i].
Y = ClipToRange<int>(result + 0.5, 0, UINT8_MAX);
215 sample->class_id_ = class_id_;
216 sample->font_id_ = font_id_;
217 sample->weight_ = weight_;
218 sample->sample_index_ = sample_index_;
219 sample->num_features_ = num_features_;
220 if (num_features_ > 0) {
222 memcpy(sample->features_, features_, num_features_ *
sizeof(features_[0]));
224 sample->num_micro_features_ = num_micro_features_;
225 if (num_micro_features_ > 0) {
226 sample->micro_features_ =
new MicroFeature[num_micro_features_];
227 memcpy(sample->micro_features_, micro_features_,
228 num_micro_features_ *
sizeof(micro_features_[0]));
230 memcpy(sample->cn_feature_, cn_feature_,
sizeof(*cn_feature_) * kNumCNParams);
231 memcpy(sample->geo_feature_, geo_feature_,
sizeof(*geo_feature_) *
GeoCount);
241 if (char_features ==
nullptr) {
248 for (uint32_t f = 0; f < num_features_; ++f) {
249 features_[f].
X =
static_cast<uint8_t
>(char_features->
Features[f]->Params[
IntX]);
250 features_[f].
Y =
static_cast<uint8_t
>(char_features->
Features[f]->Params[
IntY]);
256 delete[] micro_features_;
257 char_features = char_desc->
FeatureSets[micro_type];
258 if (char_features ==
nullptr) {
260 num_micro_features_ = 0;
261 micro_features_ =
nullptr;
264 micro_features_ =
new MicroFeature[num_micro_features_];
265 for (uint32_t f = 0; f < num_micro_features_; ++f) {
267 micro_features_[f][d] = char_features->
Features[f]->Params[d];
273 if (char_features ==
nullptr) {
274 tprintf(
"Error: no CN feature to train on.\n");
284 if (char_features ==
nullptr) {
285 tprintf(
"Error: no Geo feature to train on.\n");
308 for (uint32_t f = 0; f < num_features_; ++f) {
309 int start_x = features_[f].
X;
311 double dx = cos((features_[f].Theta / 256.0) * 2.0 * M_PI - M_PI);
312 double dy = -sin((features_[f].Theta / 256.0) * 2.0 * M_PI - M_PI);
313 for (
int i = 0;
i <= 5; ++
i) {
314 int x =
static_cast<int>(start_x + dx *
i);
315 int y =
static_cast<int>(start_y + dy *
i);
316 if (
x >= 0 && x < 256 && y >= 0 &&
y < 256) {
317 pixSetPixel(pix,
x,
y, 1);
321 if (unicharset !=
nullptr) {
327#ifndef GRAPHICS_DISABLED
331 for (uint32_t f = 0; f < num_features_; ++f) {
343 if (page_pix ==
nullptr) {
346 int page_width = pixGetWidth(page_pix);
347 int page_height = pixGetHeight(page_pix);
349 padded_box.
pad(padding, padding);
351 TBOX page_box(0, 0, page_width, page_height);
352 padded_box &= page_box;
354 boxCreate(page_box.
left(), page_height - page_box.
top(), page_box.
width(), page_box.
height());
355 Image sample_pix = pixClipRectangle(page_pix, box,
nullptr);
#define LENGTH_COMPRESSION
const int kIntFeatureExtent
void ReverseN(void *ptr, int num_bytes)
void tprintf(const char *format,...)
void RenderIntFeature(ScrollView *window, const INT_FEATURE_STRUCT *Feature, ScrollView::Color color)
const float MF_SCALE_FACTOR
const char *const kIntFeatureType
const int kRandomizingCenter
std::array< float,(int) MicroFeatureParameter::MFCount > MicroFeature
const FEATURE_DESC_STRUCT CharNormDesc
const char *const kMicroFeatureType
const int kBlnBaselineOffset
TDimension height() const
bool Serialize(FILE *fp) const
bool DeSerialize(bool swap, FILE *fp)
TDimension bottom() const
void pad(int xpad, int ypad)
const char * id_to_unichar(UNICHAR_ID id) const
std::array< FEATURE_SET_STRUCT *, NUM_FEATURE_TYPES > FeatureSets
void IndexAndSortFeatures(const INT_FEATURE_STRUCT *features, int num_features, std::vector< int > *sorted_features) const
std::vector< FEATURE_STRUCT * > Features
bool DeSerialize(bool swap, FILE *fp)
static TrainingSample * CopyFromFeatures(const INT_FX_RESULT_STRUCT &fx_info, const TBOX &bounding_box, const INT_FEATURE_STRUCT *features, int num_features)
const INT_FEATURE_STRUCT * features() const
const TBOX & bounding_box() const
Image GetSamplePix(int padding, Image page_pix) const
TrainingSample * RandomizedCopy(int index) const
void DisplayFeatures(ScrollView::Color color, ScrollView *window) const
uint32_t num_features() const
bool features_are_mapped_
FEATURE_STRUCT * GetCNFeature() const
void IndexFeatures(const IntFeatureSpace &feature_space)
const std::vector< int > & indexed_features() const
TrainingSample * Copy() const
Image RenderToPix(const UNICHARSET *unicharset) const
static TrainingSample * DeSerializeCreate(bool swap, FILE *fp)
std::vector< int > mapped_features_
bool Serialize(FILE *fp) const
void ExtractCharDesc(int feature_type, int micro_type, int cn_type, int geo_type, CHAR_DESC_STRUCT *char_desc)
bool features_are_indexed_