ViSP
 All Classes Functions Variables Enumerations Enumerator Friends Groups Pages
vpFeatureSegment.h
1 /****************************************************************************
2  *
3  * $Id: vpFeatureThetaU.h 3530 2012-01-03 10:52:12Z fspindle $
4  *
5  * This file is part of the ViSP software.
6  * Copyright (C) 2005 - 2013 by INRIA. All rights reserved.
7  *
8  * This software is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU General Public License
10  * ("GPL") version 2 as published by the Free Software Foundation.
11  * See the file LICENSE.txt at the root directory of this source
12  * distribution for additional information about the GNU GPL.
13  *
14  * For using ViSP with software that can not be combined with the GNU
15  * GPL, please contact INRIA about acquiring a ViSP Professional
16  * Edition License.
17  *
18  * See http://www.irisa.fr/lagadic/visp/visp.html for more information.
19  *
20  * This software was developed at:
21  * INRIA Rennes - Bretagne Atlantique
22  * Campus Universitaire de Beaulieu
23  * 35042 Rennes Cedex
24  * France
25  * http://www.irisa.fr/lagadic
26  *
27  * If you have questions regarding the use of this file, please contact
28  * INRIA at visp@inria.fr
29  *
30  * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
31  * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
32  *
33  *
34  * Description:
35  * Segment visual feature.
36  *
37  * Authors:
38  * Filip Novotny
39  * Fabien Spindler
40  *
41  *****************************************************************************/
42 
43 
44 #ifndef vpFeatureSegment_H
45 #define vpFeatureSegment_H
46 
52 #include <visp/vpMatrix.h>
53 #include <visp/vpPoint.h>
54 #include <visp/vpBasicFeature.h>
55 #include <visp/vpRGBa.h>
56 #include <visp/vpFeatureException.h>
57 
76 class VISP_EXPORT vpFeatureSegment : public vpBasicFeature
77 {
78 public:
79  //empty constructor
80  vpFeatureSegment(bool normalized=false);
81 
83  ~vpFeatureSegment() { if (flags != NULL) delete [] flags; }
84  // change values of the segment
85  void buildFrom(const double x1, const double y1, const double Z1, const double x2, const double y2, const double Z2);
86 
87  void display(const vpCameraParameters &cam,
88  const vpImage<unsigned char> &I,
89  const vpColor &color=vpColor::green,
90  unsigned int thickness=1) const ;
91  void display(const vpCameraParameters &cam,
92  const vpImage<vpRGBa> &I,
93  const vpColor &color=vpColor::green,
94  unsigned int thickness=1) const ;
96  vpFeatureSegment *duplicate() const ;
97  // compute the error between two visual features from a subset
98  // a the possible features
99  vpColVector error(const vpBasicFeature &s_star,
100  const unsigned int select = FEATURE_ALL) ;
101 
107  inline double getXc() const { return s[0] ; }
108 
114  inline double getYc() const { return s[1] ; }
115 
122  inline double getL() const { return s[2] ; }
123 
129  inline double getAlpha() const { return s[3] ;}
130 
137  inline double getZ1() const { return Z1_ ;}
138 
145  inline double getZ2() const { return Z2_ ;}
146 
147  // Basic construction.
148  void init() ;
149 
150  // compute the interaction matrix from a subset a the possible features
151  vpMatrix interaction(const unsigned int select = FEATURE_ALL);
152 
153  void print(const unsigned int select= FEATURE_ALL) const ;
154 
158  bool isNormalized() { return normalized_; };
159 
182  inline static unsigned int selectXc() { return FEATURE_LINE[0] ; }
183 
207  inline static unsigned int selectYc() { return FEATURE_LINE[1] ; }
208 
232  inline static unsigned int selectL() { return FEATURE_LINE[2] ; }
233 
257  inline static unsigned int selectAlpha() { return FEATURE_LINE[3] ; }
258 
264  void setNormalized(bool normalized) { normalized_ = normalized; };
273  inline void setXc(const double val){
274  s[0] = xc_ = val;
275  flags[0] = true;
276  }
285  inline void setYc(const double val){
286  s[1] = yc_ = val;
287  flags[1] = true;
288  }
296  inline void setL(const double val){
297  s[2] = l_ = val;
298  flags[2] = true;
299  }
307  inline void setAlpha(const double val){
308  s[3] = alpha_ = val;
309  cos_a_ = cos(val);
310  sin_a_ = sin(val);
311  flags[3] = true;
312  }
313 
325  inline void setZ1(const double val)
326  {
327  Z1_ = val;
328 
329  if (Z1_ < 0)
330  {
331  vpERROR_TRACE("Point is behind the camera ") ;
332  std::cout <<"Z1 = " << Z1_ << std::endl ;
333 
335  "Point Z1 is behind the camera ")) ;
336  }
337 
338  if (fabs(Z1_) < 1e-6)
339  {
340  vpERROR_TRACE("Point Z1 coordinates is null ") ;
341  std::cout <<"Z1 = " << Z1_ << std::endl ;
342 
344  "Point Z1 coordinates is null")) ;
345  }
346 
347  flags[4] = true;
348  }
349 
361  inline void setZ2(const double val)
362  {
363  Z2_ = val;
364 
365  if (Z2_ < 0)
366  {
367  vpERROR_TRACE("Point Z2 is behind the camera ") ;
368  std::cout <<"Z2 = " << Z2_ << std::endl ;
369 
371  "Point Z2 is behind the camera ")) ;
372  }
373 
374  if (fabs(Z2_) < 1e-6)
375  {
376  vpERROR_TRACE("Point Z2 coordinates is null ") ;
377  std::cout <<"Z2 = " << Z2_ << std::endl ;
378 
380  "Point Z2 coordinates is null")) ;
381  }
382 
383  flags[5] = true;
384  }
385 
386 
387 private:
388  double xc_;
389  double yc_;
390  double l_;
391  double alpha_;
392  double Z1_;
393  double Z2_;
394  double cos_a_;
395  double sin_a_;
396  bool normalized_;
397 } ;
398 
399 #endif
400