1 /****************************************************************************
2  *
3  * ViSP, open source Visual Servoing Platform software.
4  * Copyright (C) 2005 - 2019 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  * Generic model-based tracker.
33  *
34  *****************************************************************************/
35 /*!
36  \file vpMbGenericTracker.h
37  \brief Generic model-based tracker
38 */
39 
40 #ifndef _vpMbGenericTracker_h_
41 #define _vpMbGenericTracker_h_
42 
43 #include <visp3/mbt/vpMbDepthDenseTracker.h>
44 #include <visp3/mbt/vpMbDepthNormalTracker.h>
45 #include <visp3/mbt/vpMbEdgeTracker.h>
46 #include <visp3/mbt/vpMbKltTracker.h>
47 
48 /*!
49   \class vpMbGenericTracker
50   \ingroup group_mbt_trackers
51   \brief Real-time 6D object pose tracking using its CAD model.
52 
53   The tracker requires the knowledge of the 3D model that could be provided in
54   a vrml or in a cao file. The cao format is described in loadCAOModel(). It may
55   also use an xml file used to tune the behavior of the tracker and an init file
56   used to compute the pose at the very first image.
57 
58   This class allows tracking an object or a scene given its 3D model. More information in \cite Trinh18a.
59   A lot of videos can be found on <a href="https://www.youtube.com/user/VispTeam">YouTube VispTeam</a> channel.
60 
61   \htmlonly
62   <iframe width="280" height="160" src="https://www.youtube.com/embed/UK10KMMJFCI"
63   frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe>
64   <iframe width="280" height="160" src="https://www.youtube.com/embed/DDdIXja7YpE"
65   frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe>
66   <iframe width="280" height="160" src="https://www.youtube.com/embed/M3XAxu9QC7Q"
67   frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe>
68   <iframe width="280" height="160" src="https://www.youtube.com/embed/4FARYLYzNL8"
69   frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe>
70   \endhtmlonly
71 
72   The \ref tutorial-tracking-mb-generic is a good starting point to use this
73   class. If you want to track an object with a stereo camera refer to
74   \ref tutorial-tracking-mb-generic-stereo. If you want rather use a RGB-D camera and exploit
75   the depth information, you may see \ref tutorial-tracking-mb-generic-rgbd.
76   There is also \ref tutorial-detection-object that shows how to initialize the tracker from
77   an initial pose provided by a detection algorithm.
78 
79 */
80 class VISP_EXPORT vpMbGenericTracker : public vpMbTracker
81 {
82 public:
83   enum vpTrackerType {
84     EDGE_TRACKER = 1 << 0, /*!< Model-based tracking using moving edges features. */
85 #if defined(VISP_HAVE_MODULE_KLT) && (defined(VISP_HAVE_OPENCV) && (VISP_HAVE_OPENCV_VERSION >= 0x020100))
86     KLT_TRACKER = 1 << 1, /*!< Model-based tracking using KLT features. */
87 #endif
88     DEPTH_NORMAL_TRACKER = 1 << 2, /*!< Model-based tracking using depth normal features. */
89     DEPTH_DENSE_TRACKER = 1 << 3   /*!< Model-based tracking using depth dense features. */
90   };
91 
92   vpMbGenericTracker();
93   vpMbGenericTracker(unsigned int nbCameras, int trackerType = EDGE_TRACKER);
94   explicit vpMbGenericTracker(const std::vector<int> &trackerTypes);
95   vpMbGenericTracker(const std::vector<std::string> &cameraNames, const std::vector<int> &trackerTypes);
96 
97   virtual ~vpMbGenericTracker();
98 
99   virtual double computeCurrentProjectionError(const vpImage<unsigned char> &I, const vpHomogeneousMatrix &_cMo,
100                                                const vpCameraParameters &_cam);
101   virtual double computeCurrentProjectionError(const vpImage<vpRGBa> &I, const vpHomogeneousMatrix &_cMo,
102                                                const vpCameraParameters &_cam);
103 
104   virtual void display(const vpImage<unsigned char> &I, const vpHomogeneousMatrix &cMo, const vpCameraParameters &cam,
105                        const vpColor &col, unsigned int thickness = 1, bool displayFullModel = false);
106   virtual void display(const vpImage<vpRGBa> &I, const vpHomogeneousMatrix &cMo, const vpCameraParameters &cam,
107                        const vpColor &col, unsigned int thickness = 1, bool displayFullModel = false);
108 
109   virtual void display(const vpImage<unsigned char> &I1, const vpImage<unsigned char> &I2,
110                        const vpHomogeneousMatrix &c1Mo, const vpHomogeneousMatrix &c2Mo, const vpCameraParameters &cam1,
111                        const vpCameraParameters &cam2, const vpColor &color, unsigned int thickness = 1,
112                        bool displayFullModel = false);
113   virtual void display(const vpImage<vpRGBa> &I1, const vpImage<vpRGBa> &I2, const vpHomogeneousMatrix &c1Mo,
114                        const vpHomogeneousMatrix &c2Mo, const vpCameraParameters &cam1, const vpCameraParameters &cam2,
115                        const vpColor &color, unsigned int thickness = 1, bool displayFullModel = false);
116 
117   virtual void display(const std::map<std::string, const vpImage<unsigned char> *> &mapOfImages,
118                        const std::map<std::string, vpHomogeneousMatrix> &mapOfCameraPoses,
119                        const std::map<std::string, vpCameraParameters> &mapOfCameraParameters, const vpColor &col,
120                        unsigned int thickness = 1, bool displayFullModel = false);
121   virtual void display(const std::map<std::string, const vpImage<vpRGBa> *> &mapOfImages,
122                        const std::map<std::string, vpHomogeneousMatrix> &mapOfCameraPoses,
123                        const std::map<std::string, vpCameraParameters> &mapOfCameraParameters, const vpColor &col,
124                        unsigned int thickness = 1, bool displayFullModel = false);
125 
126   virtual std::vector<std::string> getCameraNames() const;
127 
128   using vpMbTracker::getCameraParameters;
129   virtual void getCameraParameters(vpCameraParameters &camera) const;
130   virtual void getCameraParameters(vpCameraParameters &cam1, vpCameraParameters &cam2) const;
131   virtual void getCameraParameters(std::map<std::string, vpCameraParameters> &mapOfCameraParameters) const;
132 
133   virtual std::map<std::string, int> getCameraTrackerTypes() const;
134 
135   using vpMbTracker::getClipping;
136   virtual void getClipping(unsigned int &clippingFlag1, unsigned int &clippingFlag2) const;
137   virtual void getClipping(std::map<std::string, unsigned int> &mapOfClippingFlags) const;
138 
getError()139   virtual inline vpColVector getError() const { return m_error; }
140 
141   virtual vpMbHiddenFaces<vpMbtPolygon> &getFaces();
142   virtual vpMbHiddenFaces<vpMbtPolygon> &getFaces(const std::string &cameraName);
143 
144 #if defined(VISP_HAVE_MODULE_KLT) && (defined(VISP_HAVE_OPENCV) && (VISP_HAVE_OPENCV_VERSION >= 0x020100))
145   virtual std::list<vpMbtDistanceCircle *> &getFeaturesCircle();
146   virtual std::list<vpMbtDistanceKltCylinder *> &getFeaturesKltCylinder();
147   virtual std::list<vpMbtDistanceKltPoints *> &getFeaturesKlt();
148 #endif
149 
150   virtual std::vector<std::vector<double> > getFeaturesForDisplay();
151   virtual void getFeaturesForDisplay(std::map<std::string, std::vector<std::vector<double> > > &mapOfFeatures);
152 
153   virtual double getGoodMovingEdgesRatioThreshold() const;
154 
155 #if defined(VISP_HAVE_MODULE_KLT) && (defined(VISP_HAVE_OPENCV) && (VISP_HAVE_OPENCV_VERSION >= 0x020100))
156   virtual std::vector<vpImagePoint> getKltImagePoints() const;
157   virtual std::map<int, vpImagePoint> getKltImagePointsWithId() const;
158 
159   virtual unsigned int getKltMaskBorder() const;
160   virtual int getKltNbPoints() const;
161 
162   virtual vpKltOpencv getKltOpencv() const;
163   virtual void getKltOpencv(vpKltOpencv &klt1, vpKltOpencv &klt2) const;
164   virtual void getKltOpencv(std::map<std::string, vpKltOpencv> &mapOfKlts) const;
165 
166 #if (VISP_HAVE_OPENCV_VERSION >= 0x020408)
167   virtual std::vector<cv::Point2f> getKltPoints() const;
168 #endif
169 
170   virtual double getKltThresholdAcceptation() const;
171 #endif
172 
173   virtual void getLcircle(std::list<vpMbtDistanceCircle *> &circlesList, unsigned int level = 0) const;
174   virtual void getLcircle(const std::string &cameraName, std::list<vpMbtDistanceCircle *> &circlesList,
175                           unsigned int level = 0) const;
176   virtual void getLcylinder(std::list<vpMbtDistanceCylinder *> &cylindersList, unsigned int level = 0) const;
177   virtual void getLcylinder(const std::string &cameraName, std::list<vpMbtDistanceCylinder *> &cylindersList,
178                             unsigned int level = 0) const;
179   virtual void getLline(std::list<vpMbtDistanceLine *> &linesList, unsigned int level = 0) const;
180   virtual void getLline(const std::string &cameraName, std::list<vpMbtDistanceLine *> &linesList,
181                         unsigned int level = 0) const;
182 
183   virtual std::vector<std::vector<double> > getModelForDisplay(unsigned int width, unsigned int height,
184                                                                const vpHomogeneousMatrix &cMo,
185                                                                const vpCameraParameters &cam,
186                                                                bool displayFullModel=false);
187   virtual void getModelForDisplay(std::map<std::string, std::vector<std::vector<double> > > &mapOfModels,
188                                   const std::map<std::string, unsigned int> &mapOfwidths,
189                                   const std::map<std::string, unsigned int> &mapOfheights,
190                                   const std::map<std::string, vpHomogeneousMatrix> &mapOfcMos,
191                                   const std::map<std::string, vpCameraParameters> &mapOfCams,
192                                   bool displayFullModel=false);
193 
194   virtual vpMe getMovingEdge() const;
195   virtual void getMovingEdge(vpMe &me1, vpMe &me2) const;
196   virtual void getMovingEdge(std::map<std::string, vpMe> &mapOfMovingEdges) const;
197 
198   /*!
199    * Return the number of depth dense features taken into account in the virtual visual-servoing scheme.
200    */
getNbFeaturesDepthDense()201   virtual inline unsigned int getNbFeaturesDepthDense() const { return m_nb_feat_depthDense; }
202   /*!
203    * Return the number of depth normal features features taken into account in the virtual visual-servoing scheme.
204    */
getNbFeaturesDepthNormal()205   virtual inline unsigned int getNbFeaturesDepthNormal() const { return m_nb_feat_depthNormal; }
206   /*!
207    * Return the number of moving-edges features taken into account in the virtual visual-servoing scheme.
208    *
209    * This function is similar to getNbPoints().
210    */
getNbFeaturesEdge()211   virtual inline unsigned int getNbFeaturesEdge() const { return m_nb_feat_edge; }
212   /*!
213    * Return the number of klt keypoints features taken into account in the virtual visual-servoing scheme.
214    */
getNbFeaturesKlt()215   virtual inline unsigned int getNbFeaturesKlt() const { return m_nb_feat_klt; }
216 
217   virtual unsigned int getNbPoints(unsigned int level = 0) const;
218   virtual void getNbPoints(std::map<std::string, unsigned int> &mapOfNbPoints, unsigned int level = 0) const;
219 
220   virtual unsigned int getNbPolygon() const;
221   virtual void getNbPolygon(std::map<std::string, unsigned int> &mapOfNbPolygons) const;
222 
223   virtual vpMbtPolygon *getPolygon(unsigned int index);
224   virtual vpMbtPolygon *getPolygon(const std::string &cameraName, unsigned int index);
225 
226   virtual std::pair<std::vector<vpPolygon>, std::vector<std::vector<vpPoint> > >
227   getPolygonFaces(bool orderPolygons = true, bool useVisibility = true, bool clipPolygon = false);
228   virtual void getPolygonFaces(std::map<std::string, std::vector<vpPolygon> > &mapOfPolygons,
229                                std::map<std::string, std::vector<std::vector<vpPoint> > > &mapOfPoints,
230                                bool orderPolygons = true, bool useVisibility = true,
231                                bool clipPolygon = false);
232 
233   using vpMbTracker::getPose;
234   virtual void getPose(vpHomogeneousMatrix &cMo) const;
235   virtual void getPose(vpHomogeneousMatrix &c1Mo, vpHomogeneousMatrix &c2Mo) const;
236   virtual void getPose(std::map<std::string, vpHomogeneousMatrix> &mapOfCameraPoses) const;
237 
238   virtual std::string getReferenceCameraName() const;
239 
getRobustWeights()240   virtual inline vpColVector getRobustWeights() const { return m_w; }
241 
242   virtual int getTrackerType() const;
243 
244   virtual void init(const vpImage<unsigned char> &I);
245 
246 #ifdef VISP_HAVE_MODULE_GUI
247   using vpMbTracker::initClick;
248   virtual void initClick(const vpImage<unsigned char> &I1, const vpImage<unsigned char> &I2,
249                          const std::string &initFile1, const std::string &initFile2, bool displayHelp = false,
250                          const vpHomogeneousMatrix &T1=vpHomogeneousMatrix(), const vpHomogeneousMatrix &T2=vpHomogeneousMatrix());
251   virtual void initClick(const vpImage<vpRGBa> &I_color1, const vpImage<vpRGBa> &I_color2,
252                          const std::string &initFile1, const std::string &initFile2, bool displayHelp = false,
253                          const vpHomogeneousMatrix &T1=vpHomogeneousMatrix(), const vpHomogeneousMatrix &T2=vpHomogeneousMatrix());
254 
255   virtual void initClick(const std::map<std::string, const vpImage<unsigned char> *> &mapOfImages,
256                          const std::map<std::string, std::string> &mapOfInitFiles, bool displayHelp = false,
257                          const std::map<std::string, vpHomogeneousMatrix> &mapOfT=std::map<std::string, vpHomogeneousMatrix>());
258   virtual void initClick(const std::map<std::string, const vpImage<vpRGBa> *> &mapOfImages,
259                          const std::map<std::string, std::string> &mapOfInitFiles, bool displayHelp = false,
260                          const std::map<std::string, vpHomogeneousMatrix> &mapOfT=std::map<std::string, vpHomogeneousMatrix>());
261 #endif
262 
263   using vpMbTracker::initFromPoints;
264   virtual void initFromPoints(const vpImage<unsigned char> &I1, const vpImage<unsigned char> &I2,
265                               const std::string &initFile1, const std::string &initFile2);
266   virtual void initFromPoints(const vpImage<vpRGBa> &I_color1, const vpImage<vpRGBa> &I_color2,
267                               const std::string &initFile1, const std::string &initFile2);
268 
269   virtual void initFromPoints(const std::map<std::string, const vpImage<unsigned char> *> &mapOfImages,
270                               const std::map<std::string, std::string> &mapOfInitPoints);
271   virtual void initFromPoints(const std::map<std::string, const vpImage<vpRGBa> *> &mapOfColorImages,
272                               const std::map<std::string, std::string> &mapOfInitPoints);
273 
274   using vpMbTracker::initFromPose;
275   virtual void initFromPose(const vpImage<unsigned char> &I, const vpHomogeneousMatrix &cMo);
276   virtual void initFromPose(const vpImage<unsigned char> &I1, const vpImage<unsigned char> &I2,
277                             const std::string &initFile1, const std::string &initFile2);
278   virtual void initFromPose(const vpImage<vpRGBa> &I_color1, const vpImage<vpRGBa> &I_color2,
279                             const std::string &initFile1, const std::string &initFile2);
280 
281   virtual void initFromPose(const std::map<std::string, const vpImage<unsigned char> *> &mapOfImages,
282                             const std::map<std::string, std::string> &mapOfInitPoses);
283   virtual void initFromPose(const std::map<std::string, const vpImage<vpRGBa> *> &mapOfColorImages,
284                             const std::map<std::string, std::string> &mapOfInitPoses);
285 
286   virtual void initFromPose(const vpImage<unsigned char> &I1, const vpImage<unsigned char> &I2,
287                             const vpHomogeneousMatrix &c1Mo, const vpHomogeneousMatrix &c2Mo);
288   virtual void initFromPose(const vpImage<vpRGBa> &I_color1, const vpImage<vpRGBa> &I_color2,
289                             const vpHomogeneousMatrix &c1Mo, const vpHomogeneousMatrix &c2Mo);
290 
291   virtual void initFromPose(const std::map<std::string, const vpImage<unsigned char> *> &mapOfImages,
292                             const std::map<std::string, vpHomogeneousMatrix> &mapOfCameraPoses);
293   virtual void initFromPose(const std::map<std::string, const vpImage<vpRGBa> *> &mapOfColorImages,
294                             const std::map<std::string, vpHomogeneousMatrix> &mapOfCameraPoses);
295 
296   virtual void loadConfigFile(const std::string &configFile, bool verbose=true);
297   virtual void loadConfigFile(const std::string &configFile1, const std::string &configFile2, bool verbose=true);
298   virtual void loadConfigFile(const std::map<std::string, std::string> &mapOfConfigFiles, bool verbose=true);
299 
300   virtual void loadModel(const std::string &modelFile, bool verbose = false, const vpHomogeneousMatrix &T=vpHomogeneousMatrix());
301   virtual void loadModel(const std::string &modelFile1, const std::string &modelFile2, bool verbose = false,
302                          const vpHomogeneousMatrix &T1=vpHomogeneousMatrix(), const vpHomogeneousMatrix &T2=vpHomogeneousMatrix());
303   virtual void loadModel(const std::map<std::string, std::string> &mapOfModelFiles, bool verbose = false,
304                          const std::map<std::string, vpHomogeneousMatrix> &mapOfT=std::map<std::string, vpHomogeneousMatrix>());
305 
306   virtual void reInitModel(const vpImage<unsigned char> &I, const std::string &cad_name,
307                            const vpHomogeneousMatrix &cMo, bool verbose = false,
308                            const vpHomogeneousMatrix &T=vpHomogeneousMatrix());
309   virtual void reInitModel(const vpImage<vpRGBa> &I_color, const std::string &cad_name,
310                            const vpHomogeneousMatrix &cMo, bool verbose = false,
311                            const vpHomogeneousMatrix &T=vpHomogeneousMatrix());
312 
313   virtual void reInitModel(const vpImage<unsigned char> &I1, const vpImage<unsigned char> &I2,
314                            const std::string &cad_name1, const std::string &cad_name2, const vpHomogeneousMatrix &c1Mo,
315                            const vpHomogeneousMatrix &c2Mo, bool verbose = false,
316                            const vpHomogeneousMatrix &T1=vpHomogeneousMatrix(), const vpHomogeneousMatrix &T2=vpHomogeneousMatrix());
317   virtual void reInitModel(const vpImage<vpRGBa> &I_color1, const vpImage<vpRGBa> &I_color2,
318                            const std::string &cad_name1, const std::string &cad_name2, const vpHomogeneousMatrix &c1Mo,
319                            const vpHomogeneousMatrix &c2Mo, bool verbose = false,
320                            const vpHomogeneousMatrix &T1=vpHomogeneousMatrix(), const vpHomogeneousMatrix &T2=vpHomogeneousMatrix());
321 
322   virtual void reInitModel(const std::map<std::string, const vpImage<unsigned char> *> &mapOfImages,
323                            const std::map<std::string, std::string> &mapOfModelFiles,
324                            const std::map<std::string, vpHomogeneousMatrix> &mapOfCameraPoses,
325                            bool verbose = false,
326                            const std::map<std::string, vpHomogeneousMatrix> &mapOfT=std::map<std::string, vpHomogeneousMatrix>());
327   virtual void reInitModel(const std::map<std::string, const vpImage<vpRGBa> *> &mapOfColorImages,
328                            const std::map<std::string, std::string> &mapOfModelFiles,
329                            const std::map<std::string, vpHomogeneousMatrix> &mapOfCameraPoses,
330                            bool verbose = false,
331                            const std::map<std::string, vpHomogeneousMatrix> &mapOfT=std::map<std::string, vpHomogeneousMatrix>());
332 
333   virtual void resetTracker();
334 
335   virtual void setAngleAppear(const double &a);
336   virtual void setAngleAppear(const double &a1, const double &a2);
337   virtual void setAngleAppear(const std::map<std::string, double> &mapOfAngles);
338 
339   virtual void setAngleDisappear(const double &a);
340   virtual void setAngleDisappear(const double &a1, const double &a2);
341   virtual void setAngleDisappear(const std::map<std::string, double> &mapOfAngles);
342 
343   virtual void setCameraParameters(const vpCameraParameters &camera);
344   virtual void setCameraParameters(const vpCameraParameters &camera1, const vpCameraParameters &camera2);
345   virtual void setCameraParameters(const std::map<std::string, vpCameraParameters> &mapOfCameraParameters);
346 
347   virtual void setCameraTransformationMatrix(const std::string &cameraName,
348                                              const vpHomogeneousMatrix &cameraTransformationMatrix);
349   virtual void
350   setCameraTransformationMatrix(const std::map<std::string, vpHomogeneousMatrix> &mapOfTransformationMatrix);
351 
352   virtual void setClipping(const unsigned int &flags);
353   virtual void setClipping(const unsigned int &flags1, const unsigned int &flags2);
354   virtual void setClipping(const std::map<std::string, unsigned int> &mapOfClippingFlags);
355 
356   virtual void setDepthDenseFilteringMaxDistance(double maxDistance);
357   virtual void setDepthDenseFilteringMethod(int method);
358   virtual void setDepthDenseFilteringMinDistance(double minDistance);
359   virtual void setDepthDenseFilteringOccupancyRatio(double occupancyRatio);
360   virtual void setDepthDenseSamplingStep(unsigned int stepX, unsigned int stepY);
361 
362   virtual void setDepthNormalFaceCentroidMethod(const vpMbtFaceDepthNormal::vpFaceCentroidType &method);
363   virtual void setDepthNormalFeatureEstimationMethod(const vpMbtFaceDepthNormal::vpFeatureEstimationType &method);
364   virtual void setDepthNormalPclPlaneEstimationMethod(int method);
365   virtual void setDepthNormalPclPlaneEstimationRansacMaxIter(int maxIter);
366   virtual void setDepthNormalPclPlaneEstimationRansacThreshold(double threshold);
367   virtual void setDepthNormalSamplingStep(unsigned int stepX, unsigned int stepY);
368 
369   virtual void setDisplayFeatures(bool displayF);
370 
371   virtual void setFarClippingDistance(const double &dist);
372   virtual void setFarClippingDistance(const double &dist1, const double &dist2);
373   virtual void setFarClippingDistance(const std::map<std::string, double> &mapOfClippingDists);
374 
375   virtual void setFeatureFactors(const std::map<vpTrackerType, double> &mapOfFeatureFactors);
376 
377   virtual void setGoodMovingEdgesRatioThreshold(double threshold);
378 
379 #ifdef VISP_HAVE_OGRE
380   virtual void setGoodNbRayCastingAttemptsRatio(const double &ratio);
381   virtual void setNbRayCastingAttemptsForVisibility(const unsigned int &attempts);
382 #endif
383 
384 #if defined(VISP_HAVE_MODULE_KLT) && (defined(VISP_HAVE_OPENCV) && (VISP_HAVE_OPENCV_VERSION >= 0x020100))
385   virtual void setKltMaskBorder(const unsigned int &e);
386   virtual void setKltMaskBorder(const unsigned int &e1, const unsigned int &e2);
387   virtual void setKltMaskBorder(const std::map<std::string, unsigned int> &mapOfErosions);
388 
389   virtual void setKltOpencv(const vpKltOpencv &t);
390   virtual void setKltOpencv(const vpKltOpencv &t1, const vpKltOpencv &t2);
391   virtual void setKltOpencv(const std::map<std::string, vpKltOpencv> &mapOfKlts);
392 
393   virtual void setKltThresholdAcceptation(double th);
394 
395 #endif
396 
397   virtual void setLod(bool useLod, const std::string &name = "");
398 
399   virtual void setMask(const vpImage<bool> &mask);
400 
401   virtual void setMinLineLengthThresh(double minLineLengthThresh, const std::string &name = "");
402   virtual void setMinPolygonAreaThresh(double minPolygonAreaThresh, const std::string &name = "");
403 
404   virtual void setMovingEdge(const vpMe &me);
405   virtual void setMovingEdge(const vpMe &me1, const vpMe &me2);
406   virtual void setMovingEdge(const std::map<std::string, vpMe> &mapOfMe);
407 
408   virtual void setNearClippingDistance(const double &dist);
409   virtual void setNearClippingDistance(const double &dist1, const double &dist2);
410   virtual void setNearClippingDistance(const std::map<std::string, double> &mapOfDists);
411 
412   virtual void setOgreShowConfigDialog(bool showConfigDialog);
413   virtual void setOgreVisibilityTest(const bool &v);
414 
415   virtual void setOptimizationMethod(const vpMbtOptimizationMethod &opt);
416 
417   virtual void setPose(const vpImage<unsigned char> &I, const vpHomogeneousMatrix &cdMo);
418   virtual void setPose(const vpImage<vpRGBa> &I_color, const vpHomogeneousMatrix &cdMo);
419 
420   virtual void setPose(const vpImage<unsigned char> &I1, const vpImage<unsigned char> &I2,
421                        const vpHomogeneousMatrix &c1Mo, const vpHomogeneousMatrix &c2Mo);
422   virtual void setPose(const vpImage<vpRGBa> &I_color1, const vpImage<vpRGBa> &I_color2,
423                        const vpHomogeneousMatrix &c1Mo, const vpHomogeneousMatrix &c2Mo);
424 
425   virtual void setPose(const std::map<std::string, const vpImage<unsigned char> *> &mapOfImages,
426                        const std::map<std::string, vpHomogeneousMatrix> &mapOfCameraPoses);
427   virtual void setPose(const std::map<std::string, const vpImage<vpRGBa> *> &mapOfColorImages,
428                        const std::map<std::string, vpHomogeneousMatrix> &mapOfCameraPoses);
429 
430   virtual void setProjectionErrorComputation(const bool &flag);
431 
432   virtual void setProjectionErrorDisplay(bool display);
433   virtual void setProjectionErrorDisplayArrowLength(unsigned int length);
434   virtual void setProjectionErrorDisplayArrowThickness(unsigned int thickness);
435 
436   virtual void setReferenceCameraName(const std::string &referenceCameraName);
437 
438   virtual void setScanLineVisibilityTest(const bool &v);
439 
440   virtual void setTrackerType(int type);
441   virtual void setTrackerType(const std::map<std::string, int> &mapOfTrackerTypes);
442 
443   virtual void setUseDepthDenseTracking(const std::string &name, const bool &useDepthDenseTracking);
444   virtual void setUseDepthNormalTracking(const std::string &name, const bool &useDepthNormalTracking);
445   virtual void setUseEdgeTracking(const std::string &name, const bool &useEdgeTracking);
446 #if defined(VISP_HAVE_MODULE_KLT) && (defined(VISP_HAVE_OPENCV) && (VISP_HAVE_OPENCV_VERSION >= 0x020100))
447   virtual void setUseKltTracking(const std::string &name, const bool &useKltTracking);
448 #endif
449 
450   virtual void testTracking();
451 
452   virtual void track(const vpImage<unsigned char> &I);
453   virtual void track(const vpImage<vpRGBa> &I_color);
454 
455   virtual void track(const vpImage<unsigned char> &I1, const vpImage<unsigned char> &I2);
456   virtual void track(const vpImage<vpRGBa> &I_color1, const vpImage<vpRGBa> &I_color2);
457 
458   virtual void track(std::map<std::string, const vpImage<unsigned char> *> &mapOfImages);
459   virtual void track(std::map<std::string, const vpImage<vpRGBa> *> &mapOfColorImages);
460 
461 #ifdef VISP_HAVE_PCL
462   virtual void track(std::map<std::string, const vpImage<unsigned char> *> &mapOfImages,
463                      std::map<std::string, pcl::PointCloud<pcl::PointXYZ>::ConstPtr> &mapOfPointClouds);
464   virtual void track(std::map<std::string, const vpImage<vpRGBa> *> &mapOfColorImages,
465                      std::map<std::string, pcl::PointCloud<pcl::PointXYZ>::ConstPtr> &mapOfPointClouds);
466 #endif
467 
468   virtual void track(std::map<std::string, const vpImage<unsigned char> *> &mapOfImages,
469                      std::map<std::string, const std::vector<vpColVector> *> &mapOfPointClouds,
470                      std::map<std::string, unsigned int> &mapOfPointCloudWidths,
471                      std::map<std::string, unsigned int> &mapOfPointCloudHeights);
472   virtual void track(std::map<std::string, const vpImage<vpRGBa> *> &mapOfColorImages,
473                      std::map<std::string, const std::vector<vpColVector> *> &mapOfPointClouds,
474                      std::map<std::string, unsigned int> &mapOfPointCloudWidths,
475                      std::map<std::string, unsigned int> &mapOfPointCloudHeights);
476 
477 protected:
478   virtual void computeProjectionError();
479 
480   virtual void computeVVS(std::map<std::string, const vpImage<unsigned char> *> &mapOfImages);
481 
482   virtual void computeVVSInit();
483   virtual void computeVVSInit(std::map<std::string, const vpImage<unsigned char> *> &mapOfImages);
484   virtual void computeVVSInteractionMatrixAndResidu();
485   virtual void computeVVSInteractionMatrixAndResidu(std::map<std::string, const vpImage<unsigned char> *> &mapOfImages,
486                                                     std::map<std::string, vpVelocityTwistMatrix> &mapOfVelocityTwist);
487   using vpMbTracker::computeVVSWeights;
488   virtual void computeVVSWeights();
489 
490   virtual void initCircle(const vpPoint &p1, const vpPoint &p2, const vpPoint &p3, double radius,
491                           int idFace = 0, const std::string &name = "");
492 
493   virtual void initCylinder(const vpPoint &p1, const vpPoint &p2, double radius, int idFace = 0,
494                             const std::string &name = "");
495 
496   virtual void initFaceFromCorners(vpMbtPolygon &polygon);
497 
498   virtual void initFaceFromLines(vpMbtPolygon &polygon);
499 
500 #ifdef VISP_HAVE_PCL
501   virtual void preTracking(std::map<std::string, const vpImage<unsigned char> *> &mapOfImages,
502                            std::map<std::string, pcl::PointCloud<pcl::PointXYZ>::ConstPtr> &mapOfPointClouds);
503 #endif
504   virtual void preTracking(std::map<std::string, const vpImage<unsigned char> *> &mapOfImages,
505                            std::map<std::string, const std::vector<vpColVector> *> &mapOfPointClouds,
506                            std::map<std::string, unsigned int> &mapOfPointCloudWidths,
507                            std::map<std::string, unsigned int> &mapOfPointCloudHeights);
508 
509 private:
510   class TrackerWrapper : public vpMbEdgeTracker,
511 #if defined(VISP_HAVE_MODULE_KLT) && (defined(VISP_HAVE_OPENCV) && (VISP_HAVE_OPENCV_VERSION >= 0x020100))
512                          public vpMbKltTracker,
513 #endif
514                          public vpMbDepthNormalTracker,
515                          public vpMbDepthDenseTracker
516   {
517     friend class vpMbGenericTracker;
518 
519   public:
520     //! (s - s*)
521     vpColVector m_error;
522     //! Interaction matrix
523     vpMatrix m_L;
524     //! Type of the tracker (a combination of the above)
525     int m_trackerType;
526     //! Robust weights
527     vpColVector m_w;
528     //! Weighted error
529     vpColVector m_weightedError;
530 
531     TrackerWrapper();
532     explicit TrackerWrapper(int trackerType);
533 
534     virtual ~TrackerWrapper();
535 
getError()536     virtual inline vpColVector getError() const { return m_error; }
537 
getRobustWeights()538     virtual inline vpColVector getRobustWeights() const { return m_w; }
539 
getTrackerType()540     virtual inline int getTrackerType() const { return m_trackerType; }
541 
542     virtual void display(const vpImage<unsigned char> &I, const vpHomogeneousMatrix &cMo, const vpCameraParameters &cam,
543                          const vpColor &col, unsigned int thickness = 1, bool displayFullModel = false);
544     virtual void display(const vpImage<vpRGBa> &I, const vpHomogeneousMatrix &cMo, const vpCameraParameters &cam,
545                          const vpColor &col, unsigned int thickness = 1, bool displayFullModel = false);
546 
547     virtual std::vector<std::vector<double> > getFeaturesForDisplay();
548 
549     virtual std::vector<std::vector<double> > getModelForDisplay(unsigned int width, unsigned int height,
550                                                                  const vpHomogeneousMatrix &cMo,
551                                                                  const vpCameraParameters &cam,
552                                                                  bool displayFullModel=false);
553 
554     virtual void init(const vpImage<unsigned char> &I);
555 
556     virtual void loadConfigFile(const std::string &configFile, bool verbose=true);
557 
558     virtual void reInitModel(const vpImage<unsigned char> &I, const std::string &cad_name,
559                              const vpHomogeneousMatrix &cMo, bool verbose = false,
560                              const vpHomogeneousMatrix &T=vpHomogeneousMatrix());
561     virtual void reInitModel(const vpImage<vpRGBa> &I_color, const std::string &cad_name,
562                              const vpHomogeneousMatrix &cMo, bool verbose = false,
563                              const vpHomogeneousMatrix &T=vpHomogeneousMatrix());
564 
565     virtual void resetTracker();
566 
567     virtual void setCameraParameters(const vpCameraParameters &camera);
568 
569     virtual void setClipping(const unsigned int &flags);
570 
571     virtual void setFarClippingDistance(const double &dist);
572 
573     virtual void setNearClippingDistance(const double &dist);
574 
575     virtual void setOgreVisibilityTest(const bool &v);
576 
577     virtual void setPose(const vpImage<unsigned char> &I, const vpHomogeneousMatrix &cdMo);
578     virtual void setPose(const vpImage<vpRGBa> &I_color, const vpHomogeneousMatrix &cdMo);
579 
580     virtual void setProjectionErrorComputation(const bool &flag);
581 
582     virtual void setScanLineVisibilityTest(const bool &v);
583 
584     virtual void setTrackerType(int type);
585 
586     virtual void testTracking();
587 
588     virtual void track(const vpImage<unsigned char> &I);
589     virtual void track(const vpImage<vpRGBa> &I_color);
590 #ifdef VISP_HAVE_PCL
591     // Fix error: using declaration ‘using vpMbDepthDenseTracker::setPose’ conflicts with a previous
592     // using declaration that occurs with g++ 4.6.3 on Ubuntu 12.04
593 #if !((__GNUC__ == 4) && (__GNUC_MINOR__ == 6))
594     using vpMbDepthNormalTracker::track;
595 #endif
596     using vpMbDepthDenseTracker::track;
597     using vpMbEdgeTracker::track;
598     virtual void track(const vpImage<unsigned char> *const ptr_I,
599                        const pcl::PointCloud<pcl::PointXYZ>::ConstPtr &point_cloud);
600 #endif
601 
602   protected:
603     virtual void computeVVS(const vpImage<unsigned char> *const ptr_I);
604     virtual void computeVVSInit();
605     virtual void computeVVSInit(const vpImage<unsigned char> *const ptr_I);
606     virtual void computeVVSInteractionMatrixAndResidu();
607     using vpMbEdgeTracker::computeVVSInteractionMatrixAndResidu;
608     virtual void computeVVSInteractionMatrixAndResidu(const vpImage<unsigned char> *const ptr_I);
609     using vpMbTracker::computeVVSWeights;
610     virtual void computeVVSWeights();
611 
612     virtual void initCircle(const vpPoint &p1, const vpPoint &p2, const vpPoint &p3, double radius,
613                             int idFace = 0, const std::string &name = "");
614 
615     virtual void initCylinder(const vpPoint &p1, const vpPoint &p2, double radius, int idFace = 0,
616                               const std::string &name = "");
617 
618     virtual void initFaceFromCorners(vpMbtPolygon &polygon);
619     virtual void initFaceFromLines(vpMbtPolygon &polygon);
620 
621     virtual void initMbtTracking(const vpImage<unsigned char> *const ptr_I);
622 
623 #ifdef VISP_HAVE_PCL
624     virtual void postTracking(const vpImage<unsigned char> *const ptr_I,
625                               const pcl::PointCloud<pcl::PointXYZ>::ConstPtr &point_cloud);
626     virtual void preTracking(const vpImage<unsigned char> *const ptr_I,
627                              const pcl::PointCloud<pcl::PointXYZ>::ConstPtr &point_cloud);
628 #endif
629     virtual void postTracking(const vpImage<unsigned char> *const ptr_I = NULL, const unsigned int pointcloud_width = 0,
630                               const unsigned int pointcloud_height = 0);
631     virtual void preTracking(const vpImage<unsigned char> *const ptr_I = NULL,
632                              const std::vector<vpColVector> *const point_cloud = NULL,
633                              const unsigned int pointcloud_width = 0, const unsigned int pointcloud_height = 0);
634 
635     virtual void reInitModel(const vpImage<unsigned char> * const I, const vpImage<vpRGBa> * const I_color,
636                              const std::string &cad_name, const vpHomogeneousMatrix &cMo, bool verbose = false,
637                              const vpHomogeneousMatrix &T=vpHomogeneousMatrix());
638 
639 #ifdef VISP_HAVE_PCL
640     // Fix error: using declaration ‘using vpMbDepthDenseTracker::track’ conflicts with a previous
641     // using declaration that occurs with g++ 4.6.3 on Ubuntu 12.04
642 #if !((__GNUC__ == 4) && (__GNUC_MINOR__ == 6))
643     using vpMbDepthNormalTracker::setPose;
644 #endif
645     using vpMbDepthDenseTracker::setPose;
646 #endif
647     virtual void setPose(const vpImage<unsigned char> * const I, const vpImage<vpRGBa> * const I_color,
648                          const vpHomogeneousMatrix &cdMo);
649   };
650 
651 protected:
652   //! (s - s*)
653   vpColVector m_error;
654   //! Interaction matrix
655   vpMatrix m_L;
656   //! Map of camera transformation matrix between the current camera frame to
657   //! the reference camera frame (cCurrent_M_cRef)
658   std::map<std::string, vpHomogeneousMatrix> m_mapOfCameraTransformationMatrix;
659   //! Ponderation between each feature type in the VVS stage
660   std::map<vpTrackerType, double> m_mapOfFeatureFactors;
661   //! Map of Model-based trackers, key is the name of the camera, value is the
662   //! tracker
663   std::map<std::string, TrackerWrapper *> m_mapOfTrackers;
664   //! Percentage of good points over total number of points below which
665   //! tracking is supposed to have failed (only for Edge tracking).
666   double m_percentageGdPt;
667   //! Name of the reference camera
668   std::string m_referenceCameraName;
669   //! Threshold below which the weight associated to a point to consider this
670   //! one as an outlier (only for KLT tracking).
671   double m_thresholdOutlier;
672   //! Robust weights
673   vpColVector m_w;
674   //! Weighted error
675   vpColVector m_weightedError;
676 
677   //! Number of moving-edges features
678   unsigned int m_nb_feat_edge;
679   //! Number of klt features
680   unsigned int m_nb_feat_klt;
681   //! Number of depth normal features
682   unsigned int m_nb_feat_depthNormal;
683   //! Number of depth dense features
684   unsigned int m_nb_feat_depthDense;
685 
686 };
687 #endif
688