56 #include <visp/vpDebug.h>
57 #include <visp/vpConfig.h>
64 #if (defined (VISP_HAVE_X11) || defined(VISP_HAVE_GTK) || defined(VISP_HAVE_GDI) || defined(VISP_HAVE_OPENCV))
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/vpDisplayOpenCV.h>
73 #include <visp/vpDot.h>
74 #include <visp/vpParseArgv.h>
75 #include <visp/vpIoTools.h>
78 #define GETOPTARGS "cdf:i:n:p:s:h"
80 void usage(
const char *name,
const char *badparam, std::string ipath, std::string ppath,
81 unsigned first,
unsigned nimages,
unsigned step);
82 bool getOptions(
int argc,
const char **argv, std::string &ipath, std::string &ppath,
unsigned &first,
83 unsigned &nimages,
unsigned &step,
bool &click_allowed,
bool &display);
98 void usage(
const char *name,
const char *badparam, std::string ipath, std::string ppath,
99 unsigned first,
unsigned nimages,
unsigned step)
102 Test dot tracking.\n\
105 %s [-i <test image path>] [-p <personal image path>]\n\
106 [-f <first image>] [-n <number of images>] [-s <step>]\n\
107 [-c] [-d] [-h]\n", name);
111 -i <input image path> %s\n\
112 Set image input path.\n\
113 From this path read images \n\
114 \"ViSP-images/mire-2/image.%%04d.pgm\". These \n\
115 images come from ViSP-images-x.y.z.tar.gz available \n\
116 on the ViSP website.\n\
117 Setting the VISP_INPUT_IMAGE_PATH environment\n\
118 variable produces the same behaviour than using\n\
121 -p <personal image path> %s\n\
122 Specify a personal sequence containing images \n\
124 By image sequence, we mean one file per image.\n\
125 The following image file formats PNM (PGM P5, PPM P6)\n\
126 are supported. The format is selected by analysing \n\
127 the filename extension.\n\
128 Example : \"C:/Temp/ViSP-images/cube/image.%%04d.pgm\"\n\
129 %%04d is for the image numbering.\n\
131 -f <first image> %u\n\
132 First image number of the sequence.\n\
134 -n <number of images> %u\n\
135 Number of images to load from the sequence.\n\
138 Step between two images.\n\
141 Disable the mouse click. Useful to automaze the \n\
142 execution of this program without humain intervention.\n\
145 Turn off the display.\n\
149 ipath.c_str(), ppath.c_str(), first, nimages, step);
152 fprintf(stdout,
"\nERROR: Bad parameter [%s]\n", badparam);
171 bool getOptions(
int argc,
const char **argv, std::string &ipath, std::string &ppath,
unsigned &first,
172 unsigned &nimages,
unsigned &step,
bool &click_allowed,
bool &display)
179 case 'c': click_allowed =
false;
break;
180 case 'd': display =
false;
break;
181 case 'i': ipath = optarg_;
break;
182 case 'p': ppath = optarg_;
break;
183 case 'f': first = (unsigned) atoi(optarg_);
break;
184 case 'n': nimages = (unsigned) atoi(optarg_);
break;
185 case 's': step = (unsigned) atoi(optarg_);
break;
186 case 'h': usage(argv[0], NULL, ipath, ppath, first, nimages, step);
190 usage(argv[0], optarg_, ipath, ppath, first, nimages, step);
195 if ((c == 1) || (c == -1)) {
197 usage(argv[0], NULL, ipath, ppath, first, nimages, step);
198 std::cerr <<
"ERROR: " << std::endl;
199 std::cerr <<
" Bad argument " << optarg_ << std::endl << std::endl;
208 main(
int argc,
const char ** argv)
211 std::string env_ipath;
212 std::string opt_ipath;
214 std::string opt_ppath;
216 std::string filename;
217 unsigned opt_first = 1;
218 unsigned opt_nimages = 500;
219 unsigned opt_step = 1;
220 bool opt_click_allowed =
true;
221 bool opt_display =
true;
227 if (! env_ipath.empty())
231 if (getOptions(argc, argv, opt_ipath, opt_ppath,opt_first, opt_nimages,
232 opt_step, opt_click_allowed, opt_display) ==
false) {
237 if (!opt_ipath.empty())
242 if (!opt_ipath.empty() && !env_ipath.empty() && opt_ppath.empty()) {
243 if (ipath != env_ipath) {
244 std::cout << std::endl
245 <<
"WARNING: " << std::endl;
246 std::cout <<
" Since -i <visp image path=" << ipath <<
"> "
247 <<
" is different from VISP_IMAGE_PATH=" << env_ipath << std::endl
248 <<
" we skip the environment variable." << std::endl;
253 if (opt_ipath.empty() && env_ipath.empty() && opt_ppath.empty() ){
254 usage(argv[0], NULL, ipath, opt_ppath, opt_first, opt_nimages, opt_step);
255 std::cerr << std::endl
256 <<
"ERROR:" << std::endl;
257 std::cerr <<
" Use -i <visp image path> option or set VISP_INPUT_IMAGE_PATH "
259 <<
" environment variable to specify the location of the " << std::endl
260 <<
" image path where test images are located." << std::endl
261 <<
" Use -p <personal image path> option if you want to "<<std::endl
262 <<
" use personal images." << std::endl
273 unsigned iter = opt_first;
274 std::ostringstream s;
275 char cfilename[FILENAME_MAX];
277 if (opt_ppath.empty()){
297 s.setf(std::ios::right, std::ios::adjustfield);
298 s <<
"image." << std::setw(4) << std::setfill(
'0') << iter <<
".pgm";
303 sprintf(cfilename,opt_ppath.c_str(), iter) ;
304 filename = cfilename;
314 vpCTRACE <<
"Load: " << filename << std::endl;
324 std::cerr << std::endl
325 <<
"ERROR:" << std::endl;
326 std::cerr <<
" Cannot read " << filename << std::endl;
327 std::cerr <<
" Check your -i " << ipath <<
" option " << std::endl
328 <<
" or VISP_INPUT_IMAGE_PATH environment variable."
334 #if defined VISP_HAVE_X11
336 #elif defined VISP_HAVE_GTK
338 #elif defined VISP_HAVE_GDI
340 #elif defined VISP_HAVE_OPENCV
346 display.
init(I, 100, 100,
"Display...") ;
372 if (opt_display && opt_click_allowed) {
376 std::cout <<
"Click on a white dot you want to track..." << std::endl;
390 while (iter < opt_first + opt_nimages*opt_step) {
392 if (opt_ppath.empty()){
394 s <<
"image." << std::setw(4) << std::setfill(
'0') << iter <<
".pgm";
398 sprintf(cfilename, opt_ppath.c_str(), iter) ;
399 filename = cfilename;
402 std::cout <<
"read : " << filename << std::endl;
409 std::cout <<
"Tracking on image: " << filename << std::endl;
418 std::cout << cog.
get_u() <<
" " << cog.
get_v()
421 std::cout <<
"Size:" << std::endl;
423 std::cout <<
"Moments:" << std::endl;
424 std::cout <<
" m00: " << d.
m00 << std::endl;
425 std::cout <<
" m10: " << d.
m10 << std::endl;
426 std::cout <<
" m01: " << d.
m01 << std::endl;
427 std::cout <<
" m11: " << d.
m11 << std::endl;
428 std::cout <<
" m02: " << d.
m02 << std::endl;
429 std::cout <<
" m20: " << d.
m20 << std::endl;
430 std::cout <<
"Centered moments:" << std::endl;
431 std::cout <<
" mu11: " << d.
mu11 << std::endl;
432 std::cout <<
" mu02: " << d.
mu02 << std::endl;
433 std::cout <<
" mu20: " << d.
mu20 << std::endl;
436 std::list<vpImagePoint> edges = d.
getEdges();
437 std::list<vpImagePoint>::const_iterator it;
438 for(it = edges.begin(); it != edges.end(); ++it) {
454 if (opt_display && opt_click_allowed) {
455 std::cout <<
"\nA click to exit..." << std::endl;
462 std::cout <<
"Catch an exception: " << e << std::endl;
470 vpERROR_TRACE(
"You do not have X11, GTK, GDI or OpenCV display functionalities...");
void init(vpImage< unsigned char > &I, int winx=-1, int winy=-1, const char *title=NULL)
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)
The vpDisplayOpenCV allows to display image using the opencv library.
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 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