48 #include <visp/vpDebug.h>
49 #include <visp/vpConfig.h>
56 #if (defined (VISP_HAVE_X11) || defined(VISP_HAVE_GTK) || defined(VISP_HAVE_GDI) || defined(VISP_HAVE_OPENCV))
58 #include <visp/vpImage.h>
59 #include <visp/vpImageIo.h>
60 #include <visp/vpImagePoint.h>
61 #include <visp/vpDisplayX.h>
62 #include <visp/vpDisplayGTK.h>
63 #include <visp/vpDisplayGDI.h>
64 #include <visp/vpDisplayOpenCV.h>
65 #include <visp/vpDot2.h>
66 #include <visp/vpParseArgv.h>
67 #include <visp/vpIoTools.h>
70 #define GETOPTARGS "cdf:i:n:p:s:h"
74 void usage(
const char *name,
const char *badparam, std::string ipath, std::string ppath,
75 unsigned first,
unsigned nimages,
unsigned step);
76 bool getOptions(
int argc,
const char **argv, std::string &ipath, std::string &ppath,
unsigned &first,
77 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 using vpDot2 class.\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;
206 main(
int argc,
const char ** argv)
209 std::string env_ipath;
210 std::string opt_ipath;
212 std::string opt_ppath;
214 std::string filename;
215 unsigned opt_first = 1;
216 unsigned opt_nimages = 500;
217 unsigned opt_step = 1;
218 bool opt_click_allowed =
true;
219 bool opt_display =
true;
225 if (! env_ipath.empty())
229 if (getOptions(argc, argv, opt_ipath, opt_ppath,opt_first, opt_nimages,
230 opt_step, opt_click_allowed, opt_display) ==
false) {
235 if (!opt_ipath.empty())
240 if (!opt_ipath.empty() && !env_ipath.empty() && opt_ppath.empty()) {
241 if (ipath != env_ipath) {
242 std::cout << std::endl
243 <<
"WARNING: " << std::endl;
244 std::cout <<
" Since -i <visp image path=" << ipath <<
"> "
245 <<
" is different from VISP_IMAGE_PATH=" << env_ipath << std::endl
246 <<
" we skip the environment variable." << std::endl;
251 if (opt_ipath.empty() && env_ipath.empty() && opt_ppath.empty() ){
252 usage(argv[0], NULL, ipath, opt_ppath, opt_first, opt_nimages, opt_step);
253 std::cerr << std::endl
254 <<
"ERROR:" << std::endl;
255 std::cerr <<
" Use -i <visp image path> option or set VISP_INPUT_IMAGE_PATH "
257 <<
" environment variable to specify the location of the " << std::endl
258 <<
" image path where test images are located." << std::endl
259 <<
" Use -p <personal image path> option if you want to "<<std::endl
260 <<
" use personal images." << std::endl
271 unsigned iter = opt_first;
272 std::ostringstream s;
273 char cfilename[FILENAME_MAX];
275 if (opt_ppath.empty()){
295 s.setf(std::ios::right, std::ios::adjustfield);
296 s <<
"image." << std::setw(4) << std::setfill(
'0') << iter <<
".pgm";
301 sprintf(cfilename,opt_ppath.c_str(), iter) ;
302 filename = cfilename;
312 vpCTRACE <<
"Load: " << filename << std::endl;
322 std::cerr << std::endl
323 <<
"ERROR:" << std::endl;
324 std::cerr <<
" Cannot read " << filename << std::endl;
325 std::cerr <<
" Check your -i " << ipath <<
" option " << std::endl
326 <<
" or VISP_INPUT_IMAGE_PATH environment variable."
332 #if defined VISP_HAVE_X11
334 #elif defined VISP_HAVE_GTK
336 #elif defined VISP_HAVE_GDI
338 #elif defined VISP_HAVE_OPENCV
344 display.
init(I, 100, 100,
"Display...") ;
387 if (opt_display && opt_click_allowed) {
388 std::cout <<
"Click on a dot to track it."<< std::endl;
398 std::cout <<
"COG: " << std::endl;
400 std::cout <<
" u: " << cog.
get_u() <<
" v: " << cog.
get_v()
403 std::cout <<
"Size:" << std::endl;
405 std::cout <<
"Area: " << d.
getArea() << std::endl;
406 std::cout <<
"Moments:" << std::endl;
407 std::cout <<
" m00: " << d.
m00 << std::endl;
408 std::cout <<
" m10: " << d.
m10 << std::endl;
409 std::cout <<
" m01: " << d.
m01 << std::endl;
410 std::cout <<
" m11: " << d.
m11 << std::endl;
411 std::cout <<
" m02: " << d.
m02 << std::endl;
412 std::cout <<
" m20: " << d.
m20 << std::endl;
413 std::cout <<
"Centered moments:" << std::endl;
414 std::cout <<
" mu11: " << d.
mu11 << std::endl;
415 std::cout <<
" mu02: " << d.
mu02 << std::endl;
416 std::cout <<
" mu20: " << d.
mu20 << std::endl;
417 std::cout <<
"Settings:" << std::endl;
424 while (iter < opt_first + opt_nimages*opt_step) {
426 if (opt_ppath.empty()){
428 s <<
"image." << std::setw(4) << std::setfill(
'0') << iter <<
".pgm";
432 sprintf(cfilename, opt_ppath.c_str(), iter) ;
433 filename = cfilename;
436 std::cout <<
"read : " << filename << std::endl;
450 std::cout <<
"Tracking on image: " << filename << std::endl;
457 std::cout <<
" u: " << cog.
get_u() <<
" v: " << cog.
get_v()
460 std::cout <<
"Size:" << std::endl;
462 std::cout <<
"Area: " << d.
getArea() << std::endl;
463 std::cout <<
"Moments:" << std::endl;
464 std::cout <<
" m00: " << d.
m00 << std::endl;
465 std::cout <<
" m10: " << d.
m10 << std::endl;
466 std::cout <<
" m01: " << d.
m01 << std::endl;
467 std::cout <<
" m11: " << d.
m11 << std::endl;
468 std::cout <<
" m02: " << d.
m02 << std::endl;
469 std::cout <<
" m20: " << d.
m20 << std::endl;
470 std::cout <<
"Centered moments:" << std::endl;
471 std::cout <<
" mu11: " << d.
mu11 << std::endl;
472 std::cout <<
" mu02: " << d.
mu02 << std::endl;
473 std::cout <<
" mu20: " << d.
mu20 << std::endl;
474 std::cout <<
"Settings:" << std::endl;
483 std::list<vpImagePoint> edges;
485 std::list<vpImagePoint>::const_iterator it;
486 for(it = edges.begin(); it != edges.end(); ++it) {
501 if (opt_display && opt_click_allowed) {
502 std::cout <<
"\nA click to exit..." << std::endl;
509 std::cout <<
"Catch an exception: " << e << std::endl;
517 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)
Display for windows using GDI (available on any windows 32 platform).
double getGrayLevelPrecision() const
Define the X11 console to display images.
error that can be emited by ViSP classes.
static double measureTimeMs()
static const vpColor green
This tracker is meant to track a blob (connex pixels with same gray level) on a vpImage.
void track(const vpImage< unsigned char > &I)
static void flush(const vpImage< unsigned char > &I)
double getSizePrecision() const
static bool parse(int *argcPtr, const char **argv, vpArgvInfo *argTable, int flags)
vpImagePoint getCog() const
void setGrayLevelPrecision(const double &grayLevelPrecision)
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)
The vpDisplayGTK allows to display image using the GTK+ library version 1.2.
unsigned int getGrayLevelMin() const
void setComputeMoments(const bool activate)
void initTracking(const vpImage< unsigned char > &I, unsigned int size=0)
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)
unsigned int getGrayLevelMax() const
void setGraphics(const bool activate)
virtual void displayPoint(const vpImagePoint &ip, const vpColor &color)=0
void getEdges(std::list< vpImagePoint > &edges_list) const
static const vpColor blue