18#define _USE_MATH_DEFINES
38static double_VAR(training_angle_match_scale, 1.0,
"Angle Match Scale ...");
40static double_VAR(training_similarity_midpoint, 0.0075,
"Similarity Midpoint ...");
42static double_VAR(training_similarity_curl, 2.0,
"Similarity Curl ...");
46static double_VAR(training_tangent_bbox_pad, 0.5,
"Tangent bounding box pad ...");
48static double_VAR(training_orthogonal_bbox_pad, 2.5,
"Orthogonal bounding box pad ...");
50static double_VAR(training_angle_pad, 45.0,
"Angle pad ...");
82 Angle = p1->
Angle * 2.0 * M_PI;
91 Feature->Params[
PicoFeatX] = p1->
X + std::cos(Angle) * Length;
92 Feature->Params[
PicoFeatY] = p1->
Y + std::sin(Angle) * Length;
95 if (Evidence < WorstEvidence) {
96 WorstEvidence = Evidence;
104 Feature->Params[
PicoFeatX] = p1->
X - std::cos(Angle) * Length;
105 Feature->Params[
PicoFeatY] = p1->
Y - std::sin(Angle) * Length;
108 if (Evidence < WorstEvidence) {
109 WorstEvidence = Evidence;
117 return (WorstEvidence);
133 TotalWeight = w1 + w2;
137 MergedProto->
X = p1->
X * w1 + p2->
X * w2;
138 MergedProto->
Y = p1->
Y * w1 + p2->
Y * w2;
165 float Match, OldMatch, NewMatch;
171 for (Pid = 0; Pid < Class->
NumProtos; Pid++) {
173 ComputeMergedProto(Proto, &NewProto,
static_cast<float>(NumMerged[Pid]), 1.0, &MergedProto);
176 Match = std::min(OldMatch, NewMatch);
177 if (Match > BestMatch) {
220 Dangle *= training_angle_match_scale;
225 return (
EvidenceOf(Distance * Distance + Dangle * Dangle));
237 Similarity /= training_similarity_midpoint;
239 if (training_similarity_curl == 3) {
240 Similarity = Similarity * Similarity * Similarity;
241 }
else if (training_similarity_curl == 2) {
242 Similarity = Similarity * Similarity;
244 Similarity = pow(Similarity, training_similarity_curl);
247 return (1.0 / (1.0 + Similarity));
268 MaxAngleError = training_angle_pad / 360.0;
270 if (AngleError > 0.5) {
271 AngleError = 1.0 - AngleError;
274 if (AngleError > MaxAngleError) {
296 FRECT *BoundingBox) {
297 float Length = Proto->
Length / 2.0 + TangentPad;
298 float Angle = Proto->
Angle * 2.0 * M_PI;
299 float CosOfAngle = fabs(std::cos(Angle));
300 float SinOfAngle = fabs(std::sin(Angle));
302 float Pad = std::max(CosOfAngle * Length, SinOfAngle * OrthogonalPad);
303 BoundingBox->
MinX = Proto->
X - Pad;
304 BoundingBox->
MaxX = Proto->
X + Pad;
306 Pad = std::max(SinOfAngle * Length, CosOfAngle * OrthogonalPad);
307 BoundingBox->
MinY = Proto->
Y - Pad;
308 BoundingBox->
MaxY = Proto->
Y + Pad;
320 return (X >= Rectangle->
MinX) && (X <= Rectangle->
MaxX) && (Y >= Rectangle->
MinY) &&
321 (Y <= Rectangle->
MaxY);
#define double_VAR(name, val, comment)
#define MAX_LENGTH_MISMATCH
#define WORST_MATCH_ALLOWED
bool PointInside(FRECT *Rectangle, float X, float Y)
double EvidenceOf(double Similarity)
bool DummyFastMatch(FEATURE Feature, PROTO_STRUCT *Proto)
float SubfeatureEvidence(FEATURE Feature, PROTO_STRUCT *Proto)
void ComputeMergedProto(PROTO_STRUCT *p1, PROTO_STRUCT *p2, float w1, float w2, PROTO_STRUCT *MergedProto)
int FindClosestExistingProto(CLASS_TYPE Class, int NumMerged[], PROTOTYPE *Prototype)
void ComputePaddedBoundingBox(PROTO_STRUCT *Proto, float TangentPad, float OrthogonalPad, FRECT *BoundingBox)
float CompareProtos(PROTO_STRUCT *p1, PROTO_STRUCT *p2)
void MakeNewFromOld(PROTO_STRUCT *New, PROTOTYPE *Old)
#define ProtoIn(Class, Pid)
#define GetPicoFeatureLength()
TESS_API const FEATURE_DESC_STRUCT PicoFeatDesc
void FillABC(PROTO_STRUCT *Proto)
std::vector< float > Mean
std::vector< float > Params