47 #include <visp3/core/vpConfig.h>
49 #if defined(VISP_HAVE_MODULE_TT) && defined(VISP_HAVE_DISPLAY)
51 #include <visp3/core/vpDebug.h>
52 #include <visp3/core/vpHomogeneousMatrix.h>
53 #include <visp3/core/vpIoTools.h>
54 #include <visp3/core/vpMath.h>
55 #include <visp3/gui/vpDisplayD3D.h>
56 #include <visp3/gui/vpDisplayGDI.h>
57 #include <visp3/gui/vpDisplayGTK.h>
58 #include <visp3/gui/vpDisplayOpenCV.h>
59 #include <visp3/gui/vpDisplayX.h>
60 #include <visp3/io/vpImageIo.h>
61 #include <visp3/io/vpParseArgv.h>
62 #include <visp3/io/vpVideoReader.h>
64 #include <visp3/tt/vpTemplateTrackerSSD.h>
65 #include <visp3/tt/vpTemplateTrackerSSDESM.h>
66 #include <visp3/tt/vpTemplateTrackerSSDForwardAdditional.h>
67 #include <visp3/tt/vpTemplateTrackerSSDForwardCompositional.h>
68 #include <visp3/tt/vpTemplateTrackerSSDInverseCompositional.h>
69 #include <visp3/tt/vpTemplateTrackerZNCCForwardAdditional.h>
70 #include <visp3/tt/vpTemplateTrackerZNCCInverseCompositional.h>
72 #include <visp3/tt/vpTemplateTrackerWarpAffine.h>
73 #include <visp3/tt/vpTemplateTrackerWarpHomography.h>
74 #include <visp3/tt/vpTemplateTrackerWarpHomographySL3.h>
75 #include <visp3/tt/vpTemplateTrackerWarpRT.h>
76 #include <visp3/tt/vpTemplateTrackerWarpSRT.h>
77 #include <visp3/tt/vpTemplateTrackerWarpTranslation.h>
79 #ifdef VISP_HAVE_MODULE_TT_MI
80 #include <visp3/tt_mi/vpTemplateTrackerMIESM.h>
81 #include <visp3/tt_mi/vpTemplateTrackerMIForwardAdditional.h>
82 #include <visp3/tt_mi/vpTemplateTrackerMIForwardCompositional.h>
83 #include <visp3/tt_mi/vpTemplateTrackerMIInverseCompositional.h>
86 #define GETOPTARGS "cdhi:l:Lprs:t:w:"
88 #ifndef DOXYGEN_SHOULD_SKIP_THIS
95 #ifdef VISP_HAVE_MODULE_TT_MI
103 TRACKER_SSD_FORWARD_ADDITIONAL,
104 TRACKER_SSD_FORWARD_COMPOSITIONAL,
105 TRACKER_SSD_INVERSE_COMPOSITIONAL,
106 TRACKER_ZNCC_FORWARD_ADDITIONEL,
107 TRACKER_ZNCC_INVERSE_COMPOSITIONAL,
108 #ifdef VISP_HAVE_MODULE_TT_MI
110 TRACKER_MI_FORWARD_ADDITIONAL,
111 TRACKER_MI_FORWARD_COMPOSITIONAL,
112 TRACKER_MI_INVERSE_COMPOSITIONAL,
119 void usage(
const char *name,
const char *badparam,
const WarpType &warp_type, TrackerType &tracker_type,
120 const long &last_frame,
const double &residual_threhold)
122 #if VISP_HAVE_DATASET_VERSION >= 0x030600
123 std::string ext(
"png");
125 std::string ext(
"pgm");
129 Example of template tracking.\n\
132 %s [-i <test image path>] [-c] [-d] [-p] \n\
133 [-w <warp type>] [-t <tracker type>] \n\
134 [-l <last frame number>] [-r] [-L] [-h]\n",
139 -i <input image path> \n\
140 Set image input path.\n\
141 From this path read images \n\
142 \"mire-2/image%%04d.%s\". These \n\
143 images come from ViSP-images-x.y.z.tar.gz available \n\
144 on the ViSP website.\n\
145 Setting the VISP_INPUT_IMAGE_PATH environment\n\
146 variable produces the same behaviour than using\n\
149 -l <last frame number> %ld\n\
150 Last frame number to consider.\n\
153 Turn off the display.\n\
156 Disable the mouse click. Useful to automate the \n\
157 execution of this program without human intervention.\n\
159 ext.c_str(), last_frame);
161 #ifdef VISP_HAVE_MODULE_TT_MI
163 -w <warp type=[0,1,2,3,4,5]> %d\n\
164 Set the model used to warp the template. \n\
165 Authorized values are:\n\
168 %d : Homography in SL3\n\
169 %d : SRT (scale, rotation, translation)\n\
171 %d : RT (rotation, translation)\n\n",
172 (
int)warp_type, (
int)WARP_AFFINE, (
int)WARP_HOMOGRAPHY, (
int)WARP_HOMOGRAPHY_SL3, (
int)WARP_SRT,
173 (
int)WARP_TRANSLATION, (
int)WARP_RT);
176 -w <warp type=[0,1,2,3,4]> %d\n\
177 Set the model used to warp the template. \n\
178 Authorized values are:\n\
181 %d : Homography in SL3\n\
182 %d : SRT (scale, rotation, translation)\n\
183 %d : Translation\n\n",
184 (
int)warp_type, (
int)WARP_AFFINE, (
int)WARP_HOMOGRAPHY, (
int)WARP_HOMOGRAPHY_SL3, (
int)WARP_SRT,
185 (
int)WARP_TRANSLATION);
188 #ifdef VISP_HAVE_MODULE_TT_MI
190 -t <tracker type=[0,1,2,3,4,5,6,7,8,9]> %d\n\
191 Set the tracker used to track the template. \n\
192 Authorized values are:\n\
194 %d : SSD forward additional\n\
195 %d : SSD forward compositional\n\
196 %d : SSD inverse compositional\n\
197 %d : ZNCC forward additional\n\
198 %d : ZNCC inverse compositional\n\
200 %d : MI forward additional\n\
201 %d : MI forward compositional\n\
202 %d : MI inverse compositional\n",
203 (
int)tracker_type, (
int)TRACKER_SSD_ESM, (
int)TRACKER_SSD_FORWARD_ADDITIONAL,
204 (
int)TRACKER_SSD_FORWARD_COMPOSITIONAL, (
int)TRACKER_SSD_INVERSE_COMPOSITIONAL,
205 (
int)TRACKER_ZNCC_FORWARD_ADDITIONEL, (
int)TRACKER_ZNCC_INVERSE_COMPOSITIONAL, (
int)TRACKER_MI_ESM,
206 (
int)TRACKER_MI_FORWARD_ADDITIONAL, (
int)TRACKER_MI_FORWARD_COMPOSITIONAL,
207 (
int)TRACKER_MI_INVERSE_COMPOSITIONAL);
210 -t <tracker type=[0,1,2,3,4,5]> %d\n\
211 Set the tracker used to track the template. \n\
212 Authorized values are:\n\
214 %d : SSD forward additional\n\
215 %d : SSD forward compositional\n\
216 %d : SSD inverse compositional\n\
217 %d : ZNCC forward additional\n\
218 %d : ZNCC inverse compositional\n",
219 (
int)tracker_type, (
int)TRACKER_SSD_ESM, (
int)TRACKER_SSD_FORWARD_ADDITIONAL,
220 (
int)TRACKER_SSD_FORWARD_COMPOSITIONAL, (
int)TRACKER_SSD_INVERSE_COMPOSITIONAL,
221 (
int)TRACKER_ZNCC_FORWARD_ADDITIONEL, (
int)TRACKER_ZNCC_INVERSE_COMPOSITIONAL);
226 Enable pyramidal tracking.\n\
229 Disable re-init at frame 10.\n\
231 -s <residual threshold> %g\n\
232 Threshold used to stop optimization when residual difference\n\
233 between two successive optimization iteration becomes lower\n\
234 that this parameter.\n\
240 Print the help.\n\n",
244 fprintf(stdout,
"\nERROR: Bad parameter [%s]\n", badparam);
247 bool getOptions(
int argc,
const char **argv, std::string &ipath,
bool &click_allowed,
bool &display,
bool &pyramidal,
248 WarpType &warp_type, TrackerType &tracker_type,
long &last_frame,
bool &reinit,
249 double &threshold_residual,
bool &log)
257 click_allowed =
false;
263 usage(argv[0],
nullptr, warp_type, tracker_type, last_frame, threshold_residual);
270 last_frame = (long)atoi(optarg_);
282 tracker_type = (TrackerType)atoi(optarg_);
285 warp_type = (WarpType)atoi(optarg_);
288 threshold_residual = std::atof(optarg_);
292 usage(argv[0], optarg_, warp_type, tracker_type, last_frame, threshold_residual);
298 if (warp_type >= WARP_LAST) {
299 usage(argv[0],
nullptr, warp_type, tracker_type, last_frame, threshold_residual);
300 std::cerr <<
"ERROR: " << std::endl;
301 std::cerr <<
" Bad argument -w <warp type> with \"warp type\"=" << (int)warp_type << std::endl << std::endl;
304 if (tracker_type >= TRACKER_LAST) {
305 usage(argv[0],
nullptr, warp_type, tracker_type, last_frame, threshold_residual);
306 std::cerr <<
"ERROR: " << std::endl;
307 std::cerr <<
" Bad argument -t <tracker type> with \"tracker type\"=" << (int)tracker_type << std::endl
311 if ((c == 1) || (c == -1)) {
313 usage(argv[0],
nullptr, warp_type, tracker_type, last_frame, threshold_residual);
314 std::cerr <<
"ERROR: " << std::endl;
315 std::cerr <<
" Bad argument " << optarg_ << std::endl << std::endl;
322 int main(
int argc,
const char **argv)
324 #if defined(VISP_HAVE_LAPACK) || defined(VISP_HAVE_EIGEN3) || defined(VISP_HAVE_OPENCV)
326 std::string env_ipath;
327 std::string opt_ipath;
329 bool opt_click_allowed =
true;
330 bool opt_display =
true;
331 bool opt_pyramidal =
false;
332 TrackerType opt_tracker_type = TRACKER_SSD_INVERSE_COMPOSITIONAL;
333 WarpType opt_warp_type = WARP_AFFINE;
334 long opt_last_frame = 30;
335 bool opt_reinit =
true;
336 double opt_threshold_residual = 1e-4;
337 bool opt_log =
false;
341 #if !defined(_WIN32) && (defined(__unix__) || defined(__unix) || (defined(__APPLE__) && defined(__MACH__)))
342 std::string opath =
"/tmp";
343 #elif defined(_WIN32)
344 std::string opath =
"C:\\temp";
347 #if VISP_HAVE_DATASET_VERSION >= 0x030600
348 std::string ext(
"png");
350 std::string ext(
"pgm");
354 std::string username;
362 if (!env_ipath.empty())
370 if (!getOptions(argc, argv, opt_ipath, opt_click_allowed, opt_display, opt_pyramidal, opt_warp_type,
371 opt_tracker_type, opt_last_frame, opt_reinit, opt_threshold_residual, opt_log)) {
376 if (opt_ipath.empty() && env_ipath.empty()) {
377 usage(argv[0],
nullptr, opt_warp_type, opt_tracker_type, opt_last_frame, opt_threshold_residual);
378 std::cerr << std::endl <<
"ERROR:" << std::endl;
379 std::cerr <<
" Use -i <visp image path> option or set VISP_INPUT_IMAGE_PATH " << std::endl
380 <<
" environment variable to specify the location of the " << std::endl
381 <<
" image path where test images are located." << std::endl
388 if (!opt_ipath.empty())
394 ofs.open(logfilename.c_str());
406 std::cout <<
"Cannot open sequence: " << ipath << std::endl;
414 #if defined(VISP_HAVE_X11)
416 #elif defined(VISP_HAVE_GDI)
418 #elif defined(HAVE_OPENCV_HIGHGUI)
420 #elif defined(VISP_HAVE_D3D9)
422 #elif defined(VISP_HAVE_GTK)
427 #if defined(VISP_HAVE_DISPLAY)
428 display->init(I, 100, 100,
"Test tracking");
435 switch (opt_warp_type) {
439 case WARP_HOMOGRAPHY:
442 case WARP_HOMOGRAPHY_SL3:
448 case WARP_TRANSLATION:
451 #ifdef VISP_HAVE_MODULE_TT_MI
461 switch (opt_tracker_type) {
462 case TRACKER_SSD_ESM:
465 case TRACKER_SSD_FORWARD_ADDITIONAL:
468 case TRACKER_SSD_FORWARD_COMPOSITIONAL:
471 case TRACKER_SSD_INVERSE_COMPOSITIONAL:
474 case TRACKER_ZNCC_FORWARD_ADDITIONEL:
477 case TRACKER_ZNCC_INVERSE_COMPOSITIONAL:
480 #ifdef VISP_HAVE_MODULE_TT_MI
484 case TRACKER_MI_FORWARD_ADDITIONAL:
487 case TRACKER_MI_FORWARD_COMPOSITIONAL:
490 case TRACKER_MI_INVERSE_COMPOSITIONAL:
506 bool delaunay =
false;
507 if (opt_display && opt_click_allowed)
510 std::vector<vpImagePoint> v_ip;
531 while (!reader.
end()) {
534 std::cout <<
"Process image number " << reader.
getFrameIndex() << std::endl;
546 std::cout <<
"re-init simulation" << std::endl;
547 if (opt_click_allowed)
552 if (opt_display && opt_click_allowed) {
557 std::vector<vpImagePoint> v_ip;
583 warp_->
warpZone(zoneRef_, p_, zoneWarped_);
593 std::cout <<
"Total time: " << t_end - t_init <<
" ms" << std::endl;
594 std::cout <<
"Total mean: " << (t_end - t_init) / niter <<
" ms" << std::endl;
597 std::cout <<
"Log are saved in: " << logfilename << std::endl;
601 if (opt_click_allowed) {
615 std::cout <<
"Catch an exception: " << e << std::endl;
621 std::cout <<
"Cannot run this example: install Lapack, Eigen3 or OpenCV" << std::endl;
629 std::cout <<
"visp_tt module or display not available." << std::endl;
Implementation of column vector and the associated operations.
static const vpColor green
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...
Class that defines generic functionalities for display.
static bool getClick(const vpImage< unsigned char > &I, bool blocking=true)
static void display(const vpImage< unsigned char > &I)
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.
Class that defines a 2D point in an image. This class is useful for image processing and stores only ...
void set_ij(double ii, double jj)
static bool parse(int *argcPtr, const char **argv, vpArgvInfo *argTable, int flags)
void warpZone(const vpTemplateTrackerZone &in, const vpColVector &p, vpTemplateTrackerZone &out)
void display(const vpImage< unsigned char > &I, const vpColor &col=vpColor::green, unsigned int thickness=3)
void display(const vpImage< unsigned char > &I, const vpColor &col=vpColor::green, unsigned int thickness=3)
void setThresholdGradient(double threshold)
unsigned int getNbIteration() const
void setThresholdResidualDifference(double threshold)
void initFromPoints(const vpImage< unsigned char > &I, const std::vector< vpImagePoint > &v_ip, bool delaunay=false)
void setIterationMax(const unsigned int &n)
void setPyramidal(unsigned int nlevels=2, unsigned int level_to_stop=1)
void track(const vpImage< unsigned char > &I)
vpTemplateTrackerZone getZoneRef() const
void setSampling(int sample_i, int sample_j)
vpTemplateTrackerWarp * getWarp() const
void initClick(const vpImage< unsigned char > &I, bool delaunay=false)
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)
void setFirstFrameIndex(const long first_frame)
long getFrameIndex() const
void display(vpImage< unsigned char > &I, const std::string &title)
Display a gray-scale image.
VISP_EXPORT double measureTimeMs()