ViSP  2.8.0
AROgreBasic.cpp
1 /****************************************************************************
2  *
3  * $Id: AROgreBasic.cpp 4305 2013-07-05 13:23:47Z 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  * Implementation of a simple augmented reality application using the vpAROgre
36  * class.
37  *
38  * Authors:
39  * Bertrand Delabarre
40  *
41  *****************************************************************************/
42 
50 #include <visp/vpConfig.h>
51 #include <iostream>
52 //#if defined(VISP_HAVE_OGRE) && defined(VISP_HAVE_DISPLAY)
53 #if defined(VISP_HAVE_OGRE) && (defined(VISP_HAVE_OPENCV) || defined(VISP_HAVE_GDI) || defined(VISP_HAVE_D3D9) || defined(VISP_HAVE_GTK))
54 
55 #if defined(VISP_HAVE_X11) && ! defined(APPLE)
56 // produce an error on OSX: ‘typedef int Cursor’
57 // /usr/X11R6/include/X11/X.h:108: error: ‘Cursor’ has a previous
58 // declaration as ‘typedef XID Cursor’. That's why it should not be
59 // used on APPLE platforms
60 # include <visp/vpDisplayX.h>
61 #endif
62 #include <visp/vpDisplayGTK.h>
63 #include <visp/vpDisplayGDI.h>
64 #include <visp/vpDisplayOpenCV.h>
65 #include <visp/vpDisplayD3D.h>
66 #include <visp/vpPose.h>
67 #include <visp/vpPoint.h>
68 #include <visp/vpImagePoint.h>
69 #include <visp/vpDot2.h>
70 #include <visp/vpPixelMeterConversion.h>
71 #include <visp/vpVideoReader.h>
72 #include <visp/vpParseArgv.h>
73 #include <visp/vpIoTools.h>
74 #include <visp/vpDebug.h>
75 #include <visp/vpAROgre.h>
76 
77 // List of allowed command line options
78 #define GETOPTARGS "ci:p:h"
79 
90 void usage(const char *name, const char *badparam, std::string ipath, std::string ppath)
91 {
92  fprintf(stdout, "\n\
93 Test augmented reality using the vpAROgre class.\n\
94 \n\
95 SYNOPSIS\n\
96  %s [-i <test image path>] [-p <personal image path>]\n\
97  [-c] [-h]\n", name);
98 
99  fprintf(stdout, "\n\
100 OPTIONS: Default\n\
101  -i <input image path> %s\n\
102  Set image input path.\n\
103  From this path read images \n\
104  \"ViSP-images/mire-2/image.%%04d.pgm\". These \n\
105  images come from ViSP-images-x.y.z.tar.gz available \n\
106  on the ViSP website.\n\
107  Setting the VISP_INPUT_IMAGE_PATH environment\n\
108  variable produces the same behaviour than using\n\
109  this option.\n\
110  \n\
111  -p <personal image path> %s\n\
112  Specify a personal sequence containing images \n\
113  to process.\n\
114  By image sequence, we mean one file per image.\n\
115  The following image file formats PNM (PGM P5, PPM P6)\n\
116  are supported. The format is selected by analysing \n\
117  the filename extension.\n\
118  Example : \"/Temp/ViSP-images/cube/image.%%04d.pgm\"\n\
119  %%04d is for the image numbering.\n\
120 \n\
121  -c\n\
122  Disable the mouse click. Useful to automaze the \n\
123  execution of this program without humain intervention.\n\
124 \n\
125  -h\n\
126  Print the help.\n",
127  ipath.c_str(), ppath.c_str());
128 
129  if (badparam)
130  fprintf(stdout, "\nERROR: Bad parameter [%s]\n", badparam);
131 }
145 bool getOptions(int argc, const char **argv, std::string &ipath,
146  std::string &ppath, bool &click_allowed)
147 {
148  const char *optarg;
149  int c;
150  while ((c = vpParseArgv::parse(argc, argv, GETOPTARGS, &optarg)) > 1) {
151 
152  switch (c) {
153  case 'c': click_allowed = false; break;
154  case 'i': ipath = optarg; break;
155  case 'p': ppath = optarg; break;
156  case 'h': usage(argv[0], NULL, ipath, ppath);
157  return false; break;
158 
159  default:
160  usage(argv[0], optarg, ipath, ppath);
161  return false; break;
162  }
163  }
164 
165  if ((c == 1) || (c == -1)) {
166  // standalone param or error
167  usage(argv[0], NULL, ipath, ppath);
168  std::cerr << "ERROR: " << std::endl;
169  std::cerr << " Bad argument " << optarg << std::endl << std::endl;
170  return false;
171  }
172 
173  return true;
174 }
175 
180 void computeInitialPose(vpCameraParameters *mcam, vpImage<unsigned char> &I,
181  vpPose * mPose, vpDot2 *md, vpImagePoint *mcog,
182  vpHomogeneousMatrix *cmo, vpPoint *mP,
183  const bool &opt_click_allowed)
184 {
185  // ---------------------------------------------------
186  // Code inspired from ViSP example of camera pose
187  // ----------------------------------------------------
188  bool opt_display = true;
189 
190 #if defined(VISP_HAVE_X11) && ! defined(APPLE)
191  // produce an error on OSX: ‘typedef int Cursor’
192  // /usr/X11R6/include/X11/X.h:108: error: ‘Cursor’ has a previous
193  // declaration as ‘typedef XID Cursor’. That's why it should not be
194  // used on APPLE platforms
195  vpDisplayX display;
196 #elif defined VISP_HAVE_GTK
197  vpDisplayGTK display;
198 #elif defined VISP_HAVE_GDI
199  vpDisplayGDI display;
200 #elif defined VISP_HAVE_OPENCV
201  vpDisplayOpenCV display;
202 #elif defined VISP_HAVE_D3D9
203  vpDisplayD3D display;
204 #endif
205 
206  for (unsigned int i=0 ; i < 4 ; i++)
207  {
208  if (opt_display) {
209  md[i].setGraphics(true) ;
210  }
211  else {
212  md[i].setGraphics(false) ;
213  }
214  }
215 
216  if (opt_display) {
217  try{
218  // Display size is automatically defined by the image (I) size
219  display.init(I,100,100,"Preliminary Pose Calculation");
220  // display the image
221  // The image class has a member that specify a pointer toward
222  // the display that has been initialized in the display declaration
223  // therefore is is no longuer necessary to make a reference to the
224  // display variable.
225  vpDisplay::display(I) ;
226  //Flush the display
227  vpDisplay::flush(I) ;
228 
229  }
230  catch(...)
231  {
232  vpERROR_TRACE("Error while displaying the image") ;
233  return ;
234  }
235  }
236 
237  std::cout<<"************************************************************************************"<<std::endl;
238  std::cout<<"*************************** Preliminary Pose Calculation ***************************"<<std::endl;
239  std::cout<<"****************************** Click on the 4 dots *******************************"<<std::endl;
240  std::cout<<"********Dot1 : (-x,-y,0), Dot2 : (x,-y,0), Dot3 : (x,y,0), Dot4 : (-x,y,0)**********"<<std::endl;
241  std::cout<<"************************************************************************************"<<std::endl;
242 
243  try{
244  vpImagePoint ip[4];
245  if (! opt_click_allowed) {
246  ip[0].set_i( 265 );
247  ip[0].set_j( 93 );
248  ip[1].set_i( 248 );
249  ip[1].set_j( 242 );
250  ip[2].set_i( 166 );
251  ip[2].set_j( 215 );
252  ip[3].set_i( 178 );
253  ip[3].set_j( 85 );
254  }
255 
256  for(unsigned int i=0;i<4;i++) {
257  // by using setGraphics, we request to see the edges of the dot
258  // in red on the screen.
259  // It uses the overlay image plane.
260  // The default of this setting is that it is time consumming
261 
262  md[i].setGraphics(true) ;
263  md[i].setGrayLevelPrecision(0.7);
264  md[i].setSizePrecision(0.5);
265 
266  for(unsigned int j = 0;j<i;j++)
267  md[j].display(I) ;
268 
269  // flush the display buffer
270  vpDisplay::flush(I);
271  try{
272  if (opt_click_allowed) {
273  md[i].initTracking(I);
274  //std::cout << "click " << i << " " << md[i] << std::endl;
275  }
276  else {
277  md[i].initTracking(I, ip[i]);
278  }
279  }
280  catch(...){
281  }
282 
283  mcog[i] = md[i].getCog();
284  // an expcetion is thrown by the track method if
285  // - dot is lost
286  // - the number of pixel is too small
287  // - too many pixels are detected (this is usual when a "big" specularity
288  // occurs. The threshold can be modified using the
289  // setNbMaxPoint(int) method
290  if (opt_display) {
291  md[i].display(I) ;
292  // flush the display buffer
293  vpDisplay::flush(I) ;
294  }
295  }
296  }
297  catch(vpException e){
298  vpERROR_TRACE("Error while tracking dots") ;
299  vpCTRACE << e;
300  return;
301  }
302 
303  if (opt_display)
304  {
305  // display a red cross (size 10) in the image at the dot center
306  // of gravity location
307  //
308  // WARNING
309  // in the vpDisplay class member's when pixel coordinates
310  // are considered the first element is the row index and the second
311  // is the column index:
312  // vpDisplay::displayCross(Image, row index, column index, size, color)
313  // therefore u and v are inverted wrt to the vpDot specification
314  // Alternatively, to avoid this problem another set of member have
315  // been defined in the vpDisplay class.
316  // If the method name is postfixe with _uv the specification is :
317  // vpDisplay::displayCross_uv(Image, column index, row index, size, color)
318 
319  for (unsigned int i=0 ; i < 4 ; i++)
320  vpDisplay::displayCross(I, mcog[i], 10, vpColor::red) ;
321 
322  // flush the X11 buffer
323  vpDisplay::flush(I) ;
324  }
325 
326  // --------------------------------------------------------
327  // Now we will compute the pose
328  // --------------------------------------------------------
329 
330  // the list of point is cleared (if that's not done before)
331  mPose->clearPoint() ;
332 
333  // we set the 3D points coordinates (in meter !) in the object/world frame
334  double l=0.06 ;
335  double L=0.07 ;
336  mP[0].setWorldCoordinates(-L,-l, 0 ) ; // (X,Y,Z)
337  mP[1].setWorldCoordinates(L,-l, 0 ) ;
338  mP[2].setWorldCoordinates(L,l, 0 ) ;
339  mP[3].setWorldCoordinates(-L,l, 0 ) ;
340 
341  // pixel-> meter conversion
342  for (unsigned int i=0 ; i < 4 ; i++)
343  {
344  // u[i]. v[i] are expressed in pixel
345  // conversion in meter is achieved using
346  // x = (u-u0)/px
347  // y = (v-v0)/py
348  // where px, py, u0, v0 are the intrinsic camera parameters
349  double x=0, y=0;
350  vpPixelMeterConversion::convertPoint(*mcam, mcog[i], x,y) ;
351  mP[i].set_x(x) ;
352  mP[i].set_y(y) ;
353  }
354 
355 
356  // The pose structure is build, we put in the point list the set of point
357  // here both 2D and 3D world coordinates are known
358  for (unsigned int i=0 ; i < 4 ; i++)
359  {
360  mPose->addPoint(mP[i]) ; // and added to the pose computation point list
361  }
362 
363  // compute the initial pose using Dementhon method followed by a non linear
364  // minimisation method
365 
366  // Pose by Lagrange it provides an initialization of the pose
367  mPose->computePose(vpPose::LAGRANGE, *cmo) ;
368  // the pose is now refined using the virtual visual servoing approach
369  // Warning: cMo needs to be initialized otherwise it may diverge
370  mPose->computePose(vpPose::VIRTUAL_VS, *cmo) ;
371 
372  // Display breifly just to have a glimpse a the ViSP pose
373  // while(cpt<500){
374  if( opt_display ){
375  // Display the computed pose
376  mPose->display(I,*cmo,*mcam, 0.05, vpColor::red) ;
377  vpDisplay::flush(I) ;
378  vpTime::wait(1000);
379  }
380 }
381 
382 
383 int main(int argc, const char **argv)
384 {
385  std::string env_ipath;
386  std::string opt_ipath;
387  std::string ipath;
388  std::string opt_ppath;
389  std::string dirname;
390  std::string filename;
391  bool opt_click_allowed = true;
392 
393  // Get the VISP_IMAGE_PATH environment variable value
394  char *ptenv = getenv("VISP_INPUT_IMAGE_PATH");
395  if (ptenv != NULL)
396  env_ipath = ptenv;
397 
398  // Set the default input path
399  if (! env_ipath.empty())
400  ipath = env_ipath;
401 
402 
403  // Read the command line options
404  if (getOptions(argc, argv, opt_ipath, opt_ppath, opt_click_allowed) == false) {
405  exit (-1);
406  }
407 
408  // Get the option values
409  if (!opt_ipath.empty())
410  ipath = opt_ipath;
411 
412  // Compare ipath and env_ipath. If they differ, we take into account
413  // the input path comming from the command line option
414  if (!opt_ipath.empty() && !env_ipath.empty() && opt_ppath.empty()) {
415  if (ipath != env_ipath) {
416  std::cout << std::endl
417  << "WARNING: " << std::endl;
418  std::cout << " Since -i <visp image path=" << ipath << "> "
419  << " is different from VISP_IMAGE_PATH=" << env_ipath << std::endl
420  << " we skip the environment variable." << std::endl;
421  }
422  }
423 
424  // Test if an input path is set
425  if (opt_ipath.empty() && env_ipath.empty() && opt_ppath.empty() ){
426  usage(argv[0], NULL, ipath, opt_ppath);
427  std::cerr << std::endl
428  << "ERROR:" << std::endl;
429  std::cerr << " Use -i <visp image path> option or set VISP_INPUT_IMAGE_PATH "
430  << std::endl
431  << " environment variable to specify the location of the " << std::endl
432  << " image path where test images are located." << std::endl
433  << " Use -p <personal image path> option if you want to "<<std::endl
434  << " use personal images." << std::endl
435  << std::endl;
436 
437  exit(-1);
438  }
439 
440  // Declare an image, this is a gray level image (unsigned char)
441  // it size is not defined yet, it will be defined when the image will
442  // read on the disk
443  // vpImage<unsigned char> I ;
444 
445  // unsigned iter = 0;
446  std::ostringstream s;
447  // char cfilename[FILENAME_MAX];
448 
449  if (opt_ppath.empty()){
450  // Set the path location of the image sequence
451  dirname = ipath + vpIoTools::path("/ViSP-images/mire-2/");
452 
453  // Build the name of the image file
454 
455  s.setf(std::ios::right, std::ios::adjustfield);
456  s << "image.%04d.pgm";
457  filename = dirname + s.str();
458  }
459  else {
460  filename = opt_ppath;
461  }
462 
463  //We will read a sequence of images
464  vpVideoReader grabber;
465  grabber.setFirstFrameIndex(1);
466  grabber.setFileName(filename.c_str());
467  // Grey level image associated to a display in the initial pose computation
468  vpImage<unsigned char> Idisplay;
469  // Grey level image to track points
471  // RGBa image to get background
472  vpImage<vpRGBa> IC;
473  // Matrix representing camera parameters
475 
476  // Variables used for pose computation purposes
477  vpPose mPose;
478  vpDot2 md[4];
479  vpImagePoint mcog[4];
480  vpPoint mP[4];
481 
482  // CameraParameters we got from calibration
483  // Keep u0 and v0 as center of the screen
484  vpCameraParameters mcam;
485 
486  // Read the PGM image named "filename" on the disk, and put the
487  // bitmap into the image structure I. I is initialized to the
488  // correct size
489  //
490  // exception readPGM may throw various exception if, for example,
491  // the file does not exist, or if the memory cannot be allocated
492  try{
493  vpCTRACE << "Load: " << filename << std::endl;
494  grabber.open(Idisplay);
495  grabber.acquire(Idisplay);
496  vpCameraParameters mcamTmp(592,570,grabber.getWidth()/2,grabber.getHeight()/2);
497  // Compute the initial pose of the camera
498  computeInitialPose(&mcamTmp, Idisplay, &mPose, md, mcog, &cmo, mP,
499  opt_click_allowed);
500  // Close the framegrabber
501  grabber.close();
502 
503  // Associate the grabber to the RGBa image
504  grabber.open(IC);
505  mcam.init(mcamTmp);
506  }
507  catch(...)
508  {
509  // an exception is thrown if an exception from readPGM has been caught
510  // here this will result in the end of the program
511  // Note that another error message has been printed from readPGM
512  // to give more information about the error
513  std::cerr << std::endl
514  << "ERROR:" << std::endl;
515  std::cerr << " Cannot read " << filename << std::endl;
516  std::cerr << " Check your -i " << ipath << " option " << std::endl
517  << " or VISP_INPUT_IMAGE_PATH environment variable."
518  << std::endl;
519  exit(-1);
520  }
521 
522  // Create a vpRAOgre object with color background
523  vpAROgre ogre(mcam, (unsigned int)grabber.getWidth(), (unsigned int)grabber.getHeight());
524  // Initialize it
525  ogre.init(IC);
526  ogre.load("Robot", "robot.mesh");
527  ogre.setScale("Robot", 0.001f,0.001f,0.001f);
528  ogre.setRotation("Robot", vpRotationMatrix(vpRxyzVector(M_PI/2, -M_PI/2, 0)));
529 
530  try
531  {
532  // Rendering loop
533  while(ogre.continueRendering() && !grabber.end()){
534  // Acquire a frame
535  grabber.acquire(IC);
536 
537  // Convert it to a grey level image for tracking purpose
539 
540  // Update pose calculation
541  try{
542  // kill the point list
543  mPose.clearPoint() ;
544 
545  // track the dot
546  for (int i=0 ; i < 4 ; i++)
547  {
548  // track the point
549  md[i].track(I, mcog[i]) ;
550  md[i].setGrayLevelPrecision(0.90);
551  // pixel->meter conversion
552  {
553  double x=0, y=0;
554  vpPixelMeterConversion::convertPoint(mcam, mcog[i], x, y) ;
555  mP[i].set_x(x) ;
556  mP[i].set_y(y) ;
557  }
558 
559  // and added to the pose computation point list
560  mPose.addPoint(mP[i]) ;
561  }
562  // the pose structure has been updated
563 
564  // the pose is now updated using the virtual visual servoing approach
565  // Dementhon or lagrange is no longuer necessary, pose at the
566  // previous iteration is sufficient
567  mPose.computePose(vpPose::VIRTUAL_VS, cmo);
568  }
569  catch(...){
570  vpERROR_TRACE("Error in tracking loop") ;
571  return false;
572  }
573 
574  // Display with ogre
575  ogre.display(IC,cmo);
576 
577  // Wait so that the video does not go too fast
578  vpTime::wait(15);
579  }
580  // Close the grabber
581  grabber.close();
582  }
583  catch (Ogre::Exception& e)
584  {
585  std::cerr << "Exception:\n";
586  std::cerr << e.getFullDescription().c_str() << "\n";
587  return 1;
588  }
589  catch (...)
590  {
591  std::cerr << "Exception: " << "\n";
592  return 1;
593  }
594 
595  return EXIT_SUCCESS;
596 }
597 #else // VISP_HAVE_OGRE && VISP_HAVE_DISPLAY
598 int
599 main()
600 {
601  std::cout << "You should install Ogre3D to run this example..." << std::endl;
602 }
603 #endif
void setFirstFrameIndex(const long firstFrame)
void set_j(const double j)
Definition: vpImagePoint.h:156
void init()
basic initialization with the default parameters
static void convert(const vpImage< unsigned char > &src, vpImage< vpRGBa > &dest)
The class provides a data structure for the homogeneous matrices as well as a set of operations on th...
#define vpERROR_TRACE
Definition: vpDebug.h:379
Display for windows using GDI (available on any windows 32 platform).
Definition: vpDisplayGDI.h:133
Define the X11 console to display images.
Definition: vpDisplayX.h:152
void set_i(const double i)
Definition: vpImagePoint.h:145
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:75
static std::string path(const char *pathname)
Definition: vpIoTools.cpp:715
void set_x(const double x)
Set the point x coordinate in the image plane.
Definition: vpPoint.h:194
static void convertPoint(const vpCameraParameters &cam, const double &u, const double &v, double &x, double &y)
Point coordinates conversion from pixel coordinates to normalized coordinates in meter...
Implementation of an augmented reality viewer.
Definition: vpAROgre.h:90
static int wait(double t0, double t)
Definition: vpTime.cpp:149
This tracker is meant to track a blob (connex pixels with same gray level) on a vpImage.
Definition: vpDot2.h:131
void track(const vpImage< unsigned char > &I)
Definition: vpDot2.cpp:444
static void flush(const vpImage< unsigned char > &I)
Definition: vpDisplay.cpp:1991
static bool parse(int *argcPtr, const char **argv, vpArgvInfo *argTable, int flags)
Definition: vpParseArgv.cpp:79
static const vpColor red
Definition: vpColor.h:167
Class that defines what is a point.
Definition: vpPoint.h:65
The vpRotationMatrix considers the particular case of a rotation matrix.
#define vpCTRACE
Definition: vpDebug.h:327
vpImagePoint getCog() const
Definition: vpDot2.h:167
void open(vpImage< vpRGBa > &I)
Display for windows using Direct3D.
Definition: vpDisplayD3D.h:109
void setGrayLevelPrecision(const double &grayLevelPrecision)
Definition: vpDot2.cpp:796
static void display(vpImage< unsigned char > &I, vpHomogeneousMatrix &cMo, vpCameraParameters &cam, double size, vpColor col=vpColor::none)
Definition: vpPose.cpp:582
virtual void init(vpImage< unsigned char > &I, bool bufferedKeys=false, bool hidden=false)
Definition: vpAROgre.cpp:131
unsigned int getWidth() const
Return the number of columns in the image.
static void display(const vpImage< unsigned char > &I)
Definition: vpDisplay.cpp:203
The vpDisplayOpenCV allows to display image using the opencv library.
virtual void displayCross(const vpImagePoint &ip, unsigned int size, const vpColor &color, unsigned int thickness=1)=0
Class used for pose computation from N points (pose from point only).
Definition: vpPose.h:78
Generic class defining intrinsic camera parameters.
void set_y(const double y)
Set the point y coordinate in the image plane.
Definition: vpPoint.h:196
The vpDisplayGTK allows to display image using the GTK+ library version 1.2.
Definition: vpDisplayGTK.h:145
void acquire(vpImage< vpRGBa > &I)
void setFileName(const char *filename)
void init(vpImage< unsigned char > &I, int winx=-1, int winy=-1, const char *title=NULL)
void display(const vpImage< unsigned char > &I, vpColor color=vpColor::red, unsigned int thickness=1)
Definition: vpDot2.cpp:201
void setSizePrecision(const double &sizePrecision)
Definition: vpDot2.cpp:826
void initTracking(const vpImage< unsigned char > &I, unsigned int size=0)
Definition: vpDot2.cpp:245
Class that consider the case of the Euler angle using the x-y-z convention, where are respectively ...
Definition: vpRxyzVector.h:152
void computePose(vpPoseMethodType methode, vpHomogeneousMatrix &cMo)
compute the pose for a given method
Definition: vpPose.cpp:382
Class that defines a 2D point in an image. This class is useful for image processing and stores only ...
Definition: vpImagePoint.h:92
void addPoint(const vpPoint &P)
Add a new point in this array.
Definition: vpPose.cpp:150
unsigned int getHeight() const
Return the number of rows in the image.
void setGraphics(const bool activate)
Definition: vpDot2.h:312
void setWorldCoordinates(const double ox, const double oy, const double oz)
Set the point world coordinates. We mean here the coordinates of the point in the object frame...
Definition: vpPoint.cpp:74
void clearPoint()
suppress all the point in the array of point
Definition: vpPose.cpp:128