tesseract 4.1.1
Loading...
Searching...
No Matches
intfeaturespace.cpp
Go to the documentation of this file.
1// Copyright 2010 Google Inc. All Rights Reserved.
2// Author: rays@google.com (Ray Smith)
4// File: intfeaturespace.cpp
5// Description: Indexed feature space based on INT_FEATURE_STRUCT.
6//
7// Licensed under the Apache License, Version 2.0 (the "License");
8// you may not use this file except in compliance with the License.
9// You may obtain a copy of the License at
10// http://www.apache.org/licenses/LICENSE-2.0
11// Unless required by applicable law or agreed to in writing, software
12// distributed under the License is distributed on an "AS IS" BASIS,
13// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14// See the License for the specific language governing permissions and
15// limitations under the License.
16//
18
19#define _USE_MATH_DEFINES // for M_PI
20#include "intfeaturespace.h"
21#include <cmath> // for M_PI
22#include "intfx.h"
23
24namespace tesseract {
25
27 : x_buckets_(0), y_buckets_(0), theta_buckets_(0) {
28}
29
30void IntFeatureSpace::Init(uint8_t xbuckets, uint8_t ybuckets, uint8_t thetabuckets) {
31 x_buckets_ = xbuckets;
32 y_buckets_ = ybuckets;
33 theta_buckets_ = thetabuckets;
34}
35
36// Serializes the feature space definition to the given file.
37// Returns false on error.
38bool IntFeatureSpace::Serialize(FILE* fp) const {
39 if (fwrite(&x_buckets_, sizeof(x_buckets_), 1, fp) != 1)
40 return false;
41 if (fwrite(&y_buckets_, sizeof(y_buckets_), 1, fp) != 1)
42 return false;
43 if (fwrite(&theta_buckets_, sizeof(theta_buckets_), 1, fp) != 1)
44 return false;
45 return true;
46}
47
48// Returns an INT_FEATURE_STRUCT corresponding to the given index.
49// This is the inverse of the Index member.
52 index / theta_buckets_ % y_buckets_,
53 index % theta_buckets_);
54}
55
56// Bulk calls to Index. Maps the given array of features to a vector of
57// int32_t indices in the same order as the input.
59 int num_features,
60 GenericVector<int>* mapped_features) const {
61 mapped_features->truncate(0);
62 for (int f = 0; f < num_features; ++f)
63 mapped_features->push_back(Index(features[f]));
64}
65
66// Bulk calls to Index. Maps the given array of features to a vector of
67// sorted int32_t indices.
69 const INT_FEATURE_STRUCT* features, int num_features,
70 GenericVector<int>* sorted_features) const {
71 sorted_features->truncate(0);
72 for (int f = 0; f < num_features; ++f)
73 sorted_features->push_back(Index(features[f]));
74 sorted_features->sort();
75}
76
77// Returns a feature space index for the given x,y position in a display
78// window, or -1 if the feature is a miss.
79int IntFeatureSpace::XYToFeatureIndex(int x, int y) const {
80 // Round the x,y position to a feature. Search for a valid theta.
81 INT_FEATURE_STRUCT feature(x, y, 0);
82 int index = -1;
83 for (int theta = 0; theta <= UINT8_MAX && index < 0; ++theta) {
84 feature.Theta = theta;
85 index = Index(feature);
86 }
87 if (index < 0) {
88 tprintf("(%d,%d) does not exist in feature space!\n", x, y);
89 return -1;
90 }
91 feature = PositionFromIndex(index);
92 tprintf("Click at (%d, %d) ->(%d, %d), ->(%d, %d)\n",
93 x, y, feature.X, feature.Y, x - feature.X, y - feature.Y);
94 // Get the relative position of x,y from the rounded feature.
95 x -= feature.X;
96 y -= feature.Y;
97 if (x != 0 || y != 0) {
98 double angle = atan2(static_cast<double>(y), static_cast<double>(x)) + M_PI;
99 angle *= kIntFeatureExtent / (2.0 * M_PI);
100 feature.Theta = static_cast<uint8_t>(angle + 0.5);
101 index = Index(feature);
102 if (index < 0) {
103 tprintf("Feature failed to map to a valid index:");
104 feature.print();
105 return -1;
106 }
107 feature = PositionFromIndex(index);
108 }
109 feature.print();
110 return index;
111}
112
113// Returns an INT_FEATURE_STRUCT corresponding to the given bucket coords.
115 int y,
116 int theta) const {
121 return pos;
122}
123
124} // namespace tesseract.
int DivRounded(int a, int b)
Definition: helpers.h:167
DLLSYM void tprintf(const char *format,...)
Definition: tprintf.cpp:35
const int kIntFeatureExtent
int push_back(T object)
void truncate(int size)
void Init(uint8_t xbuckets, uint8_t ybuckets, uint8_t thetabuckets)
void IndexFeatures(const INT_FEATURE_STRUCT *features, int num_features, GenericVector< int > *mapped_features) const
INT_FEATURE_STRUCT PositionFromIndex(int index) const
int Index(const INT_FEATURE_STRUCT &f) const
int XYToFeatureIndex(int x, int y) const
bool Serialize(FILE *fp) const
INT_FEATURE_STRUCT PositionFromBuckets(int x, int y, int theta) const
void IndexAndSortFeatures(const INT_FEATURE_STRUCT *features, int num_features, GenericVector< int > *sorted_features) const
void print() const
Definition: intproto.h:145