40 #include <visp3/visual_features/vpBasicFeature.h>
41 #include <visp3/visual_features/vpFeatureSegment.h>
42 #include <visp3/core/vpImagePoint.h>
43 #include <visp3/core/vpMeterPixelConversion.h>
44 #include <visp3/core/vpMath.h>
45 #include <visp3/core/vpDisplay.h>
49 #include <visp3/core/vpException.h>
52 #include <visp3/core/vpDebug.h>
87 : xc_(0), yc_(0), l_(0), alpha_(0), Z1_(0), Z2_(0), cos_a_(0), sin_a_(0), normalized_(normalized)
199 if (
flags[i] ==
false)
203 vpTRACE(
"Warning !!! The interaction matrix is computed but xc was not set yet");
206 vpTRACE(
"Warning !!! The interaction matrix is computed but Yc was not set yet");
209 vpTRACE(
"Warning !!! The interaction matrix is computed but l was not set yet");
212 vpTRACE(
"Warning !!! The interaction matrix is computed but alpha was not set yet");
215 vpTRACE(
"Warning !!! The interaction matrix is computed but Z1 was not set yet");
218 vpTRACE(
"Warning !!! The interaction matrix is computed but Z2 was not set yet");
221 vpTRACE(
"Problem during the reading of the variable flags");
228 double lambda1 = (Z1_-Z2_)/(Z1_*Z2_);
229 double lambda2 = (Z1_+Z2_)/(2*Z1_*Z2_);
237 double lambda = -lambda1 * ln;
238 double Zn_inv = lambda2 * ln;
239 double lc = cos_a_ / ln;
240 double ls = sin_a_ / ln;
241 double xnalpha = xn*cos_a_+yn*sin_a_;
242 double lnc = cos_a_ * ln;
243 double lns = sin_a_ * ln;
247 Lxn[0][0] = -Zn_inv + lambda * xn * cos_a_;
248 Lxn[0][1] = lambda * xn * sin_a_ ;
249 Lxn[0][2] = lambda1 * (xn*xnalpha - cos_a_ /4.);
250 Lxn[0][3] = sin_a_*cos_a_/4/ln - xn*xnalpha*sin_a_/ln;
251 Lxn[0][4] = -ln*(1.+lc*lc/4.) + xn*xnalpha*cos_a_/ln ;
258 Lyn[0][0] = lambda*yn*cos_a_ ;
259 Lyn[0][1] = -Zn_inv + lambda*yn*sin_a_ ;
260 Lyn[0][2] = lambda1 * (yn*xnalpha - sin_a_/4.);
261 Lyn[0][3] = ln*(1+ls*ls/4.)-yn*xnalpha*sin_a_/ln ;
262 Lyn[0][4] = -sin_a_*cos_a_/4/ln + yn*xnalpha*cos_a_/ln;
269 Lln[0][0] = lambda * lnc ;
270 Lln[0][1] = lambda * lns ;
271 Lln[0][2] = -(Zn_inv + lambda*xnalpha);
272 Lln[0][3] = -yn-xnalpha*sin_a_ ;
273 Lln[0][4] = xn + xnalpha*cos_a_ ;
280 Lalpha[0][0] = -lambda1*sin_a_*l_ ;
281 Lalpha[0][1] = lambda1*cos_a_*l_ ;
282 Lalpha[0][2] = lambda1*(xc_*sin_a_-yc_*cos_a_);
283 Lalpha[0][3] = (-xc_*sin_a_*sin_a_+yc_*cos_a_*sin_a_)/l_;
284 Lalpha[0][4] = (xc_*cos_a_*sin_a_ - yc_*cos_a_*cos_a_)/l_ ;
293 Lxc[0][0] = -lambda2 ;
295 Lxc[0][2] = lambda2*xc_ - lambda1*l_*cos_a_/4.;
296 Lxc[0][3] = xc_*yc_ + l_*l_*cos_a_*sin_a_/4. ;
297 Lxc[0][4] = -(1+xc_*xc_+l_*l_*cos_a_*cos_a_/4.) ;
305 Lyc[0][1] = -lambda2 ;
306 Lyc[0][2] = lambda2*yc_ - lambda1*l_*sin_a_/4.;
307 Lyc[0][3] = 1+yc_*yc_+l_*l_*sin_a_*sin_a_/4. ;
308 Lyc[0][4] = -xc_*yc_-l_*l_*cos_a_*sin_a_/4. ;
315 Ll[0][0] = lambda1*cos_a_ ;
316 Ll[0][1] = lambda1*sin_a_ ;
317 Ll[0][2] = lambda2*l_-lambda1*(xc_*cos_a_+yc_*sin_a_);
318 Ll[0][3] = l_*(xc_*cos_a_*sin_a_ + yc_*(1+sin_a_*sin_a_)) ;
319 Ll[0][4] = -l_*(xc_*(1+cos_a_*cos_a_)+yc_*cos_a_*sin_a_) ;
325 Lalpha[0][0] = -lambda1*sin_a_/l_ ;
326 Lalpha[0][1] = lambda1*cos_a_/l_ ;
327 Lalpha[0][2] = lambda1*(xc_*sin_a_-yc_*cos_a_)/l_;
328 Lalpha[0][3] = -xc_*sin_a_*sin_a_+yc_*cos_a_*sin_a_;
329 Lalpha[0][4] = xc_*cos_a_*sin_a_ - yc_*cos_a_*cos_a_ ;
369 exc[0] = xc_-s_star[0];
375 eyc[0] = yc_ - s_star[1];
381 eL[0] = l_ - s_star[2];
387 eAlpha[0] = alpha_ - s_star[3];
388 while (eAlpha[0] < -M_PI) eAlpha[0] += 2*M_PI ;
389 while (eAlpha[0] > M_PI) eAlpha[0] -= 2*M_PI ;
424 std::cout <<
"vpFeatureSegment: (";
427 std::cout <<
"xn = ";
429 std::cout <<
"xc = ";
430 std::cout <<
s[0] <<
"; ";
434 std::cout <<
"yn = ";
436 std::cout <<
"yc = ";
437 std::cout <<
s[1] <<
"; ";
441 std::cout <<
"ln = ";
444 std::cout <<
s[2] <<
"; ";
449 std::cout <<
")" << std::endl;
485 unsigned int thickness )
const
499 double x1 = x - (l/2.)*cos_a_;
500 double x2 = x + (l/2.)*cos_a_;
502 double y1 = y - (l/2.)*sin_a_;
503 double y2 = y + (l/2.)*sin_a_;
527 unsigned int thickness )
const
541 double x1 = x - (l/2.)*cos_a_;
542 double x2 = x + (l/2.)*cos_a_;
544 double y1 = y - (l/2.)*sin_a_;
545 double y2 = y + (l/2.)*sin_a_;
574 const double x2,
const double y2,
const double Z2)
576 double l = sqrt( (x1-x2)*(x1-x2) + (y1-y2)*(y1-y2));
577 double x_c = (x1+x2)/2.;
578 double y_c = (y1+y2)/2.;
579 double alpha = atan2(y1-y2,x1-x2);
virtual void displayCircle(const vpImagePoint ¢er, unsigned int radius, const vpColor &color, bool fill=false, unsigned int thickness=1)=0
Implementation of a matrix and operations on matrices.
bool * flags
Ensure that all the parameters needed to compute the iteraction matrix are set.
vpColVector error(const vpBasicFeature &s_star, const unsigned int select=FEATURE_ALL)
static unsigned int selectAlpha()
void setAlpha(const double val)
static unsigned int selectYc()
void stack(const double &d)
void resize(const unsigned int nrows, const unsigned int ncols, const bool flagNullify=true)
static void convertPoint(const vpCameraParameters &cam, const double &x, const double &y, double &u, double &v)
Point coordinates conversion from normalized coordinates in meter to pixel coordinates ...
Class to define colors available for display functionnalities.
void stack(const vpMatrix &A)
unsigned int dim_s
Dimension of the visual feature.
void setL(const double val)
void setZ1(const double val)
class that defines what is a visual feature
static const vpColor cyan
void setZ2(const double val)
static unsigned int selectL()
Class that defines a 2D segment visual features. This class allow to consider two sets of visual feat...
Generic class defining intrinsic camera parameters.
vpFeatureSegment(bool normalized=false)
static const unsigned int FEATURE_LINE[32]
void setYc(const double val)
void buildFrom(const double x1, const double y1, const double Z1, const double x2, const double y2, const double Z2)
vpBasicFeatureDeallocatorType deallocate
static double deg(double rad)
Implementation of column vector and the associated operations.
Class that defines a 2D point in an image. This class is useful for image processing and stores only ...
virtual void displayLine(const vpImagePoint &ip1, const vpImagePoint &ip2, const vpColor &color, unsigned int thickness=1)=0
vpMatrix interaction(const unsigned int select=FEATURE_ALL)
static const vpColor yellow
vpFeatureSegment * duplicate() const
Feature duplication.
static unsigned int selectXc()
void display(const vpCameraParameters &cam, const vpImage< unsigned char > &I, const vpColor &color=vpColor::green, unsigned int thickness=1) const
unsigned int nbParameters
Number of parameters needed to compute the interaction matrix.
vpColVector s
State of the visual feature.
void resize(const unsigned int i, const bool flagNullify=true)
void setXc(const double val)
void print(const unsigned int select=FEATURE_ALL) const