Visual Servoing Platform  version 3.1.0
tutorial-mb-tracker-stereo.cpp
1 #include <visp3/core/vpIoTools.h>
3 #include <visp3/gui/vpDisplayGDI.h>
4 #include <visp3/gui/vpDisplayOpenCV.h>
5 #include <visp3/gui/vpDisplayX.h>
6 #include <visp3/io/vpImageIo.h>
8 #include <visp3/mbt/vpMbEdgeKltMultiTracker.h>
9 #include <visp3/mbt/vpMbEdgeMultiTracker.h>
11 #include <visp3/io/vpVideoReader.h>
12 
13 int main(int argc, char **argv)
14 {
15 #if defined(VISP_HAVE_OPENCV) && (VISP_HAVE_OPENCV_VERSION >= 0x020100)
16  try {
17  std::string opt_videoname_left = "teabox_left.mpg";
18  std::string opt_videoname_right = "teabox_right.mpg";
19  int opt_tracker = 0;
20 
21  for (int i = 0; i < argc; i++) {
22  if (std::string(argv[i]) == "--name" && i + 2 < argc) {
23  opt_videoname_left = std::string(argv[i + 1]);
24  opt_videoname_right = std::string(argv[i + 2]);
25  } else if (std::string(argv[i]) == "--tracker" && i + 1 < argc) {
26  opt_tracker = atoi(argv[i + 1]);
27  } else if (std::string(argv[i]) == "--help") {
28  std::cout << "\nUsage: " << argv[0]
29  << " [--name <video name left> <video name right>] "
30  "[--tracker <0=egde|1=klt|2=hybrid>] [--help]\n"
31  << std::endl;
32  return 0;
33  }
34  }
35  std::string parentname = vpIoTools::getParent(opt_videoname_left);
36  std::string objectname_left = vpIoTools::getNameWE(opt_videoname_left);
37  std::string objectname_right = vpIoTools::getNameWE(opt_videoname_right);
38 
39  if (!parentname.empty()) {
40  objectname_left = parentname + "/" + objectname_left;
41  }
42 
43  std::cout << "Video name: " << opt_videoname_left << " ; " << opt_videoname_right << std::endl;
44  std::cout << "Tracker requested config files: " << objectname_left << ".[init, cao]"
45  << " and " << objectname_right << ".[init, cao]" << std::endl;
46  std::cout << "Tracker optional config files: " << opt_videoname_left << ".ppm"
47  << " and " << opt_videoname_right << ".ppm" << std::endl;
48 
50  vpImage<unsigned char> I_left, I_right;
52 
53  vpVideoReader g_left, g_right;
54  g_left.setFileName(opt_videoname_left);
55  g_left.open(I_left);
56  g_right.setFileName(opt_videoname_right);
57  g_right.open(I_right);
58 
59  vpDisplay *display_left = NULL, *display_right = NULL;
60 #if defined(VISP_HAVE_X11)
61  display_left = new vpDisplayX;
62  display_right = new vpDisplayX;
63 #elif defined(VISP_HAVE_GDI)
64  display_left = new vpDisplayGDI;
65  display_right = new vpDisplayGDI;
66 #else
67  display_left = new vpDisplayOpenCV;
68  display_right = new vpDisplayOpenCV;
69 #endif
71  display_right->setDownScalingFactor(vpDisplay::SCALE_AUTO);
72  display_left->init(I_left, 100, 100, "Model-based tracker (Left)");
73  display_right->init(I_right, 110 + (int)I_left.getWidth(), 100, "Model-based tracker (Right)");
74 
76  vpMbTracker *tracker;
77  if (opt_tracker == 0)
78  tracker = new vpMbEdgeMultiTracker(2);
79 #ifdef VISP_HAVE_MODULE_KLT
80  else if (opt_tracker == 1)
81  tracker = new vpMbKltMultiTracker(2);
82  else
83  tracker = new vpMbEdgeKltMultiTracker(2);
84 #else
85  else {
86  std::cout << "klt and hybrid model-based tracker are not available "
87  "since visp_klt module is missing"
88  << std::endl;
89  return 0;
90  }
91 #endif
92 
95  if (opt_tracker == 0)
96  dynamic_cast<vpMbEdgeMultiTracker *>(tracker)->loadConfigFile(objectname_left + ".xml",
97  objectname_right + ".xml");
98 #if defined(VISP_HAVE_MODULE_KLT)
99  else if (opt_tracker == 1)
100  dynamic_cast<vpMbKltMultiTracker *>(tracker)->loadConfigFile(objectname_left + ".xml", objectname_right + ".xml");
101  else
102  dynamic_cast<vpMbEdgeKltMultiTracker *>(tracker)->loadConfigFile(objectname_left + ".xml",
103  objectname_right + ".xml");
104 #endif
105 
108  vpCameraParameters cam_left, cam_right;
109  if (opt_tracker == 0)
110  dynamic_cast<vpMbEdgeMultiTracker *>(tracker)->getCameraParameters(cam_left, cam_right);
111 #if defined(VISP_HAVE_MODULE_KLT)
112  else if (opt_tracker == 1)
113  dynamic_cast<vpMbKltMultiTracker *>(tracker)->getCameraParameters(cam_left, cam_right);
114  else
115  dynamic_cast<vpMbEdgeKltMultiTracker *>(tracker)->getCameraParameters(cam_left, cam_right);
116 #endif
117 
120  tracker->loadModel("teabox.cao");
123  tracker->setDisplayFeatures(true);
125 
126  vpHomogeneousMatrix cRightMcLeft;
127  std::ifstream file_cRightMcLeft("cRightMcLeft.txt");
128  cRightMcLeft.load(file_cRightMcLeft);
129 
131  std::map<std::string, vpHomogeneousMatrix> mapOfCameraTransformationMatrix;
132  mapOfCameraTransformationMatrix["Camera1"] = vpHomogeneousMatrix();
133  mapOfCameraTransformationMatrix["Camera2"] = cRightMcLeft;
134 
135  if (opt_tracker == 0)
136  dynamic_cast<vpMbEdgeMultiTracker *>(tracker)->setCameraTransformationMatrix(mapOfCameraTransformationMatrix);
137 #if defined(VISP_HAVE_MODULE_KLT)
138  else if (opt_tracker == 1)
139  dynamic_cast<vpMbKltMultiTracker *>(tracker)->setCameraTransformationMatrix(mapOfCameraTransformationMatrix);
140  else
141  dynamic_cast<vpMbEdgeKltMultiTracker *>(tracker)->setCameraTransformationMatrix(mapOfCameraTransformationMatrix);
142 #endif
143 
145 #ifndef VISP_HAVE_XML2
146  std::cout << "\n**********************************************************\n"
147  << "Warning: we are not able to load the tracker settings from\n"
148  << "the xml config files since ViSP is not build with libxml2\n"
149  << "3rd party. As a consequence, the tracking may fail !"
150  << "\n**********************************************************\n"
151  << std::endl;
152 #endif
153 
155  if (opt_tracker == 0)
156  dynamic_cast<vpMbEdgeMultiTracker *>(tracker)->initClick(I_left, I_right, objectname_left + ".init",
157  objectname_right + ".init", true);
158 #if defined(VISP_HAVE_MODULE_KLT)
159  else if (opt_tracker == 1)
160  dynamic_cast<vpMbKltMultiTracker *>(tracker)->initClick(I_left, I_right, objectname_left + ".init",
161  objectname_right + ".init", true);
162  else
163  dynamic_cast<vpMbEdgeKltMultiTracker *>(tracker)->initClick(I_left, I_right, objectname_left + ".init",
164  objectname_right + ".init", true);
165 #endif
166 
169  vpHomogeneousMatrix cLeftMo, cRightMo;
171  while (!g_left.end() && !g_right.end()) {
172  g_left.acquire(I_left);
173  g_right.acquire(I_right);
174 
175  vpDisplay::display(I_left);
176  vpDisplay::display(I_right);
177 
179  if (opt_tracker == 0)
180  dynamic_cast<vpMbEdgeMultiTracker *>(tracker)->track(I_left, I_right);
181 #if defined(VISP_HAVE_MODULE_KLT)
182  else if (opt_tracker == 1)
183  dynamic_cast<vpMbKltMultiTracker *>(tracker)->track(I_left, I_right);
184  else
185  dynamic_cast<vpMbEdgeKltMultiTracker *>(tracker)->track(I_left, I_right);
186 #endif
187 
190  if (opt_tracker == 0)
191  dynamic_cast<vpMbEdgeMultiTracker *>(tracker)->getPose(cLeftMo, cRightMo);
192 #if defined(VISP_HAVE_MODULE_KLT)
193  else if (opt_tracker == 1)
194  dynamic_cast<vpMbKltMultiTracker *>(tracker)->getPose(cLeftMo, cRightMo);
195  else
196  dynamic_cast<vpMbEdgeKltMultiTracker *>(tracker)->getPose(cLeftMo, cRightMo);
197 #endif
198 
201  if (opt_tracker == 0)
202  dynamic_cast<vpMbEdgeMultiTracker *>(tracker)->display(I_left, I_right, cLeftMo, cRightMo, cam_left, cam_right,
203  vpColor::red, 2);
204 #if defined(VISP_HAVE_MODULE_KLT)
205  else if (opt_tracker == 1)
206  dynamic_cast<vpMbKltMultiTracker *>(tracker)->display(I_left, I_right, cLeftMo, cRightMo, cam_left, cam_right,
207  vpColor::red, 2);
208  else
209  dynamic_cast<vpMbEdgeKltMultiTracker *>(tracker)->display(I_left, I_right, cLeftMo, cRightMo, cam_left,
210  cam_right, vpColor::red, 2);
211 #endif
212 
214  vpDisplay::displayFrame(I_left, cLeftMo, cam_left, 0.025, vpColor::none, 3);
215  vpDisplay::displayFrame(I_right, cRightMo, cam_right, 0.025, vpColor::none, 3);
216  vpDisplay::displayText(I_left, 10, 10, "A click to exit...", vpColor::red);
217 
218  vpDisplay::flush(I_left);
219  vpDisplay::flush(I_right);
220 
221  if (vpDisplay::getClick(I_left, false)) {
222  break;
223  }
224  }
225  vpDisplay::getClick(I_left);
226 
228  delete display_left;
229  delete display_right;
230  delete tracker;
232  } catch (vpException &e) {
233  std::cerr << "Catch a ViSP exception: " << e.getMessage() << std::endl;
234  }
235 #else
236  (void)argc;
237  (void)argv;
238  std::cout << "Install OpenCV and rebuild ViSP to use this example." << std::endl;
239 #endif
240 }
virtual void setDisplayFeatures(const bool displayF)
Definition: vpMbTracker.h:470
Class that defines generic functionnalities for display.
Definition: vpDisplay.h:171
static bool getClick(const vpImage< unsigned char > &I, bool blocking=true)
Implementation of an homogeneous matrix and operations on such kind of matrices.
virtual void setDownScalingFactor(unsigned int scale)
Definition: vpDisplay.cpp:232
Display for windows using GDI (available on any windows 32 platform).
Definition: vpDisplayGDI.h:129
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:151
Class that enables to manipulate easily a video file or a sequence of images. As it inherits from the...
static const vpColor none
Definition: vpColor.h:192
error that can be emited by ViSP classes.
Definition: vpException.h:71
Hybrid stereo (or more) tracker based on moving-edges and keypoints tracked using KLT tracker...
static std::string getParent(const std::string &pathname)
Definition: vpIoTools.cpp:1371
static void flush(const vpImage< unsigned char > &I)
void load(std::ifstream &f)
static const vpColor red
Definition: vpColor.h:180
void open(vpImage< vpRGBa > &I)
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.
Main methods for a model-based tracker.
Definition: vpMbTracker.h:106
void acquire(vpImage< vpRGBa > &I)
void setFileName(const char *filename)
const char * getMessage(void) const
Definition: vpException.cpp:90
virtual void loadModel(const char *modelFile, const bool verbose=false)
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, const vpImagePoint &offset=vpImagePoint(0, 0))
static std::string getNameWE(const std::string &pathname)
Definition: vpIoTools.cpp:1358
unsigned int getWidth() const
Definition: vpImage.h:229
Make the complete stereo (or more) tracking of an object by using its CAD model.
Model based stereo (or more) tracker using only KLT.