42#include <visp3/core/vpConfig.h>
44#if defined(VISP_HAVE_MODULE_MBT) && defined(VISP_HAVE_MODULE_KLT) && defined(VISP_HAVE_OPENCV) && \
45 defined(VISP_HAVE_DISPLAY) && defined(HAVE_OPENCV_IMGPROC) && defined(HAVE_OPENCV_VIDEO)
47#include <visp3/core/vpDebug.h>
48#include <visp3/core/vpHomogeneousMatrix.h>
49#include <visp3/core/vpIoTools.h>
50#include <visp3/core/vpMath.h>
51#include <visp3/gui/vpDisplayD3D.h>
52#include <visp3/gui/vpDisplayGDI.h>
53#include <visp3/gui/vpDisplayGTK.h>
54#include <visp3/gui/vpDisplayOpenCV.h>
55#include <visp3/gui/vpDisplayX.h>
56#include <visp3/io/vpImageIo.h>
57#include <visp3/io/vpParseArgv.h>
58#include <visp3/io/vpVideoReader.h>
59#include <visp3/mbt/vpMbEdgeKltTracker.h>
61#define GETOPTARGS "x:m:i:n:de:chtfColwvp"
63#ifdef ENABLE_VISP_NAMESPACE
67void usage(
const char *name,
const char *badparam)
69#if defined(VISP_HAVE_DATASET)
70#if VISP_HAVE_DATASET_VERSION >= 0x030600
71 std::string ext(
"png");
73 std::string ext(
"pgm");
77 std::string ext(
"png");
81Example of tracking based on the 3D model.\n\
84 %s [-i <test image path>] [-x <config file>]\n\
85 [-m <model name>] [-n <initialisation file base name>] [-e <last frame index>]\n\
86 [-t] [-c] [-d] [-h] [-f] [-C] [-o] [-w] [-l] [-v] [-p]\n",
91 -i <input image path> \n\
92 Set image input path.\n\
93 From this path read images \n\
94 \"mbt/cube/image%%04d.%s\". These \n\
95 images come from visp-images-x.y.z.tar.gz available \n\
96 on the ViSP website.\n\
97 Setting the VISP_INPUT_IMAGE_PATH environment\n\
98 variable produces the same behaviour than using\n\
102 Set the config file (the xml file) to use.\n\
103 The config file is used to specify the parameters of the tracker.\n\
106 Specify the name of the file of the model\n\
107 The model can either be a vrml model (.wrl) or a .cao file.\n\
109 -e <last frame index> \n\
110 Specify the index of the last frame. Once reached, the tracking is stopped\n\
113 Do not use the vrml model, use the .cao one. These two models are \n\
114 equivalent and comes from ViSP-images-x.y.z.tar.gz available on the ViSP\n\
115 website. However, the .cao model allows to use the 3d model based tracker \n\
119 Track only the cube (not the cylinder). In this case the models files are\n\
120 cube.cao or cube.wrl instead of cube_and_cylinder.cao and \n\
121 cube_and_cylinder.wrl.\n\
123 -n <initialisation file base name> \n\
124 Base name of the initialisation file. The file will be 'base_name'.init .\n\
125 This base name is also used for the Optional picture specifying where to \n\
126 click (a .ppm picture).\n\
129 Turn off the display of the the moving edges and Klt points. \n\
132 Turn off the display.\n\
135 Disable the mouse click. Useful to automate the \n\
136 execution of this program without human intervention.\n\
139 Use Ogre3D for visibility tests\n\
142 When Ogre3D is enable [-o] show Ogre3D configuration dialog thatallows to set the renderer.\n\
145 Use the scanline for visibility tests.\n\
148 Compute covariance matrix.\n\
151 Compute gradient projection error.\n\
154 Print the help.\n\n",
158 fprintf(stdout,
"\nERROR: Bad parameter [%s]\n", badparam);
161bool getOptions(
int argc,
const char **argv, std::string &ipath, std::string &configFile, std::string &modelFile,
162 std::string &initFile,
long &lastFrame,
bool &displayFeatures,
bool &click_allowed,
bool &display,
163 bool &cao3DModel,
bool &trackCylinder,
bool &useOgre,
bool &showOgreConfigDialog,
bool &useScanline,
164 bool &computeCovariance,
bool &projectionError)
172 lastFrame = atol(optarg_);
178 configFile = optarg_;
187 displayFeatures =
false;
193 click_allowed =
false;
199 trackCylinder =
false;
208 showOgreConfigDialog =
true;
211 computeCovariance =
true;
214 projectionError =
true;
217 usage(argv[0],
nullptr);
221 usage(argv[0], optarg_);
226 if ((c == 1) || (c == -1)) {
228 usage(argv[0],
nullptr);
229 std::cerr <<
"ERROR: " << std::endl;
230 std::cerr <<
" Bad argument " << optarg_ << std::endl << std::endl;
237int main(
int argc,
const char **argv)
240 std::string env_ipath;
241 std::string opt_ipath;
243 std::string opt_configFile;
244 std::string configFile;
245 std::string opt_modelFile;
246 std::string modelFile;
247 std::string opt_initFile;
248 std::string initFile;
249 long opt_lastFrame = -1;
250 bool displayFeatures =
true;
251 bool opt_click_allowed =
true;
252 bool opt_display =
true;
253 bool cao3DModel =
false;
254 bool trackCylinder =
true;
255 bool useOgre =
false;
256 bool showOgreConfigDialog =
false;
257 bool useScanline =
false;
258 bool computeCovariance =
false;
259 bool projectionError =
false;
262#if defined(VISP_HAVE_DATASET)
263#if VISP_HAVE_DATASET_VERSION >= 0x030600
264 std::string ext(
"png");
266 std::string ext(
"pgm");
270 std::string ext(
"png");
278 if (!env_ipath.empty())
282 if (!getOptions(argc, argv, opt_ipath, opt_configFile, opt_modelFile, opt_initFile, opt_lastFrame, displayFeatures,
283 opt_click_allowed, opt_display, cao3DModel, trackCylinder, useOgre, showOgreConfigDialog,
284 useScanline, computeCovariance, projectionError)) {
289 if (opt_ipath.empty() && env_ipath.empty()) {
290 usage(argv[0],
nullptr);
291 std::cerr << std::endl <<
"ERROR:" << std::endl;
292 std::cerr <<
" Use -i <visp image path> option or set VISP_INPUT_IMAGE_PATH " << std::endl
293 <<
" environment variable to specify the location of the " << std::endl
294 <<
" image path where test images are located." << std::endl
301 if (!opt_ipath.empty())
306 if (!opt_configFile.empty())
307 configFile = opt_configFile;
308 else if (!opt_ipath.empty())
313 if (!opt_modelFile.empty()) {
314 modelFile = opt_modelFile;
317 std::string modelFileCao;
318 std::string modelFileWrl;
320 modelFileCao =
"mbt/cube_and_cylinder.cao";
321 modelFileWrl =
"mbt/cube_and_cylinder.wrl";
324 modelFileCao =
"mbt/cube.cao";
325 modelFileWrl =
"mbt/cube.wrl";
328 if (!opt_ipath.empty()) {
333#ifdef VISP_HAVE_COIN3D
336 std::cerr <<
"Coin is not detected in ViSP. Use the .cao model instead." << std::endl;
346#ifdef VISP_HAVE_COIN3D
349 std::cerr <<
"Coin is not detected in ViSP. Use the .cao model instead." << std::endl;
356 if (!opt_initFile.empty())
357 initFile = opt_initFile;
358 else if (!opt_ipath.empty())
371 std::cout <<
"Cannot open sequence: " << ipath << std::endl;
381#if defined(VISP_HAVE_X11)
383#elif defined(VISP_HAVE_GDI)
385#elif defined(HAVE_OPENCV_HIGHGUI)
387#elif defined(VISP_HAVE_D3D9)
389#elif defined(VISP_HAVE_GTK)
395#if defined(VISP_HAVE_DISPLAY)
396 display.init(I, 100, 100,
"Test tracking");
408#if defined(VISP_HAVE_PUGIXML)
410 tracker.loadConfigFile(configFile);
414 cam.initPersProjWithoutDistortion(547, 542, 338, 234);
435 tracker.setCameraParameters(cam);
443 tracker.setNearClippingDistance(0.01);
444 tracker.setFarClippingDistance(0.90);
452 tracker.setDisplayFeatures(displayFeatures);
455 tracker.setOgreVisibilityTest(useOgre);
457 tracker.setOgreShowConfigDialog(showOgreConfigDialog);
460 tracker.setScanLineVisibilityTest(useScanline);
463 tracker.setCovarianceComputation(computeCovariance);
466 tracker.setProjectionErrorComputation(projectionError);
469 tracker.getCameraParameters(cam);
472 if (opt_display && opt_click_allowed) {
490 if (opt_display && opt_click_allowed) {
491 tracker.initClick(I, initFile,
true);
497 vpHomogeneousMatrix cMoi(0.02044769891, 0.1101505452, 0.5078963719, 2.063603907, 1.110231561, -0.4392789872);
508 while (!reader.
end()) {
521#if defined(VISP_HAVE_PUGIXML)
522 tracker.loadConfigFile(configFile);
526 cam.initPersProjWithoutDistortion(547, 542, 338, 234);
547 tracker.setCameraParameters(cam);
555 tracker.setNearClippingDistance(0.01);
556 tracker.setFarClippingDistance(0.90);
563 tracker.setCameraParameters(cam);
564 tracker.setOgreVisibilityTest(useOgre);
565 tracker.setScanLineVisibilityTest(useScanline);
566 tracker.setCovarianceComputation(computeCovariance);
567 tracker.setProjectionErrorComputation(projectionError);
573 cMo.buildFrom(0.0439540832, 0.0845870108, 0.5477322481, 2.179498458, 0.8611798108, -0.3491961946);
601 if (opt_click_allowed) {
609 if (computeCovariance) {
610 std::cout <<
"Covariance matrix: \n" <<
tracker.getCovarianceMatrix() << std::endl << std::endl;
613 if (projectionError) {
614 std::cout <<
"Projection error: " <<
tracker.getProjectionError() << std::endl << std::endl;
621 std::cout <<
"Reached last frame: " << reader.
getFrameIndex() << std::endl;
623 if (opt_click_allowed && !quit) {
631 std::cout <<
"Catch an exception: " <<
e << std::endl;
640 std::cout <<
"visp_mbt, visp_gui modules and OpenCV are required to run "
Generic class defining intrinsic camera parameters.
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...
Use the X11 console to display images on unix-like OS. Thus to enable this class X11 should be instal...
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.
Definition of the vpImage class member functions.
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)
Hybrid tracker based on moving-edges and keypoints tracked using KLT tracker.
void setMu1(const double &mu_1)
void setRange(const unsigned int &range)
void setLikelihoodThresholdType(const vpLikelihoodThresholdType likelihood_threshold_type)
void setMaskNumber(const unsigned int &mask_number)
void setThreshold(const double &threshold)
void setSampleStep(const double &sample_step)
void setMaskSize(const unsigned int &mask_size)
void setMu2(const double &mu_2)
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 setLastFrameIndex(const long last_frame)
void open(vpImage< vpRGBa > &I) VP_OVERRIDE
void setFileName(const std::string &filename)
long getFirstFrameIndex()
long getFrameIndex() const
void acquire(vpImage< vpRGBa > &I) VP_OVERRIDE
VISP_EXPORT int wait(double t0, double t)