Files
ANSCORE/modules/ANSLPR/include/Line.h

193 lines
6.7 KiB
C++
Raw Blame History

/*
// Line.h: interface for the C_Line class.
//////////////////////////////////////////////////////////////////////
*/
#if !defined(AFX_LINE_H__E3A0AA20_F151_11D5_B96A_CCFB30288840__INCLUDED_)
#define AFX_LINE_H__E3A0AA20_F151_11D5_B96A_CCFB30288840__INCLUDED_
#include <list>
#include <opencv2/opencv.hpp>
#ifdef _DEBUG
#include <cassert>
#endif //_DEBUG
//**************************
// conversion between number types
//**************************
inline float doubleToFloat(const double& value)
{
#ifdef LPR_PRINTF
if ((value > FLT_MAX) || (value < -FLT_MAX))
{
printf("Probleme de depassement lors d'un cast de DOUBLE en FLOAT\n");
}
#endif
return static_cast<float>(value);
}
inline float intToFloat(int value)
{
return static_cast<float>(value);
}
inline float int64ToFloat(const int64_t& value)
{
return static_cast<float>(value);
}
inline int floatToInt(float value)
{
#ifdef LPR_PRINTF
if ((value > INT_MAX) || (value < -INT_MAX))
{
printf("Probleme de depassement lors d'un cast de float en int\n");
}
#endif //LPR_PRINTF
return static_cast<int>(value);
}
/// \brief une classe qui modelise une droite dans un repere, donn<6E>e par son ordonn<6E>e <20> l'origine et sa pente
/*! \class C_OCROutput
* \brief a class that models a line in a frame, given by its intercept and its slope
**
*/
class C_Line
{
public:
//true if the line doesnot have too large slope and not large ordonnee a l'origine
inline bool is_valid() const
{
return (fabsf(a)<FLT_MAX && fabsf(b)<FLT_MAX);
};
//true if the line is (nearly) a vertical one
inline bool is_vertical() const
{
return fabsf(a)>FLT_MAX*0.5f;
};
void reset();
//determine si les deux droites sont paralleles
inline bool is_parallel(const C_Line & line_) const
{
const float MAX_FLT_ERROR=0.000001f;
return (fabsf(a-line_.a)<MAX_FLT_ERROR);
};
//retourne l'image de abscisse par la fonction affi,e definie par la droite
int get_image_entiere(const int abscisse) const;
//retourne l'image de abscisse par la fonction affi,e definie par la droite
float get_image(const int abscisse) const;
//retourne l'image de abscisse par la fonction affi,e definie par la droite
float get_image(const float& abscisse) const;
//retourne le coefficient directeur
inline float get_skew() const{
return a;
};
//retour l'angle de la droite par rapport a l'horizontale
inline float get_skew_angle() const{
return static_cast<float>(atanf(a));
};
//retour l'angle de la droite par rapport a l'horizontale
inline float get_skew_angle(const C_Line & l) const{
return (l.get_skew_angle()- atanf(a));
};
/**
@brief cette fonction donne l'angle de l'inclinaison d'un caractere
cette fonction sert effectueer une correction de l'inclinaison des characteres
cette fonction est utilise apres rotation de l'image de la plaque. Elle doit d'abord dterminer
si les characteres ainsi reforms prsentent un angle de slant.
cette fonction effectuee une correction de l'inclinaison des characteres
this function uses the vanishing point detection algorithm, based
on the concept of clustering line intersections based on the density of line intersections in a local region.
@return the slant angle of the line of characters
@see
*/
inline float get_slant_angle() const{
const float pi_sur_2=1.570796327f;
float slant_angle(atanf(a));
#ifdef _DEBUG
assert(slant_angle > -pi_sur_2 - .1 && slant_angle < pi_sur_2 + .1);
#endif //_DEBUG
if(slant_angle>0) {
// * *******
// * * *
// * * *
// * *******
// * *
// * *
// * *
// * *
//In that case the slant is positive
//correction
// Y'=y
// X'= x-y*cos(teta)
// X'= x-y*sin (ret)
slant_angle-=pi_sur_2;
#ifdef _DEBUG
assert(-slant_angle>-FLT_EPSILON);
#endif //_DEBUG
}
else {
// * *******
// * * *
// * * *
// * *******
// * *
// * *
// * *
// **
//In that case the slant is negative
//il faut que ret <0
slant_angle+=pi_sur_2;
#ifdef _DEBUG
assert(-slant_angle<FLT_EPSILON);
#endif //_DEBUG
}
#ifdef _DEBUG
assert(slant_angle > -pi_sur_2 - .1 && slant_angle < pi_sur_2 + .1);
#endif //_DEBUG
return -slant_angle;
};
inline bool is_x_axis() const{
if(fabsf(a)>FLT_EPSILON) return false;
else return(fabsf(b)<FLT_EPSILON);
};
//l'ordonnee a l'origine
float b;
//le coefficient directeur
float a;
//**************************
// construct/destruct
//**************************
C_Line();
C_Line(const C_Line & line_);
C_Line(const float & a_,const float & b_);
C_Line(const cv::Point2f& A, const cv::Point2f& B);
virtual ~C_Line();
//retourne le pt d'inter de C_Line avec la dte horiz y=ordonnee
float get_abs(const int ordonnee) const;
float get_abs(const float ordonnee) const;
bool is_horizontale() const
{
return(fabsf(a)<FLT_EPSILON);
};
bool is_nearly_the_same(const C_Line & right_op) const;
//returns the distance (positive or negative) of the point from its vertical projection on the line
float difference_y(const cv::Point2f& pt) const;
//retourne la distance du point a sa projection verticale sur la droite
float dist_y(const cv::Point& pt) const;
//returns the distance of the point from its vertical projection on the line
float dist_y(const cv::Point2f& pt) const;
//returns sum of distances of a list of points from their vertical projections on the line
float dist_y(const std::list<cv::Point2f>& points) const;
//returns the distance of the center point of a box from its vertical projection on the line
float dist_y_from_center(const cv::Rect& box) const;
//returns sum of distances of the center points of a list of boxes,from their vertical projections on the line
float dist_y_from_center(const std::list<cv::Rect>& boxes) const;
//returns sum of distances (which can be positive or negative) of the center points of a list of boxes,from their vertical projections on the line
float difference_y_from_center(const std::list<cv::Rect>& boxes) const;
//returns the distance (which can be positive or negative) of the center point of a box from its vertical projection on the line
float difference_y_from_center(const cv::Rect& box) const;
float dist_y(const std::list<cv::Point>& points) const;
//returns average distance of the center points of a list of boxes,from their vertical projections on the line
float error(const std::list<cv::Rect>& boxes) const;
//returns average distance of a list of points from their vertical projections on the line
float error(const std::list<cv::Point2f>& points) const;
protected:
//true if the line is nearly horizontal
bool is_nearly_horiz() const;
};
#endif // !defined(AFX_LINE_H__E3A0AA20_F151_11D5_B96A_CCFB30288840__INCLUDED_)