56 #include <visp/vpDebug.h>
57 #include <visp/vpConfig.h>
64 #if (defined (VISP_HAVE_X11) || defined(VISP_HAVE_GTK) || defined(VISP_HAVE_GDI))
66 #include <visp/vpImage.h>
67 #include <visp/vpImageIo.h>
68 #include <visp/vpImagePoint.h>
69 #include <visp/vpDisplayX.h>
70 #include <visp/vpDisplayGTK.h>
71 #include <visp/vpDisplayGDI.h>
72 #include <visp/vpDot.h>
73 #include <visp/vpParseArgv.h>
74 #include <visp/vpIoTools.h>
77 #define GETOPTARGS "cdf:i:n:p:s:h"
79 void usage(
const char *name,
const char *badparam, std::string ipath, std::string ppath,
80 unsigned first,
unsigned nimages,
unsigned step);
81 bool getOptions(
int argc,
const char **argv, std::string &ipath, std::string &ppath,
unsigned &first,
82 unsigned &nimages,
unsigned &step,
bool &click_allowed,
bool &display);
97 void usage(
const char *name,
const char *badparam, std::string ipath, std::string ppath,
98 unsigned first,
unsigned nimages,
unsigned step)
101 Test dot tracking.\n\
104 %s [-i <test image path>] [-p <personal image path>]\n\
105 [-f <first image>] [-n <number of images>] [-s <step>]\n\
106 [-c] [-d] [-h]\n", name);
110 -i <input image path> %s\n\
111 Set image input path.\n\
112 From this path read images \n\
113 \"ViSP-images/mire-2/image.%%04d.pgm\". These \n\
114 images come from ViSP-images-x.y.z.tar.gz available \n\
115 on the ViSP website.\n\
116 Setting the VISP_INPUT_IMAGE_PATH environment\n\
117 variable produces the same behaviour than using\n\
120 -p <personal image path> %s\n\
121 Specify a personal sequence containing images \n\
123 By image sequence, we mean one file per image.\n\
124 The following image file formats PNM (PGM P5, PPM P6)\n\
125 are supported. The format is selected by analysing \n\
126 the filename extension.\n\
127 Example : \"C:/Temp/ViSP-images/cube/image.%%04d.pgm\"\n\
128 %%04d is for the image numbering.\n\
130 -f <first image> %u\n\
131 First image number of the sequence.\n\
133 -n <number of images> %u\n\
134 Number of images to load from the sequence.\n\
137 Step between two images.\n\
140 Disable the mouse click. Useful to automaze the \n\
141 execution of this program without humain intervention.\n\
144 Turn off the display.\n\
148 ipath.c_str(), ppath.c_str(), first, nimages, step);
151 fprintf(stdout,
"\nERROR: Bad parameter [%s]\n", badparam);
170 bool getOptions(
int argc,
const char **argv, std::string &ipath, std::string &ppath,
unsigned &first,
171 unsigned &nimages,
unsigned &step,
bool &click_allowed,
bool &display)
178 case 'c': click_allowed =
false;
break;
179 case 'd': display =
false;
break;
180 case 'i': ipath = optarg_;
break;
181 case 'p': ppath = optarg_;
break;
182 case 'f': first = (unsigned) atoi(optarg_);
break;
183 case 'n': nimages = (unsigned) atoi(optarg_);
break;
184 case 's': step = (unsigned) atoi(optarg_);
break;
185 case 'h': usage(argv[0], NULL, ipath, ppath, first, nimages, step);
189 usage(argv[0], optarg_, ipath, ppath, first, nimages, step);
194 if ((c == 1) || (c == -1)) {
196 usage(argv[0], NULL, ipath, ppath, first, nimages, step);
197 std::cerr <<
"ERROR: " << std::endl;
198 std::cerr <<
" Bad argument " << optarg_ << std::endl << std::endl;
207 main(
int argc,
const char ** argv)
210 std::string env_ipath;
211 std::string opt_ipath;
213 std::string opt_ppath;
215 std::string filename;
216 unsigned opt_first = 1;
217 unsigned opt_nimages = 500;
218 unsigned opt_step = 1;
219 bool opt_click_allowed =
true;
220 bool opt_display =
true;
223 char *ptenv = getenv(
"VISP_INPUT_IMAGE_PATH");
228 if (! env_ipath.empty())
232 if (getOptions(argc, argv, opt_ipath, opt_ppath,opt_first, opt_nimages,
233 opt_step, opt_click_allowed, opt_display) ==
false) {
238 if (!opt_ipath.empty())
243 if (!opt_ipath.empty() && !env_ipath.empty() && opt_ppath.empty()) {
244 if (ipath != env_ipath) {
245 std::cout << std::endl
246 <<
"WARNING: " << std::endl;
247 std::cout <<
" Since -i <visp image path=" << ipath <<
"> "
248 <<
" is different from VISP_IMAGE_PATH=" << env_ipath << std::endl
249 <<
" we skip the environment variable." << std::endl;
254 if (opt_ipath.empty() && env_ipath.empty() && opt_ppath.empty() ){
255 usage(argv[0], NULL, ipath, opt_ppath, opt_first, opt_nimages, opt_step);
256 std::cerr << std::endl
257 <<
"ERROR:" << std::endl;
258 std::cerr <<
" Use -i <visp image path> option or set VISP_INPUT_IMAGE_PATH "
260 <<
" environment variable to specify the location of the " << std::endl
261 <<
" image path where test images are located." << std::endl
262 <<
" Use -p <personal image path> option if you want to "<<std::endl
263 <<
" use personal images." << std::endl
274 unsigned iter = opt_first;
275 std::ostringstream s;
276 char cfilename[FILENAME_MAX];
278 if (opt_ppath.empty()){
298 s.setf(std::ios::right, std::ios::adjustfield);
299 s <<
"image." << std::setw(4) << std::setfill(
'0') << iter <<
".pgm";
300 filename = dirname + s.str();
304 sprintf(cfilename,opt_ppath.c_str(), iter) ;
305 filename = cfilename;
315 vpCTRACE <<
"Load: " << filename << std::endl;
325 std::cerr << std::endl
326 <<
"ERROR:" << std::endl;
327 std::cerr <<
" Cannot read " << filename << std::endl;
328 std::cerr <<
" Check your -i " << ipath <<
" option " << std::endl
329 <<
" or VISP_INPUT_IMAGE_PATH environment variable."
335 #if defined VISP_HAVE_X11
337 #elif defined VISP_HAVE_GTK
339 #elif defined VISP_HAVE_GDI
345 display.
init(I, 100, 100,
"Display...") ;
371 if (opt_display && opt_click_allowed) {
375 std::cout <<
"Click on a white dot you want to track..." << std::endl;
391 while (iter < opt_first + opt_nimages*opt_step) {
393 if (opt_ppath.empty()){
395 s <<
"image." << std::setw(4) << std::setfill(
'0') << iter <<
".pgm";
396 filename = dirname + s.str();
399 sprintf(cfilename, opt_ppath.c_str(), iter) ;
400 filename = cfilename;
403 std::cout <<
"read : " << filename << std::endl;
410 std::cout <<
"Tracking on image: " << filename << std::endl;
419 std::cout << cog.
get_u() <<
" " << cog.
get_v()
422 std::cout <<
"Size:" << std::endl;
424 std::cout <<
"Moments:" << std::endl;
425 std::cout <<
" m00: " << d.
m00 << std::endl;
426 std::cout <<
" m10: " << d.
m10 << std::endl;
427 std::cout <<
" m01: " << d.
m01 << std::endl;
428 std::cout <<
" m11: " << d.
m11 << std::endl;
429 std::cout <<
" m02: " << d.
m02 << std::endl;
430 std::cout <<
" m20: " << d.
m20 << std::endl;
431 std::cout <<
"Centered moments:" << std::endl;
432 std::cout <<
" mu11: " << d.
mu11 << std::endl;
433 std::cout <<
" mu02: " << d.
mu02 << std::endl;
434 std::cout <<
" mu20: " << d.
mu20 << std::endl;
437 std::list<vpImagePoint> edges = d.
getEdges();
438 std::list<vpImagePoint>::const_iterator it;
439 for(it = edges.begin(); it != edges.end(); ++it) {
455 if (opt_display && opt_click_allowed) {
456 std::cout <<
"\nA click to exit..." << std::endl;
463 std::cout <<
"Catch an exception: " << e << std::endl;
471 vpERROR_TRACE(
"You do not have X11, GTK or GDI display functionalities...");
void setConnexity(vpConnexityType type)
unsigned int getHeight() const
Display for windows using GDI (available on any windows 32 platform).
Define the X11 console to display images.
void track(const vpImage< unsigned char > &I)
error that can be emited by ViSP classes.
static double measureTimeMs()
static void flush(const vpImage< unsigned char > &I)
static bool parse(int *argcPtr, const char **argv, vpArgvInfo *argTable, int flags)
std::list< vpImagePoint > getEdges() const
vpImagePoint getCog() const
void set_u(const double u)
static void display(const vpImage< unsigned char > &I)
virtual void displayCross(const vpImagePoint &ip, unsigned int size, const vpColor &color, unsigned int thickness=1)=0
void set_v(const double v)
unsigned int getWidth() const
The vpDisplayGTK allows to display image using the GTK+ library version 1.2.
void init(vpImage< unsigned char > &I, int winx=-1, int winy=-1, const char *title=NULL)
void setGraphics(const bool activate)
This tracker is meant to track a dot (connected pixels with same gray level) on a vpImage...
void setComputeMoments(const bool activate)
virtual bool getClick(bool blocking=true)=0
Class that defines a 2D point in an image. This class is useful for image processing and stores only ...
static void read(vpImage< unsigned char > &I, const char *filename)
void initTracking(const vpImage< unsigned char > &I)
virtual void displayPoint(const vpImagePoint &ip, const vpColor &color)=0
static const vpColor blue