52 #include <visp3/core/vpDebug.h>
53 #include <visp3/core/vpConfig.h>
60 #if defined(VISP_HAVE_MODULE_BLOB) && (defined (VISP_HAVE_X11) || defined(VISP_HAVE_GTK) || defined(VISP_HAVE_GDI) || defined(VISP_HAVE_OPENCV))
62 #include <visp3/core/vpImage.h>
63 #include <visp3/io/vpImageIo.h>
64 #include <visp3/core/vpImagePoint.h>
65 #include <visp3/gui/vpDisplayX.h>
66 #include <visp3/gui/vpDisplayGTK.h>
67 #include <visp3/gui/vpDisplayGDI.h>
68 #include <visp3/gui/vpDisplayOpenCV.h>
69 #include <visp3/blob/vpDot.h>
70 #include <visp3/io/vpParseArgv.h>
71 #include <visp3/core/vpIoTools.h>
74 #define GETOPTARGS "cdf:i:n:p:s:h"
76 void usage(
const char *name,
const char *badparam, std::string ipath, std::string ppath,
77 unsigned first,
unsigned nimages,
unsigned step);
78 bool getOptions(
int argc,
const char **argv, std::string &ipath, std::string &ppath,
unsigned &first,
79 unsigned &nimages,
unsigned &step,
bool &click_allowed,
bool &display);
94 void usage(
const char *name,
const char *badparam, std::string ipath, std::string ppath,
95 unsigned first,
unsigned nimages,
unsigned step)
101 %s [-i <test image path>] [-p <personal image path>]\n\
102 [-f <first image>] [-n <number of images>] [-s <step>]\n\
103 [-c] [-d] [-h]\n", name);
107 -i <input image path> %s\n\
108 Set image input path.\n\
109 From this path read images \n\
110 \"ViSP-images/mire-2/image.%%04d.pgm\". These \n\
111 images come from ViSP-images-x.y.z.tar.gz available \n\
112 on the ViSP website.\n\
113 Setting the VISP_INPUT_IMAGE_PATH environment\n\
114 variable produces the same behaviour than using\n\
117 -p <personal image path> %s\n\
118 Specify a personal sequence containing images \n\
120 By image sequence, we mean one file per image.\n\
121 The following image file formats PNM (PGM P5, PPM P6)\n\
122 are supported. The format is selected by analysing \n\
123 the filename extension.\n\
124 Example : \"C:/Temp/ViSP-images/cube/image.%%04d.pgm\"\n\
125 %%04d is for the image numbering.\n\
127 -f <first image> %u\n\
128 First image number of the sequence.\n\
130 -n <number of images> %u\n\
131 Number of images to load from the sequence.\n\
134 Step between two images.\n\
137 Disable the mouse click. Useful to automaze the \n\
138 execution of this program without humain intervention.\n\
141 Turn off the display.\n\
145 ipath.c_str(), ppath.c_str(), first, nimages, step);
148 fprintf(stdout,
"\nERROR: Bad parameter [%s]\n", badparam);
167 bool getOptions(
int argc,
const char **argv, std::string &ipath, std::string &ppath,
unsigned &first,
168 unsigned &nimages,
unsigned &step,
bool &click_allowed,
bool &display)
175 case 'c': click_allowed =
false;
break;
176 case 'd': display =
false;
break;
177 case 'i': ipath = optarg_;
break;
178 case 'p': ppath = optarg_;
break;
179 case 'f': first = (unsigned) atoi(optarg_);
break;
180 case 'n': nimages = (unsigned) atoi(optarg_);
break;
181 case 's': step = (unsigned) atoi(optarg_);
break;
182 case 'h': usage(argv[0], NULL, ipath, ppath, first, nimages, step);
186 usage(argv[0], optarg_, ipath, ppath, first, nimages, step);
191 if ((c == 1) || (c == -1)) {
193 usage(argv[0], NULL, ipath, ppath, first, nimages, step);
194 std::cerr <<
"ERROR: " << std::endl;
195 std::cerr <<
" Bad argument " << optarg_ << std::endl << std::endl;
204 main(
int argc,
const char ** argv)
207 std::string env_ipath;
208 std::string opt_ipath;
210 std::string opt_ppath;
212 std::string filename;
213 unsigned opt_first = 1;
214 unsigned opt_nimages = 500;
215 unsigned opt_step = 1;
216 bool opt_click_allowed =
true;
217 bool opt_display =
true;
223 if (! env_ipath.empty())
227 if (getOptions(argc, argv, opt_ipath, opt_ppath,opt_first, opt_nimages,
228 opt_step, opt_click_allowed, opt_display) ==
false) {
233 if (!opt_ipath.empty())
238 if (!opt_ipath.empty() && !env_ipath.empty() && opt_ppath.empty()) {
239 if (ipath != env_ipath) {
240 std::cout << std::endl
241 <<
"WARNING: " << std::endl;
242 std::cout <<
" Since -i <visp image path=" << ipath <<
"> "
243 <<
" is different from VISP_IMAGE_PATH=" << env_ipath << std::endl
244 <<
" we skip the environment variable." << std::endl;
249 if (opt_ipath.empty() && env_ipath.empty() && opt_ppath.empty() ){
250 usage(argv[0], NULL, ipath, opt_ppath, opt_first, opt_nimages, opt_step);
251 std::cerr << std::endl
252 <<
"ERROR:" << std::endl;
253 std::cerr <<
" Use -i <visp image path> option or set VISP_INPUT_IMAGE_PATH "
255 <<
" environment variable to specify the location of the " << std::endl
256 <<
" image path where test images are located." << std::endl
257 <<
" Use -p <personal image path> option if you want to "<<std::endl
258 <<
" use personal images." << std::endl
269 unsigned iter = opt_first;
270 std::ostringstream s;
271 char cfilename[FILENAME_MAX];
273 if (opt_ppath.empty()){
293 s.setf(std::ios::right, std::ios::adjustfield);
294 s <<
"image." << std::setw(4) << std::setfill(
'0') << iter <<
".pgm";
299 sprintf(cfilename,opt_ppath.c_str(), iter) ;
300 filename = cfilename;
310 vpCTRACE <<
"Load: " << filename << std::endl;
320 std::cerr << std::endl
321 <<
"ERROR:" << std::endl;
322 std::cerr <<
" Cannot read " << filename << std::endl;
323 std::cerr <<
" Check your -i " << ipath <<
" option " << std::endl
324 <<
" or VISP_INPUT_IMAGE_PATH environment variable."
330 #if defined VISP_HAVE_X11
332 #elif defined VISP_HAVE_GTK
334 #elif defined VISP_HAVE_GDI
336 #elif defined VISP_HAVE_OPENCV
342 display.
init(I, 100, 100,
"Display...") ;
368 if (opt_display && opt_click_allowed) {
372 std::cout <<
"Click on a white dot you want to track..." << std::endl;
386 while (iter < opt_first + opt_nimages*opt_step) {
388 if (opt_ppath.empty()){
390 s <<
"image." << std::setw(4) << std::setfill(
'0') << iter <<
".pgm";
394 sprintf(cfilename, opt_ppath.c_str(), iter) ;
395 filename = cfilename;
398 std::cout <<
"read : " << filename << std::endl;
405 std::cout <<
"Tracking on image: " << filename << std::endl;
414 std::cout << cog.
get_u() <<
" " << cog.
get_v()
417 std::cout <<
"Size:" << std::endl;
419 std::cout <<
"Moments:" << std::endl;
420 std::cout <<
" m00: " << d.
m00 << std::endl;
421 std::cout <<
" m10: " << d.
m10 << std::endl;
422 std::cout <<
" m01: " << d.
m01 << std::endl;
423 std::cout <<
" m11: " << d.
m11 << std::endl;
424 std::cout <<
" m02: " << d.
m02 << std::endl;
425 std::cout <<
" m20: " << d.
m20 << std::endl;
426 std::cout <<
"Centered moments:" << std::endl;
427 std::cout <<
" mu11: " << d.
mu11 << std::endl;
428 std::cout <<
" mu02: " << d.
mu02 << std::endl;
429 std::cout <<
" mu20: " << d.
mu20 << std::endl;
432 std::list<vpImagePoint> edges = d.
getEdges();
433 std::list<vpImagePoint>::const_iterator it;
434 for(it = edges.begin(); it != edges.end(); ++it) {
450 if (opt_display && opt_click_allowed) {
451 std::cout <<
"\nA click to exit..." << std::endl;
458 std::cout <<
"Catch an exception: " << e << std::endl;
467 std::cout <<
"visp_blob module or X11, GTK, GDI or OpenCV display functionalities are required..." << std::endl;
static bool getClick(const vpImage< unsigned char > &I, bool blocking=true)
void setConnexity(vpConnexityType type)
unsigned int getHeight() const
Display for windows using GDI (available on any windows 32 platform).
Use the X11 console to display images on unix-like OS. Thus to enable this class X11 should be instal...
void track(const vpImage< unsigned char > &I)
error that can be emited by ViSP classes.
void init(vpImage< unsigned char > &I, int winx=-1, int winy=-1, const std::string &title="")
static void displayPoint(const vpImage< unsigned char > &I, const vpImagePoint &ip, const vpColor &color, unsigned int thickness=1)
static void flush(const vpImage< unsigned char > &I)
VISP_EXPORT double measureTimeMs()
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. Thus to enable this class OpenC...
void set_v(const double v)
unsigned int getWidth() const
The vpDisplayGTK allows to display image using the GTK 3rd party library. Thus to enable this class G...
static void displayCross(const vpImage< unsigned char > &I, const vpImagePoint &ip, unsigned int size, const vpColor &color, unsigned int thickness=1)
static void read(vpImage< unsigned char > &I, const std::string &filename)
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)
Class that defines a 2D point in an image. This class is useful for image processing and stores only ...
void initTracking(const vpImage< unsigned char > &I)
static const vpColor blue