43 #include <visp3/core/vpConfig.h>
45 #if defined(VISP_HAVE_MODULE_MBT) && defined(VISP_HAVE_MODULE_KLT) && defined(VISP_HAVE_OPENCV) && \
46 defined(VISP_HAVE_DISPLAY) && defined(HAVE_OPENCV_IMGPROC) && defined(HAVE_OPENCV_VIDEO)
48 #include <visp3/core/vpDebug.h>
49 #include <visp3/core/vpHomogeneousMatrix.h>
50 #include <visp3/core/vpIoTools.h>
51 #include <visp3/core/vpMath.h>
52 #include <visp3/gui/vpDisplayD3D.h>
53 #include <visp3/gui/vpDisplayGDI.h>
54 #include <visp3/gui/vpDisplayGTK.h>
55 #include <visp3/gui/vpDisplayOpenCV.h>
56 #include <visp3/gui/vpDisplayX.h>
57 #include <visp3/io/vpImageIo.h>
58 #include <visp3/io/vpParseArgv.h>
59 #include <visp3/io/vpVideoReader.h>
60 #include <visp3/mbt/vpMbKltTracker.h>
62 #define GETOPTARGS "x:m:i:n:de:chtfolwv"
64 #ifdef ENABLE_VISP_NAMESPACE
68 void usage(
const char *name,
const char *badparam)
70 #if VISP_HAVE_DATASET_VERSION >= 0x030600
71 std::string ext(
"png");
73 std::string ext(
"pgm");
76 Example of tracking based on the 3D model.\n\
79 %s [-i <test image path>] [-x <config file>]\n\
80 [-m <model name>] [-n <initialisation file base name>] [-e <last frame index>]\n\
81 [-t] [-c] [-d] [-h] [-f] [-o] [-w] [-l] [-v]\n",
86 -i <input image path> \n\
87 Set image input path.\n\
88 From this path read images \n\
89 \"mbt/cube/image%%04d.%s\". These \n\
90 images come from visp-images-x.y.z.tar.gz available \n\
91 on the ViSP website.\n\
92 Setting the VISP_INPUT_IMAGE_PATH environment\n\
93 variable produces the same behaviour than using\n\
97 Set the config file (the xml file) to use.\n\
98 The config file is used to specify the parameters of the tracker.\n\
101 Specify the name of the file of the model\n\
102 The model can either be a vrml model (.wrl) or a .cao file.\n\
104 -e <last frame index> \n\
105 Specify the index of the last frame. Once reached, the tracking is stopped\n\
108 Do not use the vrml model, use the .cao one. These two models are \n\
109 equivalent and comes from ViSP-images-x.y.z.tar.gz available on the ViSP\n\
110 website. However, the .cao model allows to use the 3d model based tracker \n\
113 -n <initialisation file base name> \n\
114 Base name of the initialisation file. The file will be 'base_name'.init .\n\
115 This base name is also used for the Optional picture specifying where to \n\
116 click (a .ppm picture).\n\
119 Turn off the display of the the klt points. \n\
122 Turn off the display.\n\
125 Disable the mouse click. Useful to automate the \n\
126 execution of this program without human intervention.\n\
129 Use Ogre3D for visibility tests\n\
132 When Ogre3D is enable [-o] show Ogre3D configuration dialog thatallows to set the renderer.\n\
135 Use the scanline for visibility tests.\n\
138 Compute covariance matrix.\n\
141 Print the help.\n\n",
145 fprintf(stdout,
"\nERROR: Bad parameter [%s]\n", badparam);
148 bool getOptions(
int argc,
const char **argv, std::string &ipath, std::string &configFile, std::string &modelFile,
149 std::string &initFile,
long &lastFrame,
bool &displayKltPoints,
bool &click_allowed,
bool &display,
150 bool &cao3DModel,
bool &useOgre,
bool &showOgreConfigDialog,
bool &useScanline,
bool &computeCovariance)
158 lastFrame = atol(optarg_);
164 configFile = optarg_;
173 displayKltPoints =
false;
179 click_allowed =
false;
191 showOgreConfigDialog =
true;
194 computeCovariance =
true;
197 usage(argv[0],
nullptr);
202 usage(argv[0], optarg_);
208 if ((c == 1) || (c == -1)) {
210 usage(argv[0],
nullptr);
211 std::cerr <<
"ERROR: " << std::endl;
212 std::cerr <<
" Bad argument " << optarg_ << std::endl << std::endl;
219 int main(
int argc,
const char **argv)
222 std::string env_ipath;
223 std::string opt_ipath;
225 std::string opt_configFile;
226 std::string configFile;
227 std::string opt_modelFile;
228 std::string modelFile;
229 std::string opt_initFile;
230 std::string initFile;
231 long opt_lastFrame = -1;
232 bool displayKltPoints =
true;
233 bool opt_click_allowed =
true;
234 bool opt_display =
true;
235 bool cao3DModel =
false;
236 bool useOgre =
false;
237 bool showOgreConfigDialog =
false;
238 bool useScanline =
false;
239 bool computeCovariance =
false;
242 #if VISP_HAVE_DATASET_VERSION >= 0x030600
243 std::string ext(
"png");
245 std::string ext(
"pgm");
253 if (!env_ipath.empty())
257 if (!getOptions(argc, argv, opt_ipath, opt_configFile, opt_modelFile, opt_initFile, opt_lastFrame, displayKltPoints,
258 opt_click_allowed, opt_display, cao3DModel, useOgre, showOgreConfigDialog, useScanline,
259 computeCovariance)) {
264 if (opt_ipath.empty() && env_ipath.empty()) {
265 usage(argv[0],
nullptr);
266 std::cerr << std::endl <<
"ERROR:" << std::endl;
267 std::cerr <<
" Use -i <visp image path> option or set VISP_INPUT_IMAGE_PATH " << std::endl
268 <<
" environment variable to specify the location of the " << std::endl
269 <<
" image path where test images are located." << std::endl
276 if (!opt_ipath.empty())
281 if (!opt_configFile.empty())
282 configFile = opt_configFile;
283 else if (!opt_ipath.empty())
288 if (!opt_modelFile.empty()) {
289 modelFile = opt_modelFile;
292 std::string modelFileCao =
"mbt/cube.cao";
293 std::string modelFileWrl =
"mbt/cube.wrl";
295 if (!opt_ipath.empty()) {
300 #ifdef VISP_HAVE_COIN3D
303 std::cerr <<
"Coin is not detected in ViSP. Use the .cao model instead." << std::endl;
313 #ifdef VISP_HAVE_COIN3D
316 std::cerr <<
"Coin is not detected in ViSP. Use the .cao model instead." << std::endl;
323 if (!opt_initFile.empty())
324 initFile = opt_initFile;
325 else if (!opt_ipath.empty())
338 std::cout <<
"Cannot open sequence: " << ipath << std::endl;
348 #if defined(VISP_HAVE_X11)
350 #elif defined(VISP_HAVE_GDI)
352 #elif defined(HAVE_OPENCV_HIGHGUI)
354 #elif defined(VISP_HAVE_D3D9)
356 #elif defined(VISP_HAVE_GTK)
362 #if defined(VISP_HAVE_DISPLAY)
363 display.init(I, 100, 100,
"Test tracking");
369 vpMbKltTracker tracker;
375 #if defined(VISP_HAVE_PUGIXML)
377 tracker.loadConfigFile(configFile);
392 tracker.setCameraParameters(cam);
393 tracker.setKltOpencv(klt);
394 tracker.setKltMaskBorder(5);
399 tracker.setNearClippingDistance(0.01);
400 tracker.setFarClippingDistance(0.90);
408 tracker.setDisplayFeatures(displayKltPoints);
411 tracker.setOgreVisibilityTest(useOgre);
413 tracker.setOgreShowConfigDialog(showOgreConfigDialog);
416 tracker.setScanLineVisibilityTest(useScanline);
419 tracker.setCovarianceComputation(computeCovariance);
422 tracker.getCameraParameters(cam);
425 if (opt_display && opt_click_allowed) {
434 tracker.loadModel(modelFile);
442 if (opt_display && opt_click_allowed) {
443 tracker.initClick(I, initFile,
true);
444 tracker.getPose(cMo);
449 vpHomogeneousMatrix cMoi(0.02044769891, 0.1101505452, 0.5078963719, 2.063603907, 1.110231561, -0.4392789872);
450 tracker.initFromPose(I, cMoi);
455 tracker.getPose(cMo);
460 while (!reader.
end()) {
469 vpTRACE(
"Test reset tracker");
472 tracker.resetTracker();
474 #if defined(VISP_HAVE_PUGIXML)
475 tracker.loadConfigFile(configFile);
490 tracker.setCameraParameters(cam);
491 tracker.setKltOpencv(klt);
492 tracker.setKltMaskBorder(5);
497 tracker.setNearClippingDistance(0.01);
498 tracker.setFarClippingDistance(0.90);
504 tracker.loadModel(modelFile);
505 tracker.setCameraParameters(cam);
506 tracker.setOgreVisibilityTest(useOgre);
507 tracker.setScanLineVisibilityTest(useScanline);
508 tracker.setCovarianceComputation(computeCovariance);
509 tracker.initFromPose(I, cMo);
514 cMo.
buildFrom(0.0439540832, 0.0845870108, 0.5477322481, 2.179498458, 0.8611798108, -0.3491961946);
515 vpTRACE(
"Test set pose");
516 tracker.setPose(I, cMo);
533 tracker.getPose(cMo);
542 if (opt_click_allowed) {
550 if (computeCovariance) {
551 std::cout <<
"Covariance matrix: \n" << tracker.getCovarianceMatrix() << std::endl << std::endl;
558 std::cout <<
"Reached last frame: " << reader.
getFrameIndex() << std::endl;
560 if (opt_click_allowed && !quit) {
569 std::cout <<
"Catch an exception: " << e << std::endl;
578 std::cout <<
"visp_mbt, visp_gui modules and OpenCV are required to run "
Generic class defining intrinsic camera parameters.
void initPersProjWithoutDistortion(double px, double py, double u0, double v0)
static const vpColor darkRed
Display for windows using Direct3D 3rd party. Thus to enable this class Direct3D should be installed....
Display for windows using GDI (available on any windows 32 platform).
The vpDisplayGTK allows to display image using the GTK 3rd party library. Thus to enable this class G...
The vpDisplayOpenCV allows to display image using the OpenCV library. Thus to enable this class OpenC...
static bool getClick(const vpImage< unsigned char > &I, bool blocking=true)
static void display(const vpImage< unsigned char > &I)
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), const std::string &frameName="", const vpColor &textColor=vpColor::black, const vpImagePoint &textOffset=vpImagePoint(15, 15))
static void flush(const vpImage< unsigned char > &I)
static void displayText(const vpImage< unsigned char > &I, const vpImagePoint &ip, const std::string &s, const vpColor &color)
error that can be emitted by ViSP classes.
Implementation of an homogeneous matrix and operations on such kind of matrices.
vpHomogeneousMatrix & buildFrom(const vpTranslationVector &t, const vpRotationMatrix &R)
Wrapper for the KLT (Kanade-Lucas-Tomasi) feature tracker implemented in OpenCV. Thus to enable this ...
void setBlockSize(int blockSize)
void setQuality(double qualityLevel)
void setHarrisFreeParameter(double harris_k)
void setMaxFeatures(int maxCount)
void setMinDistance(double minDistance)
void setWindowSize(int winSize)
void setPyramidLevels(int pyrMaxLevel)
static double rad(double deg)
static bool parse(int *argcPtr, const char **argv, vpArgvInfo *argTable, int flags)
Class that enables to manipulate easily a video file or a sequence of images. As it inherits from the...
void acquire(vpImage< vpRGBa > &I)
void setLastFrameIndex(const long last_frame)
void open(vpImage< vpRGBa > &I)
void setFileName(const std::string &filename)
long getFirstFrameIndex()
long getFrameIndex() const