Visual Servoing Platform  version 3.0.1
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
mbtEdgeMultiTracking.cpp
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
7  * modify it under the terms of the GNU General Public License
8  * ("GPL") version 2 as published by the Free Software Foundation.
9  * See the file LICENSE.txt at the root directory of this source
10  * distribution for additional information about the GNU GPL.
11  *
12  * For using ViSP with software that can not be combined with the GNU
13  * GPL, please contact Inria about acquiring a ViSP Professional
14  * Edition License.
15  *
16  * See http://visp.inria.fr for more information.
17  *
18  * This software was developed at:
19  * Inria Rennes - Bretagne Atlantique
20  * Campus Universitaire de Beaulieu
21  * 35042 Rennes Cedex
22  * France
23  *
24  * If you have questions regarding the use of this file, please contact
25  * Inria at visp@inria.fr
26  *
27  * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
28  * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
29  *
30  * Description:
31  * Example of model based tracking.
32  *
33  * Authors:
34  * Nicolas Melchior
35  * Romain Tallonneau
36  * Aurelien Yol
37  * Souriya Trinh
38  *
39  *****************************************************************************/
40 
47 #include <iostream>
48 #include <visp3/core/vpConfig.h>
49 
50 #if defined(VISP_HAVE_MODULE_MBT) && defined(VISP_HAVE_DISPLAY)
51 
52 #include <visp3/core/vpDebug.h>
53 #include <visp3/gui/vpDisplayD3D.h>
54 #include <visp3/gui/vpDisplayGTK.h>
55 #include <visp3/gui/vpDisplayGDI.h>
56 #include <visp3/gui/vpDisplayOpenCV.h>
57 #include <visp3/gui/vpDisplayX.h>
58 #include <visp3/core/vpHomogeneousMatrix.h>
59 #include <visp3/io/vpImageIo.h>
60 #include <visp3/core/vpIoTools.h>
61 #include <visp3/core/vpMath.h>
62 #include <visp3/io/vpVideoReader.h>
63 #include <visp3/io/vpParseArgv.h>
64 #include <visp3/mbt/vpMbEdgeMultiTracker.h>
65 
66 #define GETOPTARGS "x:m:i:n:dchtfColwvp"
67 
68 
69 void usage(const char *name, const char *badparam)
70 {
71  fprintf(stdout, "\n\
72 Example of tracking based on the 3D model.\n\
73 \n\
74 SYNOPSIS\n\
75  %s [-i <test image path>] [-x <config file>]\n\
76  [-m <model name>] [-n <initialisation file base name>]\n\
77  [-t] [-c] [-d] [-h] [-f] [-C] [-o] [-w] [-l] [-v] [-p]",
78  name );
79 
80  fprintf(stdout, "\n\
81 OPTIONS: \n\
82  -i <input image path> \n\
83  Set image input path.\n\
84  From this path read images \n\
85  \"ViSP-images/mbt/cube/image%%04d.ppm\". These \n\
86  images come from ViSP-images-x.y.z.tar.gz available \n\
87  on the ViSP website.\n\
88  Setting the VISP_INPUT_IMAGE_PATH environment\n\
89  variable produces the same behavior than using\n\
90  this option.\n\
91 \n\
92  -x <config file> \n\
93  Set the config file (the xml file) to use.\n\
94  The config file is used to specify the parameters of the tracker.\n\
95 \n\
96  -m <model name> \n\
97  Specify the name of the file of the model\n\
98  The model can either be a vrml model (.wrl) or a .cao file.\n\
99 \n\
100  -f \n\
101  Do not use the vrml model, use the .cao one. These two models are \n\
102  equivalent and comes from ViSP-images-x.y.z.tar.gz available on the ViSP\n\
103  website. However, the .cao model allows to use the 3d model based tracker \n\
104  without Coin.\n\
105 \n\
106  -C \n\
107  Track only the cube (not the cylinder). In this case the models files are\n\
108  cube.cao or cube.wrl instead of cube_and_cylinder.cao and \n\
109  cube_and_cylinder.wrl.\n\
110 \n\
111  -n <initialisation file base name> \n\
112  Base name of the initialisation file. The file will be 'base_name'.init .\n\
113  This base name is also used for the optional picture specifying where to \n\
114  click (a .ppm picture).\
115 \n\
116  -t \n\
117  Turn off the display of the the moving edges. \n\
118 \n\
119  -d \n\
120  Turn off the display.\n\
121 \n\
122  -c\n\
123  Disable the mouse click. Useful to automate the \n\
124  execution of this program without human intervention.\n\
125 \n\
126  -o\n\
127  Use Ogre3D for visibility tests.\n\
128 \n\
129  -w\n\
130  When Ogre3D is enable [-o] show Ogre3D configuration dialog that allows to set the renderer.\n\
131 \n\
132  -l\n\
133  Use the scanline for visibility tests.\n\
134 \n\
135  -v\n\
136  Compute covariance matrix.\n\
137 \n\
138  -v\n\
139  Compute gradient projection error.\n\
140 \n\
141  -h \n\
142  Print the help.\n\n");
143 
144  if (badparam)
145  fprintf(stdout, "\nERROR: Bad parameter [%s]\n", badparam);
146 }
147 
148 
149 bool getOptions(int argc, const char **argv, std::string &ipath, std::string &configFile, std::string &modelFile,
150  std::string &initFile, bool &displayFeatures, bool &click_allowed, bool &display,
151  bool& cao3DModel, bool& trackCylinder, bool &useOgre, bool &showOgreConfigDialog,
152  bool &useScanline, bool &computeCovariance, bool &projectionError)
153 {
154  const char *optarg_;
155  int c;
156  while ((c = vpParseArgv::parse(argc, argv, GETOPTARGS, &optarg_)) > 1) {
157 
158  switch (c) {
159  case 'i': ipath = optarg_; break;
160  case 'x': configFile = optarg_; break;
161  case 'm': modelFile = optarg_; break;
162  case 'n': initFile = optarg_; break;
163  case 't': displayFeatures = false; break;
164  case 'f': cao3DModel = true; break;
165  case 'c': click_allowed = false; break;
166  case 'd': display = false; break;
167  case 'C': trackCylinder = false; break;
168  case 'o': useOgre = true; break;
169  case 'l': useScanline = true; break;
170  case 'w': showOgreConfigDialog = true; break;
171  case 'v': computeCovariance = true; break;
172  case 'p': projectionError = true; break;
173  case 'h': usage(argv[0], NULL); return false; break;
174 
175  default:
176  usage(argv[0], optarg_);
177  return false; break;
178  }
179  }
180 
181  if ((c == 1) || (c == -1)) {
182  // standalone param or error
183  usage(argv[0], NULL);
184  std::cerr << "ERROR: " << std::endl;
185  std::cerr << " Bad argument " << optarg_ << std::endl << std::endl;
186  return false;
187  }
188 
189  return true;
190 }
191 
192 int
193 main(int argc, const char ** argv)
194 {
195  try {
196  std::string env_ipath;
197  std::string opt_ipath;
198  std::string ipath;
199  std::string opt_configFile;
200  std::string configFile;
201  std::string opt_modelFile;
202  std::string modelFile;
203  std::string opt_initFile;
204  std::string initFile;
205  bool displayFeatures = true;
206  bool opt_click_allowed = true;
207  bool opt_display = true;
208  bool cao3DModel = false;
209  bool trackCylinder = true;
210  bool useOgre = false;
211  bool showOgreConfigDialog = false;
212  bool useScanline = false;
213  bool computeCovariance = false;
214  bool projectionError = false;
215  bool quit = false;
216 
217  // Get the visp-images-data package path or VISP_INPUT_IMAGE_PATH environment variable value
218  env_ipath = vpIoTools::getViSPImagesDataPath();
219 
220  // Set the default input path
221  if (! env_ipath.empty())
222  ipath = env_ipath;
223 
224 
225  // Read the command line options
226  if (!getOptions(argc, argv, opt_ipath, opt_configFile, opt_modelFile, opt_initFile, displayFeatures,
227  opt_click_allowed, opt_display, cao3DModel, trackCylinder, useOgre, showOgreConfigDialog,
228  useScanline, computeCovariance, projectionError)) {
229  return (-1);
230  }
231 
232  // Test if an input path is set
233  if (opt_ipath.empty() && env_ipath.empty() ){
234  usage(argv[0], NULL);
235  std::cerr << std::endl
236  << "ERROR:" << std::endl;
237  std::cerr << " Use -i <visp image path> option or set VISP_INPUT_IMAGE_PATH "
238  << std::endl
239  << " environment variable to specify the location of the " << std::endl
240  << " image path where test images are located." << std::endl
241  << std::endl;
242 
243  return (-1);
244  }
245 
246  // Get the option values
247  if (!opt_ipath.empty())
248  ipath = vpIoTools::createFilePath(opt_ipath, "ViSP-images/mbt/cube/image%04d.pgm");
249  else
250  ipath = vpIoTools::createFilePath(env_ipath, "ViSP-images/mbt/cube/image%04d.pgm");
251 
252  if (!opt_configFile.empty())
253  configFile = opt_configFile;
254  else if (!opt_ipath.empty())
255  configFile = vpIoTools::createFilePath(opt_ipath, "ViSP-images/mbt/cube.xml");
256  else
257  configFile = vpIoTools::createFilePath(env_ipath, "ViSP-images/mbt/cube.xml");
258 
259  if (!opt_modelFile.empty()){
260  modelFile = opt_modelFile;
261  }else{
262  std::string modelFileCao;
263  std::string modelFileWrl;
264  if(trackCylinder){
265  modelFileCao = "ViSP-images/mbt/cube_and_cylinder.cao";
266  modelFileWrl = "ViSP-images/mbt/cube_and_cylinder.wrl";
267  }else{
268  modelFileCao = "ViSP-images/mbt/cube.cao";
269  modelFileWrl = "ViSP-images/mbt/cube.wrl";
270  }
271 
272  if(!opt_ipath.empty()){
273  if(cao3DModel){
274  modelFile = vpIoTools::createFilePath(opt_ipath, modelFileCao);
275  }
276  else{
277 #ifdef VISP_HAVE_COIN3D
278  modelFile = vpIoTools::createFilePath(opt_ipath, modelFileWrl);
279 #else
280  std::cerr << "Coin is not detected in ViSP. Use the .cao model instead." << std::endl;
281  modelFile = vpIoTools::createFilePath(opt_ipath, modelFileCao);
282 #endif
283  }
284  }
285  else{
286  if(cao3DModel){
287  modelFile = vpIoTools::createFilePath(env_ipath, modelFileCao);
288  }
289  else{
290 #ifdef VISP_HAVE_COIN3D
291  modelFile = vpIoTools::createFilePath(env_ipath, modelFileWrl);
292 #else
293  std::cerr << "Coin is not detected in ViSP. Use the .cao model instead." << std::endl;
294  modelFile = vpIoTools::createFilePath(env_ipath, modelFileCao);
295 #endif
296  }
297  }
298  }
299 
300  if (!opt_initFile.empty())
301  initFile = opt_initFile;
302  else if (!opt_ipath.empty())
303  initFile = vpIoTools::createFilePath(opt_ipath, "ViSP-images/mbt/cube");
304  else
305  initFile = vpIoTools::createFilePath(env_ipath, "ViSP-images/mbt/cube");
306 
307  vpImage<unsigned char> I1, I2;
308  vpVideoReader reader;
309 
310  reader.setFileName(ipath);
311  try{
312  reader.open(I1);
313  I2 = I1;
314  }catch(...){
315  std::cout << "Cannot open sequence: " << ipath << std::endl;
316  return -1;
317  }
318 
319  reader.acquire(I1);
320  I2 = I1;
321 
322  // initialise a display
323 #if defined VISP_HAVE_X11
324  vpDisplayX display1, display2;
325 #elif defined VISP_HAVE_GDI
326  vpDisplayGDI display1, display2;
327 #elif defined VISP_HAVE_OPENCV
328  vpDisplayOpenCV display1, display2;
329 #elif defined VISP_HAVE_D3D9
330  vpDisplayD3D display1, display2;
331 #elif defined VISP_HAVE_GTK
332  vpDisplayGTK display1, display2;
333 #else
334  opt_display = false;
335 #endif
336  if (opt_display)
337  {
338 #if (defined VISP_HAVE_DISPLAY)
341  display1.init(I1, 100, 100, "Test tracking (Left)");
342  display2.init(I2, (int)(I1.getWidth()/vpDisplay::getDownScalingFactor(I1)+110), 100, "Test tracking (Right)");
343 #endif
344  vpDisplay::display(I1);
345  vpDisplay::display(I2);
346  vpDisplay::flush(I1);
347  vpDisplay::flush(I2);
348  }
349 
350  vpMbEdgeMultiTracker tracker(2);
351  vpHomogeneousMatrix c1Mo, c2Mo;
352 
353  // Initialise the tracker: camera parameters, moving edge and KLT settings
354  vpCameraParameters cam1, cam2;
355 #if defined (VISP_HAVE_XML2)
356  // From the xml file
357  tracker.loadConfigFile(configFile, configFile);
358 #else
359  // By setting the parameters:
360  cam1.initPersProjWithoutDistortion(547, 542, 338, 234);
361  cam2.initPersProjWithoutDistortion(547, 542, 338, 234);
362 
363  vpMe me;
364  me.setMaskSize(5);
365  me.setMaskNumber(180);
366  me.setRange(7);
367  me.setThreshold(5000);
368  me.setMu1(0.5);
369  me.setMu2(0.5);
370  me.setSampleStep(4);
371 
372  tracker.setCameraParameters(cam1, cam2);
373  tracker.setMovingEdge(me);
374 
375  // Specify the clipping to use
376  tracker.setNearClippingDistance(0.01);
377  tracker.setFarClippingDistance(0.90);
378  tracker.setClipping(tracker.getClipping() | vpMbtPolygon::FOV_CLIPPING);
379  // tracker.setClipping(tracker.getClipping() | vpMbtPolygon::LEFT_CLIPPING | vpMbtPolygon::RIGHT_CLIPPING | vpMbtPolygon::UP_CLIPPING | vpMbtPolygon::DOWN_CLIPPING); // Equivalent to FOV_CLIPPING
380 #endif
381 
382  // Display the moving edges, see documentation for the signification of the colours
383  tracker.setDisplayFeatures(displayFeatures);
384 
385  // Tells if the tracker has to use Ogre3D for visibility tests
386  tracker.setOgreVisibilityTest(useOgre);
387  if (useOgre)
388  tracker.setOgreShowConfigDialog(showOgreConfigDialog);
389 
390  // Tells if the tracker has to use the scanline visibility tests
391  tracker.setScanLineVisibilityTest(useScanline);
392 
393  // Tells if the tracker has to compute the covariance matrix
394  tracker.setCovarianceComputation(computeCovariance);
395 
396  // Tells if the tracker has to compute the projection error
397  tracker.setProjectionErrorComputation(projectionError);
398 
399  // Retrieve the camera parameters from the tracker
400  tracker.getCameraParameters(cam1, cam2);
401 
402  // Set camera transformation matrices
403  std::map<std::string, vpHomogeneousMatrix> mapOfCamTrans;
404  mapOfCamTrans["Camera1"] = vpHomogeneousMatrix();
405  mapOfCamTrans["Camera2"] = vpHomogeneousMatrix();
406  tracker.setCameraTransformationMatrix(mapOfCamTrans);
407 
408  // Loop to position the cube
409  if (opt_display && opt_click_allowed)
410  {
411  while(!vpDisplay::getClick(I1,false)){
412  vpDisplay::display(I1);
413  vpDisplay::displayText(I1, 15, 10, "click after positioning the object", vpColor::red);
414  vpDisplay::flush(I1) ;
415  vpTime::wait(100);
416  }
417  }
418 
419  // Load the 3D model (either a vrml file or a .cao file)
420  tracker.loadModel(modelFile);
421 
422  // Initialise the tracker by clicking on the image
423  // This function looks for
424  // - a ./cube/cube.init file that defines the 3d coordinates (in meter, in the object basis) of the points used for the initialisation
425  // - a ./cube/cube.ppm file to display where the user have to click (optionnal, set by the third parameter)
426  if (opt_display && opt_click_allowed)
427  {
428  tracker.initClick(I1, I2, initFile, initFile, true);
429  tracker.getPose(c1Mo, c2Mo);
430  // display the 3D model at the given pose
431  tracker.display(I1, I2, c1Mo, c2Mo, cam1, cam2, vpColor::red);
432  }
433  else
434  {
435  vpHomogeneousMatrix c1Moi(0.02044769891, 0.1101505452, 0.5078963719, 2.063603907, 1.110231561, -0.4392789872);
436  vpHomogeneousMatrix c2Moi(0.02044769891, 0.1101505452, 0.5078963719, 2.063603907, 1.110231561, -0.4392789872);
437  tracker.initFromPose(I1, I2, c1Moi, c2Moi);
438  }
439 
440  //track the model
441  tracker.track(I1, I2);
442  tracker.getPose(c1Mo, c2Mo);
443 
444  if (opt_display) {
445  vpDisplay::flush(I1);
446  vpDisplay::flush(I2);
447  }
448 
449  while (!reader.end())
450  {
451  // acquire a new image
452  reader.acquire(I1);
453  I2 = I1;
454 
455  // display the image
456  if (opt_display) {
457  vpDisplay::display(I1);
458  vpDisplay::display(I2);
459  }
460 
461  // Test to reset the tracker
462  if (reader.getFrameIndex() == reader.getFirstFrameIndex() + 10) {
463  std::cout << "----------Test reset tracker----------" << std::endl;
464  if (opt_display) {
465  vpDisplay::display(I1);
466  vpDisplay::display(I2);
467  }
468  tracker.resetTracker();
469 #if defined (VISP_HAVE_XML2)
470  tracker.loadConfigFile(configFile, configFile);
471 #else
472  // By setting the parameters:
473  cam1.initPersProjWithoutDistortion(547, 542, 338, 234);
474  cam2.initPersProjWithoutDistortion(547, 542, 338, 234);
475 
476  vpMe me;
477  me.setMaskSize(5);
478  me.setMaskNumber(180);
479  me.setRange(7);
480  me.setThreshold(5000);
481  me.setMu1(0.5);
482  me.setMu2(0.5);
483  me.setSampleStep(4);
484 
485  tracker.setCameraParameters(cam1, cam2);
486  tracker.setMovingEdge(me);
487 
488  // Specify the clipping to use
489  tracker.setNearClippingDistance(0.01);
490  tracker.setFarClippingDistance(0.90);
491  tracker.setClipping(tracker.getClipping() | vpMbtPolygon::FOV_CLIPPING);
492  // tracker.setClipping(tracker.getClipping() | vpMbtPolygon::LEFT_CLIPPING | vpMbtPolygon::RIGHT_CLIPPING | vpMbtPolygon::UP_CLIPPING | vpMbtPolygon::DOWN_CLIPPING); // Equivalent to FOV_CLIPPING
493 #endif
494  tracker.loadModel(modelFile);
495  tracker.setCameraParameters(cam1, cam2);
496  tracker.setOgreVisibilityTest(useOgre);
497  tracker.setScanLineVisibilityTest(useScanline);
498  tracker.setCovarianceComputation(computeCovariance);
499  tracker.setProjectionErrorComputation(projectionError);
500  tracker.initFromPose(I1, I2, c1Mo, c2Mo);
501  }
502 
503  // Test to set an initial pose
504  if (reader.getFrameIndex() == reader.getFirstFrameIndex() + 50) {
505  c1Mo.buildFrom(0.0439540832, 0.0845870108, 0.5477322481, 2.179498458, 0.8611798108, -0.3491961946);
506  c2Mo.buildFrom(0.0439540832, 0.0845870108, 0.5477322481, 2.179498458, 0.8611798108, -0.3491961946);
507  std::cout << "Test set pose" << std::endl;
508  tracker.setPose(I1, I2, c1Mo, c2Mo);
509  }
510 
511  // track the object: stop tracking from frame 40 to 50
512  if (reader.getFrameIndex() - reader.getFirstFrameIndex() < 40 || reader.getFrameIndex() - reader.getFirstFrameIndex() >= 50) {
513  tracker.track(I1, I2);
514  tracker.getPose(c1Mo, c2Mo);
515  if (opt_display) {
516  // display the 3D model
517  tracker.display(I1, I2, c1Mo, c2Mo, cam1, cam2, vpColor::darkRed);
518  // display the frame
519  vpDisplay::displayFrame(I1, c1Mo, cam1, 0.05);
520  vpDisplay::displayFrame(I2, c2Mo, cam2, 0.05);
521  }
522  }
523 
524  if (opt_click_allowed) {
525  vpDisplay::displayText(I1, 10, 10, "Click to quit", vpColor::red);
526  if (vpDisplay::getClick(I1, false)) {
527  quit = true;
528  break;
529  }
530  }
531 
532  if(computeCovariance) {
533  std::cout << "Covariance matrix: \n" << tracker.getCovarianceMatrix() << std::endl << std::endl;
534  }
535 
536  if(projectionError) {
537  std::cout << "Projection error: " << tracker.getProjectionError() << std::endl << std::endl;
538  }
539 
540  vpDisplay::flush(I1);
541  vpDisplay::flush(I2);
542  }
543 
544  if (opt_click_allowed && !quit) {
546  }
547  reader.close();
548 
549 #if defined (VISP_HAVE_XML2)
550  // Cleanup memory allocated by xml library used to parse the xml config file in vpMbEdgeTracker::loadConfigFile()
552 #endif
553 
554 #if defined(VISP_HAVE_COIN3D) && (COIN_MAJOR_VERSION == 2 || COIN_MAJOR_VERSION == 3)
555  // Cleanup memory allocated by Coin library used to load a vrml model in vpMbEdgeTracker::loadModel()
556  // We clean only if Coin was used.
557  if(! cao3DModel)
558  SoDB::finish();
559 #endif
560 
561  return 0;
562  }
563  catch(vpException &e) {
564  std::cout << "Catch an exception: " << e << std::endl;
565  return 1;
566  }
567 }
568 
569 #else
570 
571 int main()
572 {
573  std::cout << "visp_mbt module is required to run this example." << std::endl;
574  return 0;
575 }
576 
577 #endif
578 
VISP_EXPORT int wait(double t0, double t)
Definition: vpTime.cpp:157
long getFrameIndex() const
long getFirstFrameIndex() const
static bool getClick(const vpImage< unsigned char > &I, bool blocking=true)
static std::string getViSPImagesDataPath()
Definition: vpIoTools.cpp:1157
unsigned int getWidth() const
Definition: vpImage.h:226
Implementation of an homogeneous matrix and operations on such kind of matrices.
void setMaskNumber(const unsigned int &a)
Definition: vpMe.cpp:488
virtual void setDownScalingFactor(unsigned int scale)
Definition: vpDisplay.cpp:248
static const vpColor darkRed
Definition: vpColor.h:164
Display for windows using GDI (available on any windows 32 platform).
Definition: vpDisplayGDI.h:128
void setSampleStep(const double &s)
Definition: vpMe.h:263
static void displayText(const vpImage< unsigned char > &I, const vpImagePoint &ip, const std::string &s, const vpColor &color)
Use the X11 console to display images on unix-like OS. Thus to enable this class X11 should be instal...
Definition: vpDisplayX.h:153
Class that enables to manipulate easily a video file or a sequence of images. As it inherits from the...
error that can be emited by ViSP classes.
Definition: vpException.h:73
Definition: vpMe.h:59
static void flush(const vpImage< unsigned char > &I)
void setMu1(const double &mu_1)
Definition: vpMe.h:226
static bool parse(int *argcPtr, const char **argv, vpArgvInfo *argTable, int flags)
Definition: vpParseArgv.cpp:76
static const vpColor red
Definition: vpColor.h:163
void initPersProjWithoutDistortion(const double px, const double py, const double u0, const double v0)
void open(vpImage< vpRGBa > &I)
Display for windows using Direct3D 3rd party. Thus to enable this class Direct3D should be installed...
Definition: vpDisplayD3D.h:107
void setMaskSize(const unsigned int &a)
Definition: vpMe.cpp:496
static std::string createFilePath(const std::string &parent, const std::string child)
Definition: vpIoTools.cpp:1366
static void display(const vpImage< unsigned char > &I)
The vpDisplayOpenCV allows to display image using the OpenCV library. Thus to enable this class OpenC...
Generic class defining intrinsic camera parameters.
The vpDisplayGTK allows to display image using the GTK 3rd party library. Thus to enable this class G...
Definition: vpDisplayGTK.h:138
void acquire(vpImage< vpRGBa > &I)
void setFileName(const char *filename)
void buildFrom(const vpTranslationVector &t, const vpRotationMatrix &R)
void init(vpImage< unsigned char > &I, int winx=-1, int winy=-1, const std::string &title="")
static void displayFrame(const vpImage< unsigned char > &I, const vpHomogeneousMatrix &cMo, const vpCameraParameters &cam, double size, const vpColor &color=vpColor::none, unsigned int thickness=1, vpImagePoint offset=vpImagePoint(0, 0))
static void cleanup()
Definition: vpXmlParser.h:308
void setMu2(const double &mu_2)
Definition: vpMe.h:233
unsigned int getDownScalingFactor()
Definition: vpDisplay.h:214
void setThreshold(const double &t)
Definition: vpMe.h:284
void setRange(const unsigned int &r)
Definition: vpMe.h:256
Make the complete stereo (or more) tracking of an object by using its CAD model.