Visual Servoing Platform  version 3.1.0
vpMbtFaceDepthNormal.h
1 /****************************************************************************
2  *
3  * This file is part of the ViSP software.
4  * Copyright (C) 2005 - 2017 by Inria. All rights reserved.
5  *
6  * This software is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  * See the file LICENSE.txt at the root directory of this source
11  * distribution for additional information about the GNU GPL.
12  *
13  * For using ViSP with software that can not be combined with the GNU
14  * GPL, please contact Inria about acquiring a ViSP Professional
15  * Edition License.
16  *
17  * See http://visp.inria.fr for more information.
18  *
19  * This software was developed at:
20  * Inria Rennes - Bretagne Atlantique
21  * Campus Universitaire de Beaulieu
22  * 35042 Rennes Cedex
23  * France
24  *
25  * If you have questions regarding the use of this file, please contact
26  * Inria at visp@inria.fr
27  *
28  * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
29  * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
30  *
31  * Description:
32  * Manage depth normal features for a particular face.
33  *
34  *****************************************************************************/
35 
36 #ifndef __vpMbtFaceDepthNormal_h_
37 #define __vpMbtFaceDepthNormal_h_
38 
39 #include <iostream>
40 
41 #include <visp3/core/vpConfig.h>
42 #ifdef VISP_HAVE_PCL
43 #include <pcl/point_cloud.h>
44 #include <pcl/point_types.h>
45 #endif
46 
47 #include <visp3/core/vpPlane.h>
48 #include <visp3/mbt/vpMbTracker.h>
49 #include <visp3/mbt/vpMbtDistanceLine.h>
50 
51 #define DEBUG_DISPLAY_DEPTH_NORMAL 0
52 
53 class VISP_EXPORT vpMbtFaceDepthNormal
54 {
55 public:
58  MEAN_CENTROID
59  };
60 
62  ROBUST_FEATURE_ESTIMATION = 0,
63  ROBUST_SVD_PLANE_ESTIMATION = 1,
64 #ifdef VISP_HAVE_PCL
65  PCL_PLANE_ESTIMATION = 2
66 #endif
67  };
68 
72  unsigned int m_clippingFlag;
74  double m_distFarClip;
85 
87  virtual ~vpMbtFaceDepthNormal();
88 
89  void addLine(vpPoint &p1, vpPoint &p2, vpMbHiddenFaces<vpMbtPolygon> *const faces, int polygon = -1,
90  std::string name = "");
91 
92 #ifdef VISP_HAVE_PCL
93  bool computeDesiredFeatures(const vpHomogeneousMatrix &cMo, const unsigned int width, const unsigned int height,
94  const pcl::PointCloud<pcl::PointXYZ>::ConstPtr &point_cloud,
95  vpColVector &desired_features, const unsigned int stepX, const unsigned int stepY
96 #if DEBUG_DISPLAY_DEPTH_NORMAL
97  ,
98  vpImage<unsigned char> &debugImage, std::vector<std::vector<vpImagePoint> > &roiPts_vec
99 #endif
100  );
101 #endif
102  bool computeDesiredFeatures(const vpHomogeneousMatrix &cMo, const unsigned int width, const unsigned int height,
103  const std::vector<vpColVector> &point_cloud, vpColVector &desired_features,
104  const unsigned int stepX, const unsigned int stepY
105 #if DEBUG_DISPLAY_DEPTH_NORMAL
106  ,
107  vpImage<unsigned char> &debugImage, std::vector<std::vector<vpImagePoint> > &roiPts_vec
108 #endif
109  );
110 
111  void computeInteractionMatrix(const vpHomogeneousMatrix &cMo, vpMatrix &L, vpColVector &features);
112 
113  void computeVisibility();
114  void computeVisibilityDisplay();
115 
116  void computeNormalVisibility(const double nx, const double ny, const double nz, const vpColVector &centroid_point,
117  vpColVector &face_normal);
118 #ifdef VISP_HAVE_PCL
119  void computeNormalVisibility(const float nx, const float ny, const float nz, const pcl::PointXYZ &centroid_point,
120  pcl::PointXYZ &face_normal);
121 #endif
122  void computeNormalVisibility(const double nx, const double ny, const double nz, const vpHomogeneousMatrix &cMo,
123  const vpCameraParameters &camera, vpColVector &correct_normal, vpPoint &centroid);
124 
125  void display(const vpImage<unsigned char> &I, const vpHomogeneousMatrix &cMo, const vpCameraParameters &cam,
126  const vpColor &col, const unsigned int thickness = 1, const bool displayFullModel = false);
127  void display(const vpImage<vpRGBa> &I, const vpHomogeneousMatrix &cMo, const vpCameraParameters &cam,
128  const vpColor &col, const unsigned int thickness = 1, const bool displayFullModel = false);
129 
130  void displayFeature(const vpImage<unsigned char> &I, const vpHomogeneousMatrix &cMo, const vpCameraParameters &cam,
131  const double scale = 0.05, const unsigned int thickness = 1);
132  void displayFeature(const vpImage<vpRGBa> &I, const vpHomogeneousMatrix &cMo, const vpCameraParameters &cam,
133  const double scale = 0.05, const unsigned int thickness = 1);
134 
135  inline bool isVisible() const { return m_polygon->isvisible; }
136 
137  void setCameraParameters(const vpCameraParameters &camera);
138 
139  inline void setFaceCentroidMethod(const vpFaceCentroidType &method) { m_faceCentroidMethod = method; }
140 
141  inline void setFeatureEstimationMethod(const vpFeatureEstimationType &method) { m_featureEstimationMethod = method; }
142 
143  inline void setPclPlaneEstimationMethod(const int method) { m_pclPlaneEstimationMethod = method; }
144 
145  inline void setPclPlaneEstimationRansacMaxIter(const int maxIter) { m_pclPlaneEstimationRansacMaxIter = maxIter; }
146 
147  inline void setPclPlaneEstimationRansacThreshold(const double threshold)
148  {
149  m_pclPlaneEstimationRansacThreshold = threshold;
150  }
151 
152  void setScanLineVisibilityTest(const bool v);
153 
154 private:
155  class PolygonLine
156  {
157  public:
159  vpPoint *m_p1;
161  vpPoint *m_p2;
163  vpMbtPolygon m_poly;
165  vpImagePoint m_imPt1;
167  vpImagePoint m_imPt2;
168 
169  PolygonLine() : m_p1(NULL), m_p2(NULL), m_poly(), m_imPt1(), m_imPt2() {}
170 
171  PolygonLine(const PolygonLine &polyLine)
172  : m_p1(NULL), m_p2(NULL), m_poly(polyLine.m_poly), m_imPt1(polyLine.m_imPt1), m_imPt2(polyLine.m_imPt2)
173  {
174  m_p1 = &m_poly.p[0];
175  m_p2 = &m_poly.p[1];
176  }
177 
178  PolygonLine &operator=(PolygonLine other)
179  {
180  swap(*this, other);
181 
182  return *this;
183  }
184 
185  void swap(PolygonLine &first, PolygonLine &second)
186  {
187  using std::swap;
188  swap(first.m_p1, second.m_p1);
189  swap(first.m_p2, second.m_p2);
190  swap(first.m_poly, second.m_poly);
191  swap(first.m_imPt1, second.m_imPt1);
192  swap(first.m_imPt2, second.m_imPt2);
193  }
194  };
195 
196  template <class T> class Mat33
197  {
198  public:
199  std::vector<T> data;
200 
201  Mat33() : data(9) {}
202 
203  inline T operator[](const size_t i) const { return data[i]; }
204 
205  inline T &operator[](const size_t i) { return data[i]; }
206 
207  Mat33 inverse() const
208  {
209  // determinant
210  T det = data[0] * (data[4] * data[8] - data[7] * data[5]) - data[1] * (data[3] * data[8] - data[5] * data[6]) +
211  data[2] * (data[3] * data[7] - data[4] * data[6]);
212  T invdet = 1 / det;
213 
214  Mat33<T> minv;
215  minv[0] = (data[4] * data[8] - data[7] * data[5]) * invdet;
216  minv[1] = (data[2] * data[7] - data[1] * data[8]) * invdet;
217  minv[2] = (data[1] * data[5] - data[2] * data[4]) * invdet;
218  minv[3] = (data[5] * data[6] - data[3] * data[8]) * invdet;
219  minv[4] = (data[0] * data[8] - data[2] * data[6]) * invdet;
220  minv[5] = (data[3] * data[2] - data[0] * data[5]) * invdet;
221  minv[6] = (data[3] * data[7] - data[6] * data[4]) * invdet;
222  minv[7] = (data[6] * data[1] - data[0] * data[7]) * invdet;
223  minv[8] = (data[0] * data[4] - data[3] * data[1]) * invdet;
224 
225  return minv;
226  }
227  };
228 
229 protected:
245  std::vector<vpMbtDistanceLine *> m_listOfFaceLines;
256  std::vector<PolygonLine> m_polygonLines;
257 
258 #ifdef VISP_HAVE_PCL
259  bool computeDesiredFeaturesPCL(const pcl::PointCloud<pcl::PointXYZ>::ConstPtr &point_cloud_face,
260  vpColVector &desired_features, vpColVector &desired_normal,
261  vpColVector &centroid_point);
262 #endif
263  void computeDesiredFeaturesRobustFeatures(const std::vector<double> &point_cloud_face_custom,
264  const std::vector<double> &point_cloud_face, const vpHomogeneousMatrix &cMo,
265  vpColVector &desired_features, vpColVector &desired_normal,
266  vpColVector &centroid_point);
267  void computeDesiredFeaturesSVD(const std::vector<double> &point_cloud_face, const vpHomogeneousMatrix &cMo,
268  vpColVector &desired_features, vpColVector &desired_normal,
269  vpColVector &centroid_point);
270  void computeDesiredNormalAndCentroid(const vpHomogeneousMatrix &cMo, const vpColVector &desired_normal,
271  const vpColVector &centroid_point);
272 
273  bool computePolygonCentroid(const std::vector<vpPoint> &points, vpPoint &centroid);
274 
275  void computeROI(const vpHomogeneousMatrix &cMo, const unsigned int width, const unsigned int height,
276  std::vector<vpImagePoint> &roiPts
277 #if DEBUG_DISPLAY_DEPTH_NORMAL
278  ,
279  std::vector<std::vector<vpImagePoint> > &roiPts_vec
280 #endif
281  );
282 
283  void estimateFeatures(const std::vector<double> &point_cloud_face, const vpHomogeneousMatrix &cMo,
284  vpColVector &x_estimated, std::vector<double> &weights);
285 
286  void estimatePlaneEquationSVD(const std::vector<double> &point_cloud_face, const vpHomogeneousMatrix &cMo,
287  vpColVector &plane_equation_estimated, vpColVector &centroid);
288 
289  bool samePoint(const vpPoint &P1, const vpPoint &P2) const;
290 };
291 #endif
vpFeatureEstimationType m_featureEstimationMethod
Method to estimate the desired features.
Implementation of a matrix and operations on matrices.
Definition: vpMatrix.h:104
Implementation of an homogeneous matrix and operations on such kind of matrices.
int m_pclPlaneEstimationMethod
PCL plane estimation method.
unsigned int m_clippingFlag
Flags specifying which clipping to used.
Class to define colors available for display functionnalities.
Definition: vpColor.h:120
int m_pclPlaneEstimationRansacMaxIter
PCL pane estimation max number of iterations.
vpPoint * p
corners in the object frame
Definition: vpPolygon3D.h:81
void setFaceCentroidMethod(const vpFaceCentroidType &method)
double m_distNearClip
Distance for near clipping.
bool m_useScanLine
Scan line visibility.
vpCameraParameters m_cam
Camera intrinsic parameters.
Class that defines what is a point.
Definition: vpPoint.h:58
bool m_faceActivated
True if the face should be considered by the tracker.
void setPclPlaneEstimationRansacThreshold(const double threshold)
vpMbtPolygon * m_polygon
Polygon defining the face.
Implementation of a polygon of the model used by the model-based tracker.
Definition: vpMbtPolygon.h:66
vpMbHiddenFaces< vpMbtPolygon > * m_hiddenFace
Pointer to the list of faces.
Generic class defining intrinsic camera parameters.
vpPoint m_faceDesiredNormal
Face (normalized) normal (computed from the sensor)
double m_distFarClip
Distance for near clipping.
std::vector< vpMbtDistanceLine * > m_listOfFaceLines
void setFeatureEstimationMethod(const vpFeatureEstimationType &method)
std::vector< PolygonLine > m_polygonLines
vpFaceCentroidType m_faceCentroidMethod
Method to compute the face centroid for the current features.
void setPclPlaneEstimationMethod(const int method)
Implementation of column vector and the associated operations.
Definition: vpColVector.h:72
void setPclPlaneEstimationRansacMaxIter(const int maxIter)
vpPoint m_faceDesiredCentroid
Desired centroid (computed from the sensor)
Class that defines a 2D point in an image. This class is useful for image processing and stores only ...
Definition: vpImagePoint.h:88
Compute the geometric centroid.
This class defines the container for a plane geometrical structure.
Definition: vpPlane.h:58
vpPlane m_planeObject
Plane equation described in the object frame.
bool isvisible
flag to specify whether the face is visible or not
Definition: vpMbtPolygon.h:73
double m_pclPlaneEstimationRansacThreshold
PCL plane estimation RANSAC threshold.